draft-ietf-httpbis-cache-05.txt | draft-ietf-httpbis-cache-06.txt | |||
---|---|---|---|---|
HTTP Working Group R. Fielding, Ed. | HTTP Working Group R. Fielding, Ed. | |||
Internet-Draft Adobe | Internet-Draft Adobe | |||
Obsoletes: 7234 (if approved) M. Nottingham, Ed. | Obsoletes: 7234 (if approved) M. Nottingham, Ed. | |||
Intended status: Standards Track Fastly | Intended status: Standards Track Fastly | |||
Expires: January 9, 2020 J. Reschke, Ed. | Expires: May 7, 2020 J. Reschke, Ed. | |||
greenbytes | greenbytes | |||
July 8, 2019 | November 4, 2019 | |||
HTTP Caching | HTTP Caching | |||
draft-ietf-httpbis-cache-05 | draft-ietf-httpbis-cache-06 | |||
Abstract | Abstract | |||
The Hypertext Transfer Protocol (HTTP) is a stateless application- | The Hypertext Transfer Protocol (HTTP) is a stateless application- | |||
level protocol for distributed, collaborative, hypertext information | level protocol for distributed, collaborative, hypertext information | |||
systems. This document defines HTTP caches and the associated header | systems. This document defines HTTP caches and the associated header | |||
fields that control cache behavior or indicate cacheable response | fields that control cache behavior or indicate cacheable response | |||
messages. | messages. | |||
This document obsoletes RFC 7234. | This document obsoletes RFC 7234. | |||
skipping to change at page 1, line 36 ¶ | skipping to change at page 1, line 36 ¶ | |||
This note is to be removed before publishing as an RFC. | This note is to be removed before publishing as an RFC. | |||
Discussion of this draft takes place on the HTTP working group | Discussion of this draft takes place on the HTTP working group | |||
mailing list (ietf-http-wg@w3.org), which is archived at | mailing list (ietf-http-wg@w3.org), which is archived at | |||
<https://lists.w3.org/Archives/Public/ietf-http-wg/>. | <https://lists.w3.org/Archives/Public/ietf-http-wg/>. | |||
Working Group information can be found at <https://httpwg.org/>; | Working Group information can be found at <https://httpwg.org/>; | |||
source code and issues list for this draft can be found at | source code and issues list for this draft can be found at | |||
<https://github.com/httpwg/http-core>. | <https://github.com/httpwg/http-core>. | |||
The changes in this draft are summarized in Appendix C.6. | The changes in this draft are summarized in Appendix C.7. | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on January 9, 2020. | This Internet-Draft will expire on May 7, 2020. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2019 IETF Trust and the persons identified as the | Copyright (c) 2019 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
skipping to change at page 2, line 41 ¶ | skipping to change at page 2, line 41 ¶ | |||
outside the IETF Standards Process, and derivative works of it may | outside the IETF Standards Process, and derivative works of it may | |||
not be created outside the IETF Standards Process, except to format | not be created outside the IETF Standards Process, except to format | |||
it for publication as an RFC or to translate it into languages other | it for publication as an RFC or to translate it into languages other | |||
than English. | than English. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
1.1. Requirements Notation . . . . . . . . . . . . . . . . . . 5 | 1.1. Requirements Notation . . . . . . . . . . . . . . . . . . 5 | |||
1.2. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 5 | 1.2. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 5 | |||
1.3. Delta Seconds . . . . . . . . . . . . . . . . . . . . . . 5 | 1.3. Delta Seconds . . . . . . . . . . . . . . . . . . . . . . 6 | |||
2. Overview of Cache Operation . . . . . . . . . . . . . . . . . 6 | 2. Overview of Cache Operation . . . . . . . . . . . . . . . . . 6 | |||
3. Storing Responses in Caches . . . . . . . . . . . . . . . . . 7 | 3. Storing Responses in Caches . . . . . . . . . . . . . . . . . 7 | |||
3.1. Storing Incomplete Responses . . . . . . . . . . . . . . 8 | 3.1. Storing Incomplete Responses . . . . . . . . . . . . . . 8 | |||
3.2. Storing Responses to Authenticated Requests . . . . . . . 8 | 3.2. Storing Responses to Authenticated Requests . . . . . . . 9 | |||
3.3. Combining Partial Content . . . . . . . . . . . . . . . . 9 | 3.3. Combining Partial Content . . . . . . . . . . . . . . . . 9 | |||
4. Constructing Responses from Caches . . . . . . . . . . . . . 9 | 4. Constructing Responses from Caches . . . . . . . . . . . . . 9 | |||
4.1. Calculating Secondary Keys with Vary . . . . . . . . . . 10 | 4.1. Calculating Cache Keys with Vary . . . . . . . . . . . . 10 | |||
4.2. Freshness . . . . . . . . . . . . . . . . . . . . . . . . 11 | 4.2. Freshness . . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
4.2.1. Calculating Freshness Lifetime . . . . . . . . . . . 13 | 4.2.1. Calculating Freshness Lifetime . . . . . . . . . . . 13 | |||
4.2.2. Calculating Heuristic Freshness . . . . . . . . . . . 13 | 4.2.2. Calculating Heuristic Freshness . . . . . . . . . . . 14 | |||
4.2.3. Calculating Age . . . . . . . . . . . . . . . . . . . 14 | 4.2.3. Calculating Age . . . . . . . . . . . . . . . . . . . 14 | |||
4.2.4. Serving Stale Responses . . . . . . . . . . . . . . . 15 | 4.2.4. Serving Stale Responses . . . . . . . . . . . . . . . 16 | |||
4.3. Validation . . . . . . . . . . . . . . . . . . . . . . . 16 | 4.3. Validation . . . . . . . . . . . . . . . . . . . . . . . 16 | |||
4.3.1. Sending a Validation Request . . . . . . . . . . . . 16 | 4.3.1. Sending a Validation Request . . . . . . . . . . . . 16 | |||
4.3.2. Handling a Received Validation Request . . . . . . . 17 | 4.3.2. Handling a Received Validation Request . . . . . . . 17 | |||
4.3.3. Handling a Validation Response . . . . . . . . . . . 18 | 4.3.3. Handling a Validation Response . . . . . . . . . . . 19 | |||
4.3.4. Freshening Stored Responses upon Validation . . . . . 18 | 4.3.4. Freshening Stored Responses upon Validation . . . . . 19 | |||
4.3.5. Freshening Responses with HEAD . . . . . . . . . . . 19 | 4.3.5. Freshening Responses with HEAD . . . . . . . . . . . 20 | |||
4.4. Invalidation . . . . . . . . . . . . . . . . . . . . . . 20 | 4.4. Invalidation . . . . . . . . . . . . . . . . . . . . . . 20 | |||
5. Header Field Definitions . . . . . . . . . . . . . . . . . . 20 | 5. Header Field Definitions . . . . . . . . . . . . . . . . . . 21 | |||
5.1. Age . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 | 5.1. Age . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 | |||
5.2. Cache-Control . . . . . . . . . . . . . . . . . . . . . . 21 | 5.2. Cache-Control . . . . . . . . . . . . . . . . . . . . . . 22 | |||
5.2.1. Request Cache-Control Directives . . . . . . . . . . 22 | 5.2.1. Request Cache-Control Directives . . . . . . . . . . 23 | |||
5.2.1.1. max-age . . . . . . . . . . . . . . . . . . . . . 22 | 5.2.1.1. max-age . . . . . . . . . . . . . . . . . . . . . 23 | |||
5.2.1.2. max-stale . . . . . . . . . . . . . . . . . . . . 23 | 5.2.1.2. max-stale . . . . . . . . . . . . . . . . . . . . 23 | |||
5.2.1.3. min-fresh . . . . . . . . . . . . . . . . . . . . 23 | 5.2.1.3. min-fresh . . . . . . . . . . . . . . . . . . . . 24 | |||
5.2.1.4. no-cache . . . . . . . . . . . . . . . . . . . . 23 | 5.2.1.4. no-cache . . . . . . . . . . . . . . . . . . . . 24 | |||
5.2.1.5. no-store . . . . . . . . . . . . . . . . . . . . 24 | 5.2.1.5. no-store . . . . . . . . . . . . . . . . . . . . 24 | |||
5.2.1.6. no-transform . . . . . . . . . . . . . . . . . . 24 | 5.2.1.6. no-transform . . . . . . . . . . . . . . . . . . 25 | |||
5.2.1.7. only-if-cached . . . . . . . . . . . . . . . . . 24 | 5.2.1.7. only-if-cached . . . . . . . . . . . . . . . . . 25 | |||
5.2.2. Response Cache-Control Directives . . . . . . . . . . 24 | 5.2.2. Response Cache-Control Directives . . . . . . . . . . 25 | |||
5.2.2.1. must-revalidate . . . . . . . . . . . . . . . . . 24 | 5.2.2.1. must-revalidate . . . . . . . . . . . . . . . . . 25 | |||
5.2.2.2. no-cache . . . . . . . . . . . . . . . . . . . . 25 | 5.2.2.2. no-cache . . . . . . . . . . . . . . . . . . . . 26 | |||
5.2.2.3. no-store . . . . . . . . . . . . . . . . . . . . 26 | 5.2.2.3. no-store . . . . . . . . . . . . . . . . . . . . 26 | |||
5.2.2.4. no-transform . . . . . . . . . . . . . . . . . . 26 | 5.2.2.4. no-transform . . . . . . . . . . . . . . . . . . 27 | |||
5.2.2.5. public . . . . . . . . . . . . . . . . . . . . . 26 | 5.2.2.5. public . . . . . . . . . . . . . . . . . . . . . 27 | |||
5.2.2.6. private . . . . . . . . . . . . . . . . . . . . . 26 | 5.2.2.6. private . . . . . . . . . . . . . . . . . . . . . 27 | |||
5.2.2.7. proxy-revalidate . . . . . . . . . . . . . . . . 27 | 5.2.2.7. proxy-revalidate . . . . . . . . . . . . . . . . 28 | |||
5.2.2.8. max-age . . . . . . . . . . . . . . . . . . . . . 27 | 5.2.2.8. max-age . . . . . . . . . . . . . . . . . . . . . 28 | |||
5.2.2.9. s-maxage . . . . . . . . . . . . . . . . . . . . 27 | 5.2.2.9. s-maxage . . . . . . . . . . . . . . . . . . . . 28 | |||
5.2.3. Cache Control Extensions . . . . . . . . . . . . . . 28 | 5.2.3. Cache Control Extensions . . . . . . . . . . . . . . 29 | |||
5.2.4. Cache Directive Registry . . . . . . . . . . . . . . 29 | 5.2.4. Cache Directive Registry . . . . . . . . . . . . . . 30 | |||
5.3. Expires . . . . . . . . . . . . . . . . . . . . . . . . . 29 | 5.3. Expires . . . . . . . . . . . . . . . . . . . . . . . . . 30 | |||
5.4. Pragma . . . . . . . . . . . . . . . . . . . . . . . . . 30 | 5.4. Pragma . . . . . . . . . . . . . . . . . . . . . . . . . 31 | |||
5.5. Warning . . . . . . . . . . . . . . . . . . . . . . . . . 30 | 5.5. Warning . . . . . . . . . . . . . . . . . . . . . . . . . 31 | |||
6. Relationship to Applications . . . . . . . . . . . . . . . . 30 | 6. Relationship to Applications . . . . . . . . . . . . . . . . 31 | |||
7. Security Considerations . . . . . . . . . . . . . . . . . . . 31 | 7. Security Considerations . . . . . . . . . . . . . . . . . . . 32 | |||
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 32 | 7.1. Cache Poisoning . . . . . . . . . . . . . . . . . . . . . 32 | |||
8.1. Header Field Registration . . . . . . . . . . . . . . . . 32 | 7.2. Timing Attacks . . . . . . . . . . . . . . . . . . . . . 32 | |||
8.2. Cache Directive Registration . . . . . . . . . . . . . . 32 | 7.3. Caching of Sensitive Information . . . . . . . . . . . . 33 | |||
8.3. Warn Code Registry . . . . . . . . . . . . . . . . . . . 32 | 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 33 | |||
9. References . . . . . . . . . . . . . . . . . . . . . . . . . 32 | 8.1. Header Field Registration . . . . . . . . . . . . . . . . 33 | |||
9.1. Normative References . . . . . . . . . . . . . . . . . . 32 | 8.2. Cache Directive Registration . . . . . . . . . . . . . . 33 | |||
9.2. Informative References . . . . . . . . . . . . . . . . . 33 | 8.3. Warn Code Registry . . . . . . . . . . . . . . . . . . . 33 | |||
Appendix A. Collected ABNF . . . . . . . . . . . . . . . . . . . 35 | 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 33 | |||
Appendix B. Changes from RFC 7234 . . . . . . . . . . . . . . . 35 | 9.1. Normative References . . . . . . . . . . . . . . . . . . 33 | |||
Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 35 | 9.2. Informative References . . . . . . . . . . . . . . . . . 34 | |||
C.1. Between RFC7234 and draft 00 . . . . . . . . . . . . . . 35 | Appendix A. Collected ABNF . . . . . . . . . . . . . . . . . . . 36 | |||
C.2. Since draft-ietf-httpbis-cache-00 . . . . . . . . . . . . 36 | Appendix B. Changes from RFC 7234 . . . . . . . . . . . . . . . 36 | |||
C.3. Since draft-ietf-httpbis-cache-01 . . . . . . . . . . . . 36 | Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 36 | |||
C.4. Since draft-ietf-httpbis-cache-02 . . . . . . . . . . . . 36 | C.1. Between RFC7234 and draft 00 . . . . . . . . . . . . . . 36 | |||
C.5. Since draft-ietf-httpbis-cache-03 . . . . . . . . . . . . 37 | C.2. Since draft-ietf-httpbis-cache-00 . . . . . . . . . . . . 37 | |||
C.6. Since draft-ietf-httpbis-cache-04 . . . . . . . . . . . . 37 | C.3. Since draft-ietf-httpbis-cache-01 . . . . . . . . . . . . 37 | |||
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 | C.4. Since draft-ietf-httpbis-cache-02 . . . . . . . . . . . . 37 | |||
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 39 | C.5. Since draft-ietf-httpbis-cache-03 . . . . . . . . . . . . 38 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 39 | C.6. Since draft-ietf-httpbis-cache-04 . . . . . . . . . . . . 38 | |||
C.7. Since draft-ietf-httpbis-cache-05 . . . . . . . . . . . . 38 | ||||
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 | ||||
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 40 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 40 | ||||
1. Introduction | 1. Introduction | |||
The Hypertext Transfer Protocol (HTTP) is a stateless application- | The Hypertext Transfer Protocol (HTTP) is a stateless application- | |||
level request/response protocol that uses extensible semantics and | level request/response protocol that uses extensible semantics and | |||
self-descriptive messages for flexible interaction with network-based | self-descriptive messages for flexible interaction with network-based | |||
hypertext information systems. HTTP is defined by a series of | hypertext information systems. HTTP is defined by a series of | |||
documents that collectively form the HTTP/1.1 specification: | documents that collectively form the HTTP/1.1 specification: | |||
o "HTTP Semantics" [Semantics] | o "HTTP Semantics" [Semantics] | |||
skipping to change at page 5, line 26 ¶ | skipping to change at page 5, line 30 ¶ | |||
Conformance criteria and considerations regarding error handling are | Conformance criteria and considerations regarding error handling are | |||
defined in Section 3 of [Semantics]. | defined in Section 3 of [Semantics]. | |||
1.2. Syntax Notation | 1.2. Syntax Notation | |||
This specification uses the Augmented Backus-Naur Form (ABNF) | This specification uses the Augmented Backus-Naur Form (ABNF) | |||
notation of [RFC5234], extended with the notation for case- | notation of [RFC5234], extended with the notation for case- | |||
sensitivity in strings defined in [RFC7405]. | sensitivity in strings defined in [RFC7405]. | |||
It also uses a list extension, defined in Section 11 of [Semantics], | It also uses a list extension, defined in Section 12 of [Semantics], | |||
that allows for compact definition of comma-separated lists using a | that allows for compact definition of comma-separated lists using a | |||
'#' operator (similar to how the '*' operator indicates repetition). | '#' operator (similar to how the '*' operator indicates repetition). | |||
Appendix A shows the collected grammar with all list operators | Appendix A shows the collected grammar with all list operators | |||
expanded to standard ABNF notation. | expanded to standard ABNF notation. | |||
The following core rules are included by reference, as defined in | The following core rules are included by reference, as defined in | |||
[RFC5234], Appendix B.1: ALPHA (letters), CR (carriage return), CRLF | [RFC5234], Appendix B.1: ALPHA (letters), CR (carriage return), CRLF | |||
(CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double quote), | (CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double quote), | |||
HEXDIG (hexadecimal 0-9/A-F/a-f), HTAB (horizontal tab), LF (line | HEXDIG (hexadecimal 0-9/A-F/a-f), HTAB (horizontal tab), LF (line | |||
feed), OCTET (any 8-bit sequence of data), SP (space), and VCHAR (any | feed), OCTET (any 8-bit sequence of data), SP (space), and VCHAR (any | |||
visible [USASCII] character). | visible [USASCII] character). | |||
The rules below are defined in [Semantics]: | The rules below are defined in [Semantics]: | |||
HTTP-date = <HTTP-date, see [Semantics], Section 10.1.1.1> | HTTP-date = <HTTP-date, see [Semantics], Section 10.1.1.1> | |||
OWS = <OWS, see [Semantics], Section 4.3> | OWS = <OWS, see [Semantics], Section 11.1> | |||
field-name = <field-name, see [Semantics], Section 4.2> | field-name = <field-name, see [Semantics], Section 4.1> | |||
quoted-string = <quoted-string, see [Semantics], Section 4.2.3> | quoted-string = <quoted-string, see [Semantics], Section 4.2.3.2> | |||
token = <token, see [Semantics], Section 4.2.3> | token = <token, see [Semantics], Section 4.2.3.1> | |||
1.3. Delta Seconds | 1.3. Delta Seconds | |||
The delta-seconds rule specifies a non-negative integer, representing | The delta-seconds rule specifies a non-negative integer, representing | |||
time in seconds. | time in seconds. | |||
delta-seconds = 1*DIGIT | delta-seconds = 1*DIGIT | |||
A recipient parsing a delta-seconds value and converting it to binary | A recipient parsing a delta-seconds value and converting it to binary | |||
form ought to use an arithmetic type of at least 31 bits of non- | form ought to use an arithmetic type of at least 31 bits of non- | |||
skipping to change at page 6, line 36 ¶ | skipping to change at page 6, line 41 ¶ | |||
Proper cache operation preserves the semantics of HTTP transfers | Proper cache operation preserves the semantics of HTTP transfers | |||
([Semantics]) while reducing the transfer of information already held | ([Semantics]) while reducing the transfer of information already held | |||
in the cache. Although caching is an entirely OPTIONAL feature of | in the cache. Although caching is an entirely OPTIONAL feature of | |||
HTTP, it can be assumed that reusing a cached response is desirable | HTTP, it can be assumed that reusing a cached response is desirable | |||
and that such reuse is the default behavior when no requirement or | and that such reuse is the default behavior when no requirement or | |||
local configuration prevents it. Therefore, HTTP cache requirements | local configuration prevents it. Therefore, HTTP cache requirements | |||
are focused on preventing a cache from either storing a non-reusable | are focused on preventing a cache from either storing a non-reusable | |||
response or reusing a stored response inappropriately, rather than | response or reusing a stored response inappropriately, rather than | |||
mandating that caches always store and reuse particular responses. | mandating that caches always store and reuse particular responses. | |||
Each cache entry consists of a cache key and one or more HTTP | The base cache key consists of the request method and target URI used | |||
responses corresponding to prior requests that used the same key. | to retrieve the stored response; the method determines under which | |||
The most common form of cache entry is a successful result of a | circumstances that response can be used to satisfy a request. | |||
retrieval request: i.e., a 200 (OK) response to a GET request, which | However, many HTTP caches in common use today only cache GET | |||
contains a representation of the resource identified by the request | responses, and therefore only use the URI as the cache key, | |||
target (Section 7.3.1 of [Semantics]). However, it is also possible | forwarding other methods. | |||
to cache permanent redirects, negative results (e.g., 404 (Not | ||||
Found)), incomplete results (e.g., 206 (Partial Content)), and | ||||
responses to methods other than GET if the method's definition allows | ||||
such caching and defines something suitable for use as a cache key. | ||||
The primary cache key consists of the request method and target URI. | If a request target is subject to content negotiation, the cache | |||
However, since HTTP caches in common use today are typically limited | might store multiple responses for it. Caches differentiate these | |||
to caching responses to GET, many caches simply decline other methods | responses by incorporating values of the original request's selecting | |||
and use only the URI as the primary cache key. | header fields into the cache key as well, as per Section 4.1. | |||
If a request target is subject to content negotiation, its cache | Furthermore, caches might incorporate additional material into the | |||
entry might consist of multiple stored responses, each differentiated | cache key. For example, user agent caches might include the | |||
by a secondary key for the values of the original request's selecting | referring site's identity, thereby "double keying" the cache to avoid | |||
header fields (Section 4.1). | some privacy risks (see Section 7.2). | |||
Most commonly, caches store the successful result of a retrieval | ||||
request: i.e., a 200 (OK) response to a GET request, which contains a | ||||
representation of the resource identified by the request target | ||||
(Section 7.3.1 of [Semantics]). However, it is also possible to | ||||
store redirects, negative results (e.g., 404 (Not Found)), incomplete | ||||
results (e.g., 206 (Partial Content)), and responses to methods other | ||||
than GET if the method's definition allows such caching and defines | ||||
something suitable for use as a cache key. | ||||
A cache is disconnected when it cannot contact the origin server or | A cache is disconnected when it cannot contact the origin server or | |||
otherwise find a forward path for a given request. A disconnected | otherwise find a forward path for a given request. A disconnected | |||
cache can serve stale responses in some circumstances | cache can serve stale responses in some circumstances | |||
(Section 4.2.4). | (Section 4.2.4). | |||
3. Storing Responses in Caches | 3. Storing Responses in Caches | |||
A cache MUST NOT store a response to any request, unless: | A cache MUST NOT store a response to any request, unless: | |||
o The request method is understood by the cache and defined as being | o The request method is understood by the cache, and | |||
cacheable, and | ||||
o the response status code is final (see Section 9.3 of | o the response status code is final (see Section 9.3 of | |||
[Messaging]), and | [Messaging]), and | |||
o the response status code is understood by the cache, and | o the response status code is understood by the cache, and | |||
o the "no-store" cache directive (see Section 5.2) does not appear | o the "no-store" cache directive (see Section 5.2) does not appear | |||
in the response, and | in the response, and | |||
o the "private" response directive (see Section 5.2.2.6) does not | o the "private" response directive (see Section 5.2.2.6) does not | |||
skipping to change at page 7, line 42 ¶ | skipping to change at page 8, line 4 ¶ | |||
o the Authorization header field (see Section 8.5.3 of [Semantics]) | o the Authorization header field (see Section 8.5.3 of [Semantics]) | |||
does not appear in the request, if the cache is shared, unless the | does not appear in the request, if the cache is shared, unless the | |||
response explicitly allows it (see Section 3.2), and | response explicitly allows it (see Section 3.2), and | |||
o the response either: | o the response either: | |||
* contains an Expires header field (see Section 5.3), or | * contains an Expires header field (see Section 5.3), or | |||
* contains a max-age response directive (see Section 5.2.2.8), or | * contains a max-age response directive (see Section 5.2.2.8), or | |||
* contains a s-maxage response directive (see Section 5.2.2.9) | * contains a s-maxage response directive (see Section 5.2.2.9) | |||
and the cache is shared, or | and the cache is shared, or | |||
* contains a Cache Control Extension (see Section 5.2.3) that | * contains a Cache Control Extension (see Section 5.2.3) that | |||
allows it to be cached, or | allows it to be cached, or | |||
* has a status code that is defined as cacheable by default (see | * has a status code that is defined as heuristically cacheable | |||
Section 4.2.2), or | (see Section 4.2.2), or | |||
* contains a public response directive (see Section 5.2.2.5). | * contains a public response directive (see Section 5.2.2.5). | |||
Note that any of the requirements listed above can be overridden by a | Note that any of the requirements listed above can be overridden by a | |||
cache-control extension; see Section 5.2.3. | cache-control extension; see Section 5.2.3. | |||
In this context, a cache has "understood" a request method or a | In this context, a cache has "understood" a request method or a | |||
response status code if it recognizes it and implements all specified | response status code if it recognizes it and implements all specified | |||
caching-related behavior. | caching-related behavior. | |||
Note that, in normal operation, some caches will not store a response | Note that, in normal operation, some caches will not store a response | |||
that has neither a cache validator nor an explicit expiration time, | that has neither a cache validator nor an explicit expiration time, | |||
as such responses are not usually useful to store. However, caches | as such responses are not usually useful to store. However, caches | |||
are not prohibited from storing such responses. | are not prohibited from storing such responses. | |||
3.1. Storing Incomplete Responses | 3.1. Storing Incomplete Responses | |||
A response message is considered complete when all of the octets | A response message is considered complete when all of the octets | |||
indicated by the message framing ([Messaging]) are received prior to | indicated by its framing are available. Note that, when no explicit | |||
the connection being closed. If the request method is GET, the | framing is provided, a response message that is ended by the | |||
response status code is 200 (OK), and the entire response header | connection's close is considered complete even though it might be | |||
section has been received, a cache MAY store an incomplete response | indistinguishable from an incomplete response (see [Messaging], | |||
message body if the cache entry is recorded as incomplete. Likewise, | Section 6.3). A cache SHOULD consider a close-terminated response | |||
a 206 (Partial Content) response MAY be stored as if it were an | incomplete if the connection termination is detected to be an error. | |||
incomplete 200 (OK) cache entry. However, a cache MUST NOT store | A server that wishes to avoid premature termination resulting in an | |||
incomplete or partial-content responses if it does not support the | incorrect cached response SHOULD send the response with explicit | |||
Range and Content-Range header fields or if it does not understand | framing. | |||
the range units used in those fields. | ||||
If the request method is GET, the response status code is 200 (OK), | ||||
and the entire response header section has been received, a cache MAY | ||||
store an incomplete response message body if the stored response is | ||||
recorded as incomplete. Likewise, a 206 (Partial Content) response | ||||
MAY be stored as if it were an incomplete 200 (OK) response. | ||||
However, a cache MUST NOT store incomplete or partial-content | ||||
responses if it does not support the Range and Content-Range header | ||||
fields or if it does not understand the range units used in those | ||||
fields. | ||||
A cache MAY complete a stored incomplete response by making a | A cache MAY complete a stored incomplete response by making a | |||
subsequent range request (Section 8.3 of [Semantics]) and combining | subsequent range request (Section 8.3 of [Semantics]) and combining | |||
the successful response with the stored entry, as defined in | the successful response with the stored response, as defined in | |||
Section 3.3. A cache MUST NOT use an incomplete response to answer | Section 3.3. A cache MUST NOT use an incomplete response to answer | |||
requests unless the response has been made complete or the request is | requests unless the response has been made complete or the request is | |||
partial and specifies a range that is wholly within the incomplete | partial and specifies a range that is wholly within the incomplete | |||
response. A cache MUST NOT send a partial response to a client | response. A cache MUST NOT send a partial response to a client | |||
without explicitly marking it as such using the 206 (Partial Content) | without explicitly marking it as such using the 206 (Partial Content) | |||
status code. | status code. | |||
3.2. Storing Responses to Authenticated Requests | 3.2. Storing Responses to Authenticated Requests | |||
A shared cache MUST NOT use a cached response to a request with an | A shared cache MUST NOT use a cached response to a request with an | |||
skipping to change at page 10, line 29 ¶ | skipping to change at page 10, line 44 ¶ | |||
responses; see Section 4.4. | responses; see Section 4.4. | |||
When more than one suitable response is stored, a cache MUST use the | When more than one suitable response is stored, a cache MUST use the | |||
most recent one (as determined by the Date header field). It can | most recent one (as determined by the Date header field). It can | |||
also forward the request with "Cache-Control: max-age=0" or "Cache- | also forward the request with "Cache-Control: max-age=0" or "Cache- | |||
Control: no-cache" to disambiguate which response to use. | Control: no-cache" to disambiguate which response to use. | |||
A cache that does not have a clock available MUST NOT use stored | A cache that does not have a clock available MUST NOT use stored | |||
responses without revalidating them upon every use. | responses without revalidating them upon every use. | |||
4.1. Calculating Secondary Keys with Vary | 4.1. Calculating Cache Keys with Vary | |||
When a cache receives a request that can be satisfied by a stored | When a cache receives a request that can be satisfied by a stored | |||
response that has a Vary header field (Section 10.1.4 of | response that has a Vary header field (Section 10.1.4 of | |||
[Semantics]), it MUST NOT use that response unless all of the | [Semantics]), it MUST NOT use that response unless all of the | |||
selecting header fields nominated by the Vary header field match in | selecting header fields nominated by the Vary header field match in | |||
both the original request (i.e., that associated with the stored | both the original request (i.e., that associated with the stored | |||
response), and the presented request. | response), and the presented request. | |||
The selecting header fields from two requests are defined to match if | The selecting header fields from two requests are defined to match if | |||
and only if those in the first request can be transformed to those in | and only if those in the first request can be transformed to those in | |||
skipping to change at page 11, line 22 ¶ | skipping to change at page 11, line 41 ¶ | |||
the selected response. | the selected response. | |||
If multiple selected responses are available (potentially including | If multiple selected responses are available (potentially including | |||
responses without a Vary header field), the cache will need to choose | responses without a Vary header field), the cache will need to choose | |||
one to use. When a selecting header field has a known mechanism for | one to use. When a selecting header field has a known mechanism for | |||
doing so (e.g., qvalues on Accept and similar request header fields), | doing so (e.g., qvalues on Accept and similar request header fields), | |||
that mechanism MAY be used to select preferred responses; of the | that mechanism MAY be used to select preferred responses; of the | |||
remainder, the most recent response (as determined by the Date header | remainder, the most recent response (as determined by the Date header | |||
field) is used, as per Section 4. | field) is used, as per Section 4. | |||
Note that in practice, some resources might send the Vary header | ||||
field on responses inconsistently. When a cache has multiple | ||||
responses for a given target URI, and one or more omits the Vary | ||||
header field, it SHOULD use the most recent non-empty value available | ||||
to select an appropriate response for the request. | ||||
If no selected response is available, the cache cannot satisfy the | If no selected response is available, the cache cannot satisfy the | |||
presented request. Typically, it is forwarded to the origin server | presented request. Typically, it is forwarded to the origin server | |||
in a (possibly conditional; see Section 4.3) request. | in a (possibly conditional; see Section 4.3) request. | |||
4.2. Freshness | 4.2. Freshness | |||
A fresh response is one whose age has not yet exceeded its freshness | A fresh response is one whose age has not yet exceeded its freshness | |||
lifetime. Conversely, a stale response is one where it has. | lifetime. Conversely, a stale response is one where it has. | |||
A response's freshness lifetime is the length of time between its | A response's freshness lifetime is the length of time between its | |||
skipping to change at page 13, line 46 ¶ | skipping to change at page 14, line 20 ¶ | |||
a cache MAY assign a heuristic expiration time when an explicit time | a cache MAY assign a heuristic expiration time when an explicit time | |||
is not specified, employing algorithms that use other header field | is not specified, employing algorithms that use other header field | |||
values (such as the Last-Modified time) to estimate a plausible | values (such as the Last-Modified time) to estimate a plausible | |||
expiration time. This specification does not provide specific | expiration time. This specification does not provide specific | |||
algorithms, but does impose worst-case constraints on their results. | algorithms, but does impose worst-case constraints on their results. | |||
A cache MUST NOT use heuristics to determine freshness when an | A cache MUST NOT use heuristics to determine freshness when an | |||
explicit expiration time is present in the stored response. Because | explicit expiration time is present in the stored response. Because | |||
of the requirements in Section 3, this means that, effectively, | of the requirements in Section 3, this means that, effectively, | |||
heuristics can only be used on responses without explicit freshness | heuristics can only be used on responses without explicit freshness | |||
whose status codes are defined as cacheable by default (see | whose status codes are defined as "heuristically cacheable" (e.g., | |||
Section 9.1 of [Semantics]), and those responses without explicit | see Section 9.1 of [Semantics]), and those responses without explicit | |||
freshness that have been marked as explicitly cacheable (e.g., with a | freshness that have been marked as explicitly cacheable (e.g., with a | |||
"public" response directive). | "public" response directive). | |||
Note that in previous specifications heuristically cacheable response | ||||
status codes were called "cacheable by default." | ||||
If the response has a Last-Modified header field (Section 10.2.2 of | If the response has a Last-Modified header field (Section 10.2.2 of | |||
[Semantics]), caches are encouraged to use a heuristic expiration | [Semantics]), caches are encouraged to use a heuristic expiration | |||
value that is no more than some fraction of the interval since that | value that is no more than some fraction of the interval since that | |||
time. A typical setting of this fraction might be 10%. | time. A typical setting of this fraction might be 10%. | |||
Note: Section 13.9 of [RFC2616] prohibited caches from calculating | Note: Section 13.9 of [RFC2616] prohibited caches from calculating | |||
heuristic freshness for URIs with query components (i.e., those | heuristic freshness for URIs with query components (i.e., those | |||
containing '?'). In practice, this has not been widely | containing '?'). In practice, this has not been widely | |||
implemented. Therefore, origin servers are encouraged to send | implemented. Therefore, origin servers are encouraged to send | |||
explicit directives (e.g., Cache-Control: no-cache) if they wish | explicit directives (e.g., Cache-Control: no-cache) if they wish | |||
skipping to change at page 16, line 23 ¶ | skipping to change at page 16, line 48 ¶ | |||
or to replace the stored response(s) with a new response. This | or to replace the stored response(s) with a new response. This | |||
process is known as "validating" or "revalidating" the stored | process is known as "validating" or "revalidating" the stored | |||
response. | response. | |||
4.3.1. Sending a Validation Request | 4.3.1. Sending a Validation Request | |||
When generating a conditional request for validation, a cache starts | When generating a conditional request for validation, a cache starts | |||
with either a request it is attempting to satisfy, or -- if it is | with either a request it is attempting to satisfy, or -- if it is | |||
initiating the request independently -- it synthesises a request | initiating the request independently -- it synthesises a request | |||
using a stored response by copying the method, request-target, and | using a stored response by copying the method, request-target, and | |||
request header fields used for identifying the secondary cache key | request header fields identified by the Vary header field | |||
Section 4.1. | Section 4.1. | |||
It then updates that request with one or more precondition header | It then updates that request with one or more precondition header | |||
fields. These contain validator metadata sourced from stored | fields. These contain validator metadata sourced from stored | |||
response(s) that have the same cache key (both primary and secondary, | response(s) that have the same cache key. | |||
as applicable). | ||||
The precondition header fields are then compared by recipients to | The precondition header fields are then compared by recipients to | |||
determine whether any stored response is equivalent to a current | determine whether any stored response is equivalent to a current | |||
representation of the resource. | representation of the resource. | |||
One such validator is the timestamp given in a Last-Modified header | One such validator is the timestamp given in a Last-Modified header | |||
field (Section 10.2.2 of [Semantics]), which can be used in an If- | field (Section 10.2.2 of [Semantics]), which can be used in an If- | |||
Modified-Since header field for response validation, or in an If- | Modified-Since header field for response validation, or in an If- | |||
Unmodified-Since or If-Range header field for representation | Unmodified-Since or If-Range header field for representation | |||
selection (i.e., the client is referring specifically to a previously | selection (i.e., the client is referring specifically to a previously | |||
skipping to change at page 26, line 39 ¶ | skipping to change at page 27, line 24 ¶ | |||
payload, as defined in Section 5.5.2 of [Semantics]. | payload, as defined in Section 5.5.2 of [Semantics]. | |||
5.2.2.5. public | 5.2.2.5. public | |||
The "public" response directive indicates that any cache MAY store | The "public" response directive indicates that any cache MAY store | |||
the response, even if the response would normally be non-cacheable or | the response, even if the response would normally be non-cacheable or | |||
cacheable only within a private cache. (See Section 3.2 for | cacheable only within a private cache. (See Section 3.2 for | |||
additional details related to the use of public in response to a | additional details related to the use of public in response to a | |||
request containing Authorization, and Section 3 for details of how | request containing Authorization, and Section 3 for details of how | |||
public affects responses that would normally not be stored, due to | public affects responses that would normally not be stored, due to | |||
their status codes not being defined as cacheable by default; see | their status codes not being defined as heuristically cacheable; see | |||
Section 4.2.2.) | Section 4.2.2.) | |||
5.2.2.6. private | 5.2.2.6. private | |||
Argument syntax: | Argument syntax: | |||
#field-name | #field-name | |||
The "private" response directive indicates that the response message | The "private" response directive indicates that the response message | |||
is intended for a single user and MUST NOT be stored by a shared | is intended for a single user and MUST NOT be stored by a shared | |||
skipping to change at page 31, line 35 ¶ | skipping to change at page 32, line 25 ¶ | |||
[Messaging] and semantics [Semantics]. | [Messaging] and semantics [Semantics]. | |||
Caches expose additional potential vulnerabilities, since the | Caches expose additional potential vulnerabilities, since the | |||
contents of the cache represent an attractive target for malicious | contents of the cache represent an attractive target for malicious | |||
exploitation. Because cache contents persist after an HTTP request | exploitation. Because cache contents persist after an HTTP request | |||
is complete, an attack on the cache can reveal information long after | is complete, an attack on the cache can reveal information long after | |||
a user believes that the information has been removed from the | a user believes that the information has been removed from the | |||
network. Therefore, cache contents need to be protected as sensitive | network. Therefore, cache contents need to be protected as sensitive | |||
information. | information. | |||
In particular, various attacks might be amplified by being stored in | 7.1. Cache Poisoning | |||
a shared cache; such "cache poisoning" attacks use the cache to | ||||
distribute a malicious payload to many clients, and are especially | Various attacks might be amplified by being stored in a shared cache. | |||
effective when an attacker can use implementation flaws, elevated | Such "cache poisoning" attacks use the cache to distribute a | |||
privileges, or other techniques to insert such a response into a | malicious payload to many clients, and are especially effective when | |||
cache. One common attack vector for cache poisoning is to exploit | an attacker can use implementation flaws, elevated privileges, or | |||
other techniques to insert such a response into a cache. | ||||
One common attack vector for cache poisoning is to exploit | ||||
differences in message parsing on proxies and in user agents; see | differences in message parsing on proxies and in user agents; see | |||
Section 6.3 of [Messaging] for the relevant requirements. | Section 6.3 of [Messaging] for the relevant requirements regarding | |||
HTTP/1.1. | ||||
Likewise, implementation flaws (as well as misunderstanding of cache | 7.2. Timing Attacks | |||
operation) might lead to caching of sensitive information (e.g., | ||||
authentication credentials) that is thought to be private, exposing | ||||
it to unauthorized parties. | ||||
Furthermore, the very use of a cache can bring about privacy | Because one of the primary uses of a cache is to optimise | |||
concerns. For example, if two users share a cache, and the first one | performance, its use can "leak" information about what resources have | |||
browses to a site, the second may be able to detect that the other | been previously requested. | |||
has been to that site, because the resources from it load more | ||||
quickly, thanks to the cache. | For example, if a user visits a site and their browser caches some of | |||
its responses, and then navigates to a second site, that site can | ||||
attempt to load responses that it knows exists on the first site. If | ||||
they load very quickly, it can be assumed that the user has visited | ||||
that site, or even a specific page on it. | ||||
Such "timing attacks" can be mitigated by adding more information to | ||||
the cache key, such as the identity of the referring site (to prevent | ||||
the attack described above). This is sometimes called "double | ||||
keying." | ||||
7.3. Caching of Sensitive Information | ||||
Implementation and deployment flaws (as well as misunderstanding of | ||||
cache operation) might lead to caching of sensitive information | ||||
(e.g., authentication credentials) that is thought to be private, | ||||
exposing it to unauthorized parties. | ||||
Note that the Set-Cookie response header field [RFC6265] does not | Note that the Set-Cookie response header field [RFC6265] does not | |||
inhibit caching; a cacheable response with a Set-Cookie header field | inhibit caching; a cacheable response with a Set-Cookie header field | |||
can be (and often is) used to satisfy subsequent requests to caches. | can be (and often is) used to satisfy subsequent requests to caches. | |||
Servers who wish to control caching of these responses are encouraged | Servers who wish to control caching of these responses are encouraged | |||
to emit appropriate Cache-Control response header fields. | to emit appropriate Cache-Control response header fields. | |||
8. IANA Considerations | 8. IANA Considerations | |||
The change controller for the following registrations is: "IETF | The change controller for the following registrations is: "IETF | |||
skipping to change at page 32, line 43 ¶ | skipping to change at page 33, line 50 ¶ | |||
Please add a note to the "Hypertext Transfer Protocol (HTTP) Warn | Please add a note to the "Hypertext Transfer Protocol (HTTP) Warn | |||
Codes" registry at <https://www.iana.org/assignments/http-warn-codes> | Codes" registry at <https://www.iana.org/assignments/http-warn-codes> | |||
to the effect that Warning is obsoleted. | to the effect that Warning is obsoleted. | |||
9. References | 9. References | |||
9.1. Normative References | 9.1. Normative References | |||
[Messaging] | [Messaging] | |||
Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
Ed., "HTTP/1.1 Messaging", draft-ietf-httpbis-messaging-05 | Ed., "HTTP/1.1 Messaging", draft-ietf-httpbis-messaging-06 | |||
(work in progress), July 2019. | (work in progress), November 2019. | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | |||
Resource Identifier (URI): Generic Syntax", STD 66, | Resource Identifier (URI): Generic Syntax", STD 66, | |||
RFC 3986, DOI 10.17487/RFC3986, January 2005, | RFC 3986, DOI 10.17487/RFC3986, January 2005, | |||
<https://www.rfc-editor.org/info/rfc3986>. | <https://www.rfc-editor.org/info/rfc3986>. | |||
skipping to change at page 33, line 21 ¶ | skipping to change at page 34, line 26 ¶ | |||
Specifications: ABNF", STD 68, RFC 5234, | Specifications: ABNF", STD 68, RFC 5234, | |||
DOI 10.17487/RFC5234, January 2008, | DOI 10.17487/RFC5234, January 2008, | |||
<https://www.rfc-editor.org/info/rfc5234>. | <https://www.rfc-editor.org/info/rfc5234>. | |||
[RFC7405] Kyzivat, P., "Case-Sensitive String Support in ABNF", | [RFC7405] Kyzivat, P., "Case-Sensitive String Support in ABNF", | |||
RFC 7405, DOI 10.17487/RFC7405, December 2014, | RFC 7405, DOI 10.17487/RFC7405, December 2014, | |||
<https://www.rfc-editor.org/info/rfc7405>. | <https://www.rfc-editor.org/info/rfc7405>. | |||
[Semantics] | [Semantics] | |||
Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
Ed., "HTTP Semantics", draft-ietf-httpbis-semantics-05 | Ed., "HTTP Semantics", draft-ietf-httpbis-semantics-06 | |||
(work in progress), July 2019. | (work in progress), November 2019. | |||
[USASCII] American National Standards Institute, "Coded Character | [USASCII] American National Standards Institute, "Coded Character | |||
Set -- 7-bit American Standard Code for Information | Set -- 7-bit American Standard Code for Information | |||
Interchange", ANSI X3.4, 1986. | Interchange", ANSI X3.4, 1986. | |||
9.2. Informative References | 9.2. Informative References | |||
[RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., | [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., | |||
Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext | Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext | |||
Transfer Protocol -- HTTP/1.1", RFC 2616, | Transfer Protocol -- HTTP/1.1", RFC 2616, | |||
skipping to change at page 35, line 8 ¶ | skipping to change at page 36, line 8 ¶ | |||
<https://www.rfc-editor.org/info/rfc7234>. | <https://www.rfc-editor.org/info/rfc7234>. | |||
[RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | |||
Writing an IANA Considerations Section in RFCs", BCP 26, | Writing an IANA Considerations Section in RFCs", BCP 26, | |||
RFC 8126, DOI 10.17487/RFC8126, June 2017, | RFC 8126, DOI 10.17487/RFC8126, June 2017, | |||
<https://www.rfc-editor.org/info/rfc8126>. | <https://www.rfc-editor.org/info/rfc8126>. | |||
Appendix A. Collected ABNF | Appendix A. Collected ABNF | |||
In the collected ABNF below, list rules are expanded as per | In the collected ABNF below, list rules are expanded as per | |||
Section 11 of [Semantics]. | Section 12 of [Semantics]. | |||
Age = delta-seconds | Age = delta-seconds | |||
Cache-Control = [ cache-directive ] *( OWS "," OWS [ cache-directive | Cache-Control = [ cache-directive ] *( OWS "," OWS [ cache-directive | |||
] ) | ] ) | |||
Expires = HTTP-date | Expires = HTTP-date | |||
HTTP-date = <HTTP-date, see [Semantics], Section 10.1.1.1> | HTTP-date = <HTTP-date, see [Semantics], Section 10.1.1.1> | |||
skipping to change at page 37, line 33 ¶ | skipping to change at page 38, line 33 ¶ | |||
o In Section 3.2 and Section 5.2.2, note effect of some directives | o In Section 3.2 and Section 5.2.2, note effect of some directives | |||
on authenticated requests (<https://github.com/httpwg/http-core/ | on authenticated requests (<https://github.com/httpwg/http-core/ | |||
issues/161>) | issues/161>) | |||
C.6. Since draft-ietf-httpbis-cache-04 | C.6. Since draft-ietf-httpbis-cache-04 | |||
o In Section 5.2, remove the registrations for stale-if-error and | o In Section 5.2, remove the registrations for stale-if-error and | |||
stale-while-revalidate which happened in RFC 7234 | stale-while-revalidate which happened in RFC 7234 | |||
(<https://github.com/httpwg/http-core/issues/207>) | (<https://github.com/httpwg/http-core/issues/207>) | |||
C.7. Since draft-ietf-httpbis-cache-05 | ||||
o In Section 3.1, clarify how weakly framed content is considered | ||||
for purposes of completeness (<https://github.com/httpwg/http- | ||||
core/issues/25>) | ||||
o Througout, describe Vary and cache key operations more clearly | ||||
(<https://github.com/httpwg/http-core/issues/28>) | ||||
o In Section 3, remove concept of "cacheable methods" in favor of | ||||
prose (<https://github.com/httpwg/http-core/issues/54>) | ||||
o Refactored Section 7, and added a section on timing attacks | ||||
(<https://github.com/httpwg/http-core/issues/233>) | ||||
o Changed "cacheable by default" to "heuristically cacheable" | ||||
throughout (<https://github.com/httpwg/http-core/issues/242>) | ||||
Index | Index | |||
A | A | |||
Age header field 21 | Age header field 21 | |||
age 11 | age 12 | |||
C | C | |||
Cache-Control header field 21 | Cache-Control header field 22 | |||
cache 4 | cache 4 | |||
cache entry 6 | ||||
cache key 6 | cache key 6 | |||
E | E | |||
Expires header field 29 | Expires header field 30 | |||
explicit expiration time 11 | explicit expiration time 12 | |||
F | F | |||
fresh 11 | fresh 12 | |||
freshness lifetime 11 | freshness lifetime 12 | |||
G | G | |||
Grammar | Grammar | |||
Age 21 | Age 21 | |||
ALPHA 5 | ALPHA 5 | |||
Cache-Control 22 | Cache-Control 22 | |||
cache-directive 22 | cache-directive 22 | |||
CR 5 | CR 5 | |||
CRLF 5 | CRLF 5 | |||
CTL 5 | CTL 5 | |||
delta-seconds 6 | delta-seconds 6 | |||
DIGIT 5 | DIGIT 5 | |||
DQUOTE 5 | DQUOTE 5 | |||
Expires 29 | Expires 30 | |||
HEXDIG 5 | HEXDIG 5 | |||
HTAB 5 | HTAB 5 | |||
LF 5 | LF 5 | |||
OCTET 5 | OCTET 5 | |||
SP 5 | SP 5 | |||
VCHAR 5 | VCHAR 5 | |||
H | H | |||
heuristic expiration time 11 | heuristic expiration time 12 | |||
heuristically cacheable 14 | ||||
M | M | |||
max-age (cache directive) 22, 27 | max-age (cache directive) 23, 28 | |||
max-stale (cache directive) 23 | max-stale (cache directive) 23 | |||
min-fresh (cache directive) 23 | min-fresh (cache directive) 24 | |||
must-revalidate (cache directive) 24 | must-revalidate (cache directive) 25 | |||
N | N | |||
no-cache (cache directive) 23, 25 | no-cache (cache directive) 24, 26 | |||
no-store (cache directive) 24, 26 | no-store (cache directive) 24, 26 | |||
no-transform (cache directive) 24, 26 | no-transform (cache directive) 25, 27 | |||
O | O | |||
only-if-cached (cache directive) 24 | only-if-cached (cache directive) 25 | |||
P | P | |||
Pragma header field 30 | Pragma header field 31 | |||
private (cache directive) 26 | private (cache directive) 27 | |||
private cache 4 | private cache 4 | |||
proxy-revalidate (cache directive) 27 | proxy-revalidate (cache directive) 28 | |||
public (cache directive) 26 | public (cache directive) 27 | |||
S | S | |||
s-maxage (cache directive) 27 | s-maxage (cache directive) 28 | |||
shared cache 4 | shared cache 4 | |||
stale 11 | stale 12 | |||
strong validator 19 | strong validator 19 | |||
V | V | |||
validator 16 | validator 16 | |||
W | W | |||
Warning header field 30 | Warning header field 31 | |||
Acknowledgments | Acknowledgments | |||
See Appendix "Acknowledgments" of [Semantics]. | See Appendix "Acknowledgments" of [Semantics]. | |||
Authors' Addresses | Authors' Addresses | |||
Roy T. Fielding (editor) | Roy T. Fielding (editor) | |||
Adobe | Adobe | |||
345 Park Ave | 345 Park Ave | |||
San Jose, CA 95110 | San Jose, CA 95110 | |||
USA | United States of America | |||
EMail: fielding@gbiv.com | EMail: fielding@gbiv.com | |||
URI: https://roy.gbiv.com/ | URI: https://roy.gbiv.com/ | |||
Mark Nottingham (editor) | Mark Nottingham (editor) | |||
Fastly | Fastly | |||
EMail: mnot@mnot.net | EMail: mnot@mnot.net | |||
URI: https://www.mnot.net/ | URI: https://www.mnot.net/ | |||
Julian F. Reschke (editor) | Julian F. Reschke (editor) | |||
greenbytes GmbH | greenbytes GmbH | |||
Hafenweg 16 | Hafenweg 16 | |||
Muenster, NW 48155 | Muenster 48155 | |||
Germany | Germany | |||
EMail: julian.reschke@greenbytes.de | EMail: julian.reschke@greenbytes.de | |||
URI: https://greenbytes.de/tech/webdav/ | URI: https://greenbytes.de/tech/webdav/ | |||
End of changes. 61 change blocks. | ||||
149 lines changed or deleted | 207 lines changed or added | |||
This html diff was produced by rfcdiff 1.46. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |