Как правильно отправлять обратно заголовки кеша для статических изображений, обслуживаемых Ktor?
У меня следующая настройка Ktor:
In my main
:
embeddedServer(
Netty,
watchPaths = listOf("module"),
module = Application::module,
port = if (ENV.env == LOCAL) {
8080
} else {
80
}
).apply {
start(wait = true)
}
а затем вне основного:
fun Application.module() {
if (ENV.env != LOCAL) {
install(ForwardedHeaderSupport)
install(XForwardedHeaderSupport)
install(HttpsRedirect)
}
install(CachingHeaders) {
options { outgoingContent ->
when (outgoingContent.contentType?.withoutParameters()) {
ContentType.Image.Any -> CachingOptions(CacheControl.MaxAge(maxAgeSeconds = 30 * 24 * 60 * 60))
else -> null
}
}
}
install(Compression) {
gzip {
priority = 1.0
}
deflate {
priority = 10.0
minimumSize(1024) // condition
}
}
routing {
static("/js/") {
resources("/js/")
}
static("/css/") {
resources("/css/")
}
static("/favicons") {
resources("/favicons/")
}
static("/img/") {
resources("/static/img/")
resources("/static/images/")
resources("/background/")
resources("/logos/")
resources("/icons/")
}
}
}
Однако изображения возвращаются без заголовков кеширования, есть идеи?
Обновление:
Изменение ContentType.Image.Any
на ContentType.Image.JPEG
, похоже, работает. Глядя на исходный код Image
, кажется, что он соответствует ContentType (image
, *
), но вообще не соответствует ни одному типу изображения.
install(CachingHeaders) {
options { outgoingContent ->
when (outgoingContent.contentType?.withoutParameters()) {
ContentType.Image.JPEG -> CachingOptions(
cacheControl = CacheControl.MaxAge(
mustRevalidate = false,
maxAgeSeconds = 30 * 24 * 60 * 60,
visibility = CacheControl.Visibility.Public
)
)
else -> null
}
}
}
Тем временем зарегистрировал ошибку: https://github.com/ktorio/ktor/issues/1366