Conditional Headers
The ConditionalHeaders feature avoids sending the body of content if it has not changed since the last request. This is achieved by using the following headers:
The
Last-Modified
response header contains a resource modification time. For example, if the client request contains theIf-Modified-Since
value, Ktor will send a full response only if a resource has been modified after the given date. Note that for static files Ktor appends theLast-Modified
header automatically after installingConditionalHeaders
.The
Etag
response header is an identifier for a specific resource version. For instance, if the client request contains theIf-None-Match
value, Ktor won’t send a full response in case this value matches theEtag
. You can specify theEtag
value when configuringConditionalHeaders
.
Install ConditionalHeaders
To install the ConditionalHeaders
feature, pass it to the install
function in the application initialization code. This can be the main
function …
import io.ktor.features.*
// ...
fun Application.main() {
install(ConditionalHeaders)
// ...
}
… or a specified module:
import io.ktor.features.*
// ...
fun Application.module() {
install(ConditionalHeaders)
// ...
}
Configure Headers
To configure ConditionalHeaders
, you need to call the version function inside the install
block. This function provides access to a list of resource versions for a given OutgoingContent. You can specify the required versions by using the EntityTagVersion and LastModifiedVersion class objects.
The code snippet below shows how to add a specified Etag
value for CSS:
install(ConditionalHeaders) {
version { outgoingContent ->
when (outgoingContent.contentType?.withoutParameters()) {
ContentType.Text.CSS -> listOf(EntityTagVersion("123abc"))
else -> emptyList()
}
}
}