[1] [[HTTP]] の [CODE(HTTP)@en[[[Cache-Control:]]]] [[頭欄]]の 
[DFN[[CODE(HTTP)@en[stale-while-revalidate]] [[指令]]]]は、
[[キャッシュ]]が[[腐敗]]しても[[再検証]]を裏で行ないつつ返却してもよい期間を示します。

* 仕様書

[REFS[
- [2] [[RFC 5861]] [CITE@en[HTTP Cache-Control Extensions for Stale Content]]
([[IETF情報提供RFC]]) <http://tools.ietf.org/html/rfc5861>
--[3] [CSECTION@en[3. The stale-while-revalidate Cache-Control Extension]]
]REFS]

* 文脈

[4] この[[キャッシュ指令]]は [[HTTP]] [[応答]]の [CODE(HTTP)@en[[[Cache-Control:]]]]
[[頭欄]]で使うことができます。

* 構文

[6] 
[PRE(ABNF code)[
     stale-while-revalidate = "stale-while-revalidate" "=" delta-seconds
]PRE]

* 処理モデル

[5] [[キャッシュ]]は、[[腐敗]]した後であっても指定された秒数、その[[応答]]を返却に利用して[['''構いません''']]。
[SRC[>>3]]

[7] >>5 の場合、[[腐敗]]した[[応答]]を返しつつも、その[[再検証]]を行おうと試みる[['''べきです''']]。
[SRC[>>3]]

[8] 指定された秒数が経過しても[[再検証]]が行えない場合には、他の条件による場合を除き、
その[[腐敗]]した[[応答]]を返すのはやめる[['''べきです''']]。 [SRC[>>3]]

;; [12] [[キャッシュ項目]]も参照。

* 関連

[9] [[腐敗]]している [[HTTP]] [[応答]]を返す際には [CODE(HTTP)@en[[[Warning]]]]
や非零の [CODE(HTTP)@en[[[Age]]]] が付くことになります。
[SRC[>>3]]

* 例

[10] [SRC[>>3]]
[PRE(HTTP example code)[
Cache-Control: max-age=600, stale-while-revalidate=30
]PRE]

[11] >>10 の場合、その[[応答]]は10分で[[腐敗]]しますが、[[腐敗]]しても30秒間は返却することができ、
またその30秒の間にあっては[[再検証]]もするべきです。

[13] [CITE@en[Add stale while revalidate handling]]
([[dtapuska]]著, [TIME[2019-05-03 21:57:03 +09:00]])
<https://github.com/whatwg/fetch/commit/49b92ee1ea34a212c63e0cdb96730d523bd15184>

[14] [CITE@en[Add support for stale-while-revalidate handling · Issue #852 · whatwg/fetch]]
([TIME[2019-12-06 14:26:30 +09:00]])
<https://github.com/whatwg/fetch/issues/852>

[15] [CITE@en[Add Stale While Revalidate Handling by dtapuska · Pull Request #853 · whatwg/fetch]]
([TIME[2019-12-06 14:26:59 +09:00]])
<https://github.com/whatwg/fetch/pull/853>