キャッシュヘッダーの操作

Estimated reading time: 1 minute

CachingOptions機能を使うと、Cache-ControlExpiresヘッダーを送信し、 クライアントやプロキシにリクエストを簡単にキャッシュさせることができます。

This feature is defined in the class io.ktor.features.CachingHeaders and no additional artifacts are required.

その他多くのFeatureと同じように、基本的な機能は初めからインストールされます。 しかし何かしらを行おうと思った場合は、 以下の例のようにoutputContentをCachingOptionsに変換するoptionsブロックを定義する必要があります:

install(CachingHeaders) {
    options { outgoingContent ->
        when (outgoingContent.contentType?.withoutParameters()) {
            ContentType.Text.CSS -> CachingOptions(CacheControl.MaxAge(maxAgeSeconds = 24 * 60 * 60))
            else -> null
        }
    }
}

options設定メソッドを使うと、引数として与えられたoutgoingContent: OutgoingContentから、 オプショナルでCachingOptionsを指定するコードを定義できます。 例えば、送信メッセージのContent-Typeを使い、どのCache-Controlが使われるのかを決めることができます。

CachingOptions, CacheControl

options高階関数を使うときCachingOptionを返すことで、CacheControlとあとオプションとして有効期限も示す必要があります:

data class CachingOptions(val cacheControl: CacheControl? = null, val expires: ZonedDateTime? = null)

sealed class CacheControl(val visibility: Visibility?) {
    enum class Visibility { Public, Private }
    
    class NoCache(visibility: Visibility?) : CacheControl(visibility)
    class NoStore(visibility: Visibility?) : CacheControl(visibility)
    class MaxAge(val maxAgeSeconds: Int, val proxyMaxAgeSeconds: Int? = null, val mustRevalidate: Boolean = false, val proxyRevalidate: Boolean = false, visibility: Visibility? = null) : CacheControl(visibility)
}

いくつかのOptionがある場合、マッチしたOptionごとにCache-Controlヘッダーを付与します。