| draft-ietf-httpbis-cache-17.txt | draft-ietf-httpbis-cache-18.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: 27 January 2022 J. Reschke, Ed. | Expires: 19 February 2022 J. Reschke, Ed. | |||
| greenbytes | greenbytes | |||
| 26 July 2021 | 18 August 2021 | |||
| HTTP Caching | HTTP Caching | |||
| draft-ietf-httpbis-cache-17 | draft-ietf-httpbis-cache-18 | |||
| 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.18. | The changes in this draft are summarized in Appendix C.19. | |||
| 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 27 January 2022. | This Internet-Draft will expire on 19 February 2022. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2021 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 (https://trustee.ietf.org/ | Provisions Relating to IETF Documents (https://trustee.ietf.org/ | |||
| license-info) in effect on the date of publication of this document. | license-info) in effect on the date of publication of this document. | |||
| Please review these documents carefully, as they describe your rights | Please review these documents carefully, as they describe your rights | |||
| skipping to change at page 3, line 10 ¶ | skipping to change at page 3, line 10 ¶ | |||
| 3.3. Storing Incomplete Responses . . . . . . . . . . . . . . 10 | 3.3. Storing Incomplete Responses . . . . . . . . . . . . . . 10 | |||
| 3.4. Combining Partial Content . . . . . . . . . . . . . . . . 11 | 3.4. Combining Partial Content . . . . . . . . . . . . . . . . 11 | |||
| 3.5. Storing Responses to Authenticated Requests . . . . . . . 11 | 3.5. Storing Responses to Authenticated Requests . . . . . . . 11 | |||
| 4. Constructing Responses from Caches . . . . . . . . . . . . . 11 | 4. Constructing Responses from Caches . . . . . . . . . . . . . 11 | |||
| 4.1. Calculating Cache Keys with the Vary Header Field . . . . 13 | 4.1. Calculating Cache Keys with the Vary Header Field . . . . 13 | |||
| 4.2. Freshness . . . . . . . . . . . . . . . . . . . . . . . . 14 | 4.2. Freshness . . . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 4.2.1. Calculating Freshness Lifetime . . . . . . . . . . . 15 | 4.2.1. Calculating Freshness Lifetime . . . . . . . . . . . 15 | |||
| 4.2.2. Calculating Heuristic Freshness . . . . . . . . . . . 16 | 4.2.2. Calculating Heuristic Freshness . . . . . . . . . . . 16 | |||
| 4.2.3. Calculating Age . . . . . . . . . . . . . . . . . . . 17 | 4.2.3. Calculating Age . . . . . . . . . . . . . . . . . . . 17 | |||
| 4.2.4. Serving Stale Responses . . . . . . . . . . . . . . . 18 | 4.2.4. Serving Stale Responses . . . . . . . . . . . . . . . 18 | |||
| 4.3. Validation . . . . . . . . . . . . . . . . . . . . . . . 19 | 4.3. Validation . . . . . . . . . . . . . . . . . . . . . . . 18 | |||
| 4.3.1. Sending a Validation Request . . . . . . . . . . . . 19 | 4.3.1. Sending a Validation Request . . . . . . . . . . . . 19 | |||
| 4.3.2. Handling a Received Validation Request . . . . . . . 20 | 4.3.2. Handling a Received Validation Request . . . . . . . 20 | |||
| 4.3.3. Handling a Validation Response . . . . . . . . . . . 21 | 4.3.3. Handling a Validation Response . . . . . . . . . . . 21 | |||
| 4.3.4. Freshening Stored Responses upon Validation . . . . . 21 | 4.3.4. Freshening Stored Responses upon Validation . . . . . 21 | |||
| 4.3.5. Freshening Responses with HEAD . . . . . . . . . . . 22 | 4.3.5. Freshening Responses with HEAD . . . . . . . . . . . 22 | |||
| 4.4. Invalidating Stored Responses . . . . . . . . . . . . . . 23 | 4.4. Invalidating Stored Responses . . . . . . . . . . . . . . 23 | |||
| 5. Field Definitions . . . . . . . . . . . . . . . . . . . . . . 24 | 5. Field Definitions . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 5.1. Age . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 | 5.1. Age . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 5.2. Cache-Control . . . . . . . . . . . . . . . . . . . . . . 24 | 5.2. Cache-Control . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 5.2.1. Request Cache-Control Directives . . . . . . . . . . 25 | 5.2.1. Request Cache-Control Directives . . . . . . . . . . 25 | |||
| skipping to change at page 4, line 22 ¶ | skipping to change at page 4, line 22 ¶ | |||
| C.2. Since draft-ietf-httpbis-cache-00 . . . . . . . . . . . . 41 | C.2. Since draft-ietf-httpbis-cache-00 . . . . . . . . . . . . 41 | |||
| C.3. Since draft-ietf-httpbis-cache-01 . . . . . . . . . . . . 41 | C.3. Since draft-ietf-httpbis-cache-01 . . . . . . . . . . . . 41 | |||
| C.4. Since draft-ietf-httpbis-cache-02 . . . . . . . . . . . . 41 | C.4. Since draft-ietf-httpbis-cache-02 . . . . . . . . . . . . 41 | |||
| C.5. Since draft-ietf-httpbis-cache-03 . . . . . . . . . . . . 41 | C.5. Since draft-ietf-httpbis-cache-03 . . . . . . . . . . . . 41 | |||
| C.6. Since draft-ietf-httpbis-cache-04 . . . . . . . . . . . . 42 | C.6. Since draft-ietf-httpbis-cache-04 . . . . . . . . . . . . 42 | |||
| C.7. Since draft-ietf-httpbis-cache-05 . . . . . . . . . . . . 42 | C.7. Since draft-ietf-httpbis-cache-05 . . . . . . . . . . . . 42 | |||
| C.8. Since draft-ietf-httpbis-cache-06 . . . . . . . . . . . . 42 | C.8. Since draft-ietf-httpbis-cache-06 . . . . . . . . . . . . 42 | |||
| C.9. Since draft-ietf-httpbis-cache-07 . . . . . . . . . . . . 43 | C.9. Since draft-ietf-httpbis-cache-07 . . . . . . . . . . . . 43 | |||
| C.10. Since draft-ietf-httpbis-cache-08 . . . . . . . . . . . . 43 | C.10. Since draft-ietf-httpbis-cache-08 . . . . . . . . . . . . 43 | |||
| C.11. Since draft-ietf-httpbis-cache-09 . . . . . . . . . . . . 43 | C.11. Since draft-ietf-httpbis-cache-09 . . . . . . . . . . . . 43 | |||
| C.12. Since draft-ietf-httpbis-cache-10 . . . . . . . . . . . . 44 | C.12. Since draft-ietf-httpbis-cache-10 . . . . . . . . . . . . 43 | |||
| C.13. Since draft-ietf-httpbis-cache-11 . . . . . . . . . . . . 44 | C.13. Since draft-ietf-httpbis-cache-11 . . . . . . . . . . . . 44 | |||
| C.14. Since draft-ietf-httpbis-cache-12 . . . . . . . . . . . . 44 | C.14. Since draft-ietf-httpbis-cache-12 . . . . . . . . . . . . 44 | |||
| C.15. Since draft-ietf-httpbis-cache-13 . . . . . . . . . . . . 45 | C.15. Since draft-ietf-httpbis-cache-13 . . . . . . . . . . . . 45 | |||
| C.16. Since draft-ietf-httpbis-cache-14 . . . . . . . . . . . . 45 | C.16. Since draft-ietf-httpbis-cache-14 . . . . . . . . . . . . 45 | |||
| C.17. Since draft-ietf-httpbis-cache-15 . . . . . . . . . . . . 46 | C.17. Since draft-ietf-httpbis-cache-15 . . . . . . . . . . . . 46 | |||
| C.18. Since draft-ietf-httpbis-cache-16 . . . . . . . . . . . . 46 | C.18. Since draft-ietf-httpbis-cache-16 . . . . . . . . . . . . 46 | |||
| C.19. Since draft-ietf-httpbis-cache-17 . . . . . . . . . . . . 46 | ||||
| Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 46 | Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
| Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 | Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 48 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 48 | |||
| 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. It is typically used for distributed | hypertext information systems. It is typically used for distributed | |||
| information systems, where the use of response caches can improve | information systems, where the use of response caches can improve | |||
| performance. This document defines aspects of HTTP related to | performance. This document defines aspects of HTTP related to | |||
| skipping to change at page 6, line 50 ¶ | skipping to change at page 6, line 50 ¶ | |||
| concepts of HTTP. | concepts of HTTP. | |||
| Although caching is an entirely OPTIONAL feature of HTTP, it can be | Although caching is an entirely OPTIONAL feature of HTTP, it can be | |||
| assumed that reusing a cached response is desirable and that such | assumed that reusing a cached response is desirable and that such | |||
| reuse is the default behavior when no requirement or local | reuse is the default behavior when no requirement or local | |||
| configuration prevents it. Therefore, HTTP cache requirements are | configuration prevents it. Therefore, HTTP cache requirements are | |||
| focused on preventing a cache from either storing a non-reusable | 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. | |||
| The _cache key_ is the information a cache uses to select a response | The _cache key_ is the information a cache uses to choose a response | |||
| and is composed from, at a minimum, the request method and target URI | and is composed from, at a minimum, the request method and target URI | |||
| used to retrieve the stored response; the method determines under | used to retrieve the stored response; the method determines under | |||
| which circumstances that response can be used to satisfy a subsequent | which circumstances that response can be used to satisfy a subsequent | |||
| request. However, many HTTP caches in common use today only cache | request. However, many HTTP caches in common use today only cache | |||
| GET responses, and therefore only use the URI as the cache key, | GET responses, and therefore only use the URI as the cache key, | |||
| forwarding other methods. | forwarding other methods. | |||
| If a request target is subject to content negotiation, the cache | A cache might store multiple responses for a request target that is | |||
| might store multiple responses for it. Caches differentiate these | subject to content negotiation. Caches differentiate these responses | |||
| responses by incorporating values of the original request's selecting | by incorporating some of the original request's header fields into | |||
| header fields into the cache key as well, using information in the | the cache key as well, using information in the Vary response header | |||
| Vary response header field, as per Section 4.1. | field, as per Section 4.1. | |||
| Caches might incorporate additional material into the cache key. For | Caches might incorporate additional material into the cache key. For | |||
| example, user agent caches might include the referring site's | example, user agent caches might include the referring site's | |||
| identity, thereby "double keying" the cache to avoid some privacy | identity, thereby "double keying" the cache to avoid some privacy | |||
| risks (see Section 7.2). | risks (see Section 7.2). | |||
| Most commonly, caches store the successful result of a retrieval | Most commonly, caches store the successful result of a retrieval | |||
| request: i.e., a 200 (OK) response to a GET request, which contains a | request: i.e., a 200 (OK) response to a GET request, which contains a | |||
| representation of the target resource (Section 9.3.1 of [HTTP]). | representation of the target resource (Section 9.3.1 of [HTTP]). | |||
| However, it is also possible to store redirects, negative results | However, it is also possible to store redirects, negative results | |||
| skipping to change at page 11, line 44 ¶ | skipping to change at page 11, line 44 ¶ | |||
| When presented with a request, a cache MUST NOT reuse a stored | When presented with a request, a cache MUST NOT reuse a stored | |||
| response unless: | response unless: | |||
| * The presented target URI (Section 7.1 of [HTTP]) and that of the | * The presented target URI (Section 7.1 of [HTTP]) and that of the | |||
| stored response match, and | stored response match, and | |||
| * the request method associated with the stored response allows it | * the request method associated with the stored response allows it | |||
| to be used for the presented request, and | to be used for the presented request, and | |||
| * selecting header fields nominated by the stored response (if any) | * request header fields nominated by the stored response (if any) | |||
| match those presented (see Section 4.1), and | match those presented (see Section 4.1), and | |||
| * the stored response does not contain the no-cache cache directive | * the stored response does not contain the no-cache cache directive | |||
| (Section 5.2.2.4), unless it is successfully validated | (Section 5.2.2.4), unless it is successfully validated | |||
| (Section 4.3), and | (Section 4.3), and | |||
| * the stored response is either: | * the stored response is either: | |||
| - fresh (see Section 4.2), or | - fresh (see Section 4.2), or | |||
| skipping to change at page 12, line 42 ¶ | skipping to change at page 12, line 42 ¶ | |||
| network. However, note that if the response returned is not able to | network. However, note that if the response returned is not able to | |||
| be used for some or all of the collapsed requests, additional latency | be used for some or all of the collapsed requests, additional latency | |||
| might be introduced, because they will need to be forwarded to be | might be introduced, because they will need to be forwarded to be | |||
| satisfied. | satisfied. | |||
| 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 without a clock (Section 5.6.7 of [HTTP]) MUST revalidate | |||
| responses without revalidating them upon every use. | stored responses upon every use. | |||
| 4.1. Calculating Cache Keys with the Vary Header Field | 4.1. Calculating Cache Keys with the Vary Header Field | |||
| 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 and that stored response contains a Vary header field | response and that stored response contains a Vary header field | |||
| (Section 12.5.5 of [HTTP]), the cache MUST NOT use that stored | (Section 12.5.5 of [HTTP]), the cache MUST NOT use that stored | |||
| response without revalidation unless all the selecting header fields | response without revalidation unless all the presented request header | |||
| (nominated by that Vary field value) in the present request match | fields nominated by that Vary field value match those fields in the | |||
| those fields in the original request (i.e., the request that caused | original request (i.e., the request that caused the cached response | |||
| the cached response to be stored). | to be stored). | |||
| The selecting header fields from two requests are defined to match if | The header fields from two requests are defined to match if and only | |||
| and only if those in the first request can be transformed to those in | if those in the first request can be transformed to those in the | |||
| the second request by applying any of: | second request by applying any of: | |||
| * adding or removing whitespace, where allowed in the header field's | * adding or removing whitespace, where allowed in the header field's | |||
| syntax | syntax | |||
| * combining multiple header field lines with the same field name | * combining multiple header field lines with the same field name | |||
| (see Section 5.2 of [HTTP]) | (see Section 5.2 of [HTTP]) | |||
| * normalizing both header field values in a way that is known to | * normalizing both header field values in a way that is known to | |||
| have identical semantics, according to the header field's | have identical semantics, according to the header field's | |||
| specification (e.g., reordering field values when order is not | specification (e.g., reordering field values when order is not | |||
| significant; case-normalization, where values are defined to be | significant; case-normalization, where values are defined to be | |||
| case-insensitive) | case-insensitive) | |||
| If (after any normalization that might take place) a header field is | If (after any normalization that might take place) a header field is | |||
| absent from a request, it can only match another request if it is | absent from a request, it can only match another request if it is | |||
| also absent there. | also absent there. | |||
| A stored response with a Vary header field value containing a member | A stored response with a Vary header field value containing a member | |||
| "*" always fails to match. | "*" always fails to match. | |||
| The stored response with matching selecting header fields is known as | If multiple stored responses match, the cache will need to choose one | |||
| the _selected response_. | to use. When a nominated request header field has a known mechanism | |||
| for ranking preference (e.g., qvalues on Accept and similar request | ||||
| If multiple selected responses are available (potentially including | header fields), that mechanism MAY be used to choose a preferred | |||
| responses without a Vary header field), the cache will need to choose | response. If such a mechanism is not available, or leads to equally | |||
| one to use. When a selecting header field has a known mechanism for | preferred responses, the most recent response (as determined by the | |||
| doing so (e.g., qvalues on Accept and similar request header fields), | Date header field) is chosen, as per Section 4. | |||
| that mechanism MAY be used to select a preferred response. If such a | ||||
| mechanism is not available, or leads to equally preferred responses, | ||||
| the most recent response (as determined by the Date header field) is | ||||
| used, as per Section 4. | ||||
| Some resources mistakenly omit the Vary header field from their | Some resources mistakenly omit the Vary header field from their | |||
| default response (i.e., the one sent when no more preferable response | default response (i.e., the one sent when the request does not | |||
| is available), with the effect of selecting it for requests to that | express any preferences), with the effect of choosing it for | |||
| resource even when more preferable responses are available. When a | subsequent requests to that resource even when more preferable | |||
| cache has multiple responses for a target URI and one or more omits | responses are available. When a cache has multiple stored responses | |||
| the Vary header field, it SHOULD use the most recent (see | for a target URI and one or more omits the Vary header field, the | |||
| Section 4.2.3) valid Vary field value available to select an | cache SHOULD choose the most recent (see Section 4.2.3) stored | |||
| appropriate response for the request. | response with a valid Vary field value. | |||
| If no selected response is available, the cache cannot satisfy the | If no stored response matches, the cache cannot satisfy the presented | |||
| presented request. Typically, it is forwarded to the origin server | request. Typically, the request is forwarded to the origin server, | |||
| in a (possibly conditional; see Section 4.3) request. | potentially with preconditions added to describe what responses the | |||
| cache has already stored (Section 4.3). | ||||
| 4.2. Freshness | 4.2. Freshness | |||
| A _fresh_ response is one whose age has not yet exceeded its | A _fresh_ response is one whose age has not yet exceeded its | |||
| freshness lifetime. Conversely, a _stale_ response is one where it | freshness lifetime. Conversely, a _stale_ response is one where it | |||
| has. | 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 | |||
| generation by the origin server and its expiration time. An | generation by the origin server and its expiration time. An | |||
| _explicit expiration time_ is the time at which the origin server | _explicit expiration time_ is the time at which the origin server | |||
| skipping to change at page 15, line 52 ¶ | skipping to change at page 16, line 8 ¶ | |||
| * If the cache is shared and the s-maxage response directive | * If the cache is shared and the s-maxage response directive | |||
| (Section 5.2.2.10) is present, use its value, or | (Section 5.2.2.10) is present, use its value, or | |||
| * If the max-age response directive (Section 5.2.2.1) is present, | * If the max-age response directive (Section 5.2.2.1) is present, | |||
| use its value, or | use its value, or | |||
| * If the Expires response header field (Section 5.3) is present, use | * If the Expires response header field (Section 5.3) is present, use | |||
| its value minus the value of the Date response header field (using | its value minus the value of the Date response header field (using | |||
| the time the message was received if it is not present, as per | the time the message was received if it is not present, as per | |||
| Section 10.2.2 of [HTTP]), or | Section 6.6.1 of [HTTP]), or | |||
| * Otherwise, no explicit expiration time is present in the response. | * Otherwise, no explicit expiration time is present in the response. | |||
| A heuristic freshness lifetime might be applicable; see | A heuristic freshness lifetime might be applicable; see | |||
| Section 4.2.2. | Section 4.2.2. | |||
| Note that this calculation is intended to reduce clock skew by using | Note that this calculation is intended to reduce clock skew by using | |||
| the clock information provided by the origin server whenever | the clock information provided by the origin server whenever | |||
| possible. | possible. | |||
| When there is more than one value present for a given directive | When there is more than one value present for a given directive | |||
| skipping to change at page 17, line 30 ¶ | skipping to change at page 17, line 30 ¶ | |||
| been in transit along network paths. | been in transit along network paths. | |||
| Age calculation uses the following data: | Age calculation uses the following data: | |||
| _age_value_ The term "age_value" denotes the value of the Age header | _age_value_ The term "age_value" denotes the value of the Age header | |||
| field (Section 5.1), in a form appropriate for arithmetic | field (Section 5.1), in a form appropriate for arithmetic | |||
| operation; or 0, if not available. | operation; or 0, if not available. | |||
| _date_value_ The term "date_value" denotes the value of the Date | _date_value_ The term "date_value" denotes the value of the Date | |||
| header field, in a form appropriate for arithmetic operations. | header field, in a form appropriate for arithmetic operations. | |||
| See Section 10.2.2 of [HTTP] for the definition of the Date header | See Section 6.6.1 of [HTTP] for the definition of the Date header | |||
| field, and for requirements regarding responses without it. | field, and for requirements regarding responses without it. | |||
| _now_ The term "now" means "the current value of the clock at the | _now_ The term "now" means the current value of this | |||
| host performing the calculation". A host ought to use NTP | implementation's clock (Section 5.6.7 of [HTTP]). | |||
| ([RFC5905]) or some similar protocol to synchronize its clocks to | ||||
| Coordinated Universal Time. | ||||
| _request_time_ The current value of the clock at the host at the | _request_time_ The value of the clock at the time of the request | |||
| time the request resulting in the stored response was made. | that resulted in the stored response. | |||
| _response_time_ The current value of the clock at the host at the | _response_time_ The value of the clock at the time the response was | |||
| time the response was received. | received. | |||
| A response's age can be calculated in two entirely independent ways: | A response's age can be calculated in two entirely independent ways: | |||
| 1. the "apparent_age": response_time minus date_value, if the local | 1. the "apparent_age": response_time minus date_value, if the | |||
| clock is reasonably well synchronized to the origin server's | implementation's clock is reasonably well synchronized to the | |||
| clock. If the result is negative, the result is replaced by | origin server's clock. If the result is negative, the result is | |||
| zero. | replaced by zero. | |||
| 2. the "corrected_age_value", if all of the caches along the | 2. the "corrected_age_value", if all of the caches along the | |||
| response path implement HTTP/1.1 or greater. A cache MUST | response path implement HTTP/1.1 or greater. A cache MUST | |||
| interpret this value relative to the time the request was | interpret this value relative to the time the request was | |||
| initiated, not the time that the response was received. | initiated, not the time that the response was received. | |||
| apparent_age = max(0, response_time - date_value); | apparent_age = max(0, response_time - date_value); | |||
| response_delay = response_time - request_time; | response_delay = response_time - request_time; | |||
| corrected_age_value = age_value + response_delay; | corrected_age_value = age_value + response_delay; | |||
| skipping to change at page 19, line 9 ¶ | skipping to change at page 18, line 46 ¶ | |||
| A cache MUST NOT generate a stale response unless it is disconnected | A cache MUST NOT generate a stale response unless it is disconnected | |||
| or doing so is explicitly permitted by the client or origin server | or doing so is explicitly permitted by the client or origin server | |||
| (e.g., by the max-stale request directive in Section 5.2.1, by | (e.g., by the max-stale request directive in Section 5.2.1, by | |||
| extension directives such as those defined in [RFC5861], or by | extension directives such as those defined in [RFC5861], or by | |||
| configuration in accordance with an out-of-band contract). | configuration in accordance with an out-of-band contract). | |||
| 4.3. Validation | 4.3. Validation | |||
| When a cache has one or more stored responses for a requested URI, | When a cache has one or more stored responses for a requested URI, | |||
| but cannot serve any of them (e.g., because they are not fresh, or | but cannot serve any of them (e.g., because they are not fresh, or | |||
| one cannot be selected; see Section 4.1), it can use the conditional | one cannot be chosen; see Section 4.1), it can use the conditional | |||
| request mechanism (Section 13.1 of [HTTP]) in the forwarded request | request mechanism (Section 13.1 of [HTTP]) in the forwarded request | |||
| to give the next inbound server an opportunity to select a valid | to give the next inbound server an opportunity to choose a valid | |||
| stored response to use, updating the stored metadata in the process, | stored response to use, updating the stored metadata in the process, | |||
| 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 using | initiating the request independently - it synthesises a request using | |||
| a stored response by copying the method, target URI, and request | a stored response by copying the method, target URI, and request | |||
| header fields identified by the Vary header field (Section 4.1). | header fields identified by the Vary header field (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 URI. Typically, this will include | response(s) that have the same URI. Typically, this will include | |||
| only those stored responses(s) that have the same cache key, although | only those stored responses(s) that have the same cache key, although | |||
| a cache is allowed to validate a response that it cannot select with | a cache is allowed to validate a response that it cannot choose with | |||
| the request header fields it is sending (see Section 4.1). | the request header fields it is sending (see Section 4.1). | |||
| 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 8.8.2 of [HTTP]), which can be used in an If-Modified- | field (Section 8.8.2 of [HTTP]), which can be used in an If-Modified- | |||
| Since header field for response validation, or in an If-Unmodified- | Since header field for response validation, or in an If-Unmodified- | |||
| Since or If-Range header field for representation selection (i.e., | Since or If-Range header field for representation selection (i.e., | |||
| skipping to change at page 20, line 5 ¶ | skipping to change at page 19, line 39 ¶ | |||
| representation with that timestamp). | representation with that timestamp). | |||
| Another validator is the entity-tag given in an ETag field | Another validator is the entity-tag given in an ETag field | |||
| (Section 8.8.3 of [HTTP]). One or more entity-tags, indicating one | (Section 8.8.3 of [HTTP]). One or more entity-tags, indicating one | |||
| or more stored responses, can be used in an If-None-Match header | or more stored responses, can be used in an If-None-Match header | |||
| field for response validation, or in an If-Match or If-Range header | field for response validation, or in an If-Match or If-Range header | |||
| field for representation selection (i.e., the client is referring | field for representation selection (i.e., the client is referring | |||
| specifically to one or more previously obtained representations with | specifically to one or more previously obtained representations with | |||
| the listed entity-tags). | the listed entity-tags). | |||
| When generating a conditional request for validation, a cache: | ||||
| * MUST send the relevant entity-tags (using If-Match, If-None-Match, | ||||
| or If-Range) if the entity-tags were provided in the stored | ||||
| response(s) being validated. | ||||
| * SHOULD send the Last-Modified value (using If-Modified-Since) if | ||||
| the request is not for a subrange, a single stored response is | ||||
| being validated, and that response contains a Last-Modified value. | ||||
| * MAY send the Last-Modified value (using If-Unmodified-Since or If- | ||||
| Range) if the request is for a subrange, a single stored response | ||||
| is being validated, and that response contains only a Last- | ||||
| Modified value (not an entity-tag). | ||||
| In most cases, both validators are generated in cache validation | ||||
| requests, even when entity-tags are clearly superior, to allow old | ||||
| intermediaries that do not understand entity-tag preconditions to | ||||
| respond appropriately. | ||||
| 4.3.2. Handling a Received Validation Request | 4.3.2. Handling a Received Validation Request | |||
| Each client in the request chain may have its own cache, so it is | Each client in the request chain may have its own cache, so it is | |||
| common for a cache at an intermediary to receive conditional requests | common for a cache at an intermediary to receive conditional requests | |||
| from other (outbound) caches. Likewise, some user agents make use of | from other (outbound) caches. Likewise, some user agents make use of | |||
| conditional requests to limit data transfers to recently modified | conditional requests to limit data transfers to recently modified | |||
| representations or to complete the transfer of a partially retrieved | representations or to complete the transfer of a partially retrieved | |||
| representation. | representation. | |||
| If a cache receives a request that can be satisfied by reusing a | If a cache receives a request that can be satisfied by reusing a | |||
| stored 200 (OK) or 206 (Partial Content) response, as per Section 4, | stored 200 (OK) or 206 (Partial Content) response, as per Section 4, | |||
| the cache SHOULD evaluate any applicable conditional header field | the cache SHOULD evaluate any applicable conditional header field | |||
| preconditions received in that request with respect to the | preconditions received in that request with respect to the | |||
| corresponding validators contained within the selected response. | corresponding validators contained within the stored response. | |||
| A cache MUST NOT evaluate conditional header fields that only apply | A cache MUST NOT evaluate conditional header fields that only apply | |||
| to an origin server, occur in a request with semantics that cannot be | to an origin server, occur in a request with semantics that cannot be | |||
| satisfied with a cached response, or occur in a request with a target | satisfied with a cached response, or occur in a request with a target | |||
| resource for which it has no stored responses; such preconditions are | resource for which it has no stored responses; such preconditions are | |||
| likely intended for some other (inbound) server. | likely intended for some other (inbound) server. | |||
| The proper evaluation of conditional requests by a cache depends on | The proper evaluation of conditional requests by a cache depends on | |||
| the received precondition header fields and their precedence. In | the received precondition header fields and their precedence. In | |||
| summary, the If-Match and If-Unmodified-Since conditional header | summary, the If-Match and If-Unmodified-Since conditional header | |||
| fields are not applicable to a cache, and If-None-Match takes | fields are not applicable to a cache, and If-None-Match takes | |||
| precedence over If-Modified-Since. See Section 13.2.2 of [HTTP] for | precedence over If-Modified-Since. See Section 13.2.2 of [HTTP] for | |||
| a complete specification of precondition precedence. | a complete specification of precondition precedence. | |||
| A request containing an If-None-Match header field (Section 13.1.2 of | A request containing an If-None-Match header field (Section 13.1.2 of | |||
| [HTTP]) indicates that the client wants to validate one or more of | [HTTP]) indicates that the client wants to validate one or more of | |||
| its own stored responses in comparison to the stored response | its own stored responses in comparison to the stored response chosen | |||
| selected by the cache (as per Section 4). | by the cache (as per Section 4). | |||
| If an If-None-Match header field is not present, a request containing | If an If-None-Match header field is not present, a request containing | |||
| an If-Modified-Since header field (Section 13.1.3 of [HTTP]) | an If-Modified-Since header field (Section 13.1.3 of [HTTP]) | |||
| indicates that the client wants to validate one or more of its own | indicates that the client wants to validate one or more of its own | |||
| stored responses by modification date. | stored responses by modification date. | |||
| If a request contains an If-Modified-Since header field and the Last- | If a request contains an If-Modified-Since header field and the Last- | |||
| Modified header field is not present in a selected stored response, a | Modified header field is not present in a stored response, a cache | |||
| cache SHOULD use the stored response's Date field value (or, if no | SHOULD use the stored response's Date field value (or, if no Date | |||
| Date field is present, the time that the stored response was | field is present, the time that the stored response was received) to | |||
| received) to evaluate the conditional. | evaluate the conditional. | |||
| A cache that implements partial responses to range requests, as | A cache that implements partial responses to range requests, as | |||
| defined in Section 14.2 of [HTTP], also needs to evaluate a received | defined in Section 14.2 of [HTTP], also needs to evaluate a received | |||
| If-Range header field (Section 13.1.5 of [HTTP]) regarding its | If-Range header field (Section 13.1.5 of [HTTP]) with respect to the | |||
| selected stored response. | cache's chosen response. | |||
| When a cache decides to forward a request to revalidate its own | When a cache decides to forward a request to revalidate its own | |||
| stored responses for a request that contains an If-None-Match list of | stored responses for a request that contains an If-None-Match list of | |||
| entity-tags, the cache MAY combine the received list with a list of | entity-tags, the cache MAY combine the received list with a list of | |||
| entity-tags from its own stored set of responses (fresh or stale) and | entity-tags from its own stored set of responses (fresh or stale) and | |||
| send the union of the two lists as a replacement If-None-Match header | send the union of the two lists as a replacement If-None-Match header | |||
| field value in the forwarded request. If a stored response contains | field value in the forwarded request. If a stored response contains | |||
| only partial content, the cache MUST NOT include its entity-tag in | only partial content, the cache MUST NOT include its entity-tag in | |||
| the union unless the request is for a range that would be fully | the union unless the request is for a range that would be fully | |||
| satisfied by that partial stored response. If the response to the | satisfied by that partial stored response. If the response to the | |||
| skipping to change at page 21, line 48 ¶ | skipping to change at page 22, line 6 ¶ | |||
| stored response, subject to its constraints on doing so (see | stored response, subject to its constraints on doing so (see | |||
| Section 4.2.4), or retry the validation request. | Section 4.2.4), or retry the validation request. | |||
| 4.3.4. Freshening Stored Responses upon Validation | 4.3.4. Freshening Stored Responses upon Validation | |||
| When a cache receives a 304 (Not Modified) response, it needs to | When a cache receives a 304 (Not Modified) response, it needs to | |||
| identify stored responses that are suitable for updating with the new | identify stored responses that are suitable for updating with the new | |||
| information provided, and then do so. | information provided, and then do so. | |||
| The initial set of stored responses to update are those that could | The initial set of stored responses to update are those that could | |||
| have been selected for that request - i.e., those that meet the | have been chosen for that request - i.e., those that meet the | |||
| requirements in Section 4, except the last requirement to be fresh, | requirements in Section 4, except the last requirement to be fresh, | |||
| able to be served stale or just validated. | able to be served stale or just validated. | |||
| Then, that initial set of stored response(s) is further filtered by | Then, that initial set of stored response(s) is further filtered by | |||
| the first match of: | the first match of: | |||
| * If the new response contains one or more _strong validators_ (see | * If the new response contains one or more _strong validators_ (see | |||
| Section 8.8.1 of [HTTP]), then each of those strong validators | Section 8.8.1 of [HTTP]), then each of those strong validators | |||
| identify a selected representation for update. All the stored | identify a selected representation for update. All the stored | |||
| responses in the initial set with one of those same strong | responses in the initial set with one of those same strong | |||
| skipping to change at page 22, line 44 ¶ | skipping to change at page 22, line 49 ¶ | |||
| A response to the HEAD method is identical to what an equivalent | A response to the HEAD method is identical to what an equivalent | |||
| request made with a GET would have been, without sending the content. | request made with a GET would have been, without sending the content. | |||
| This property of HEAD responses can be used to invalidate or update a | This property of HEAD responses can be used to invalidate or update a | |||
| cached GET response if the more efficient conditional GET request | cached GET response if the more efficient conditional GET request | |||
| mechanism is not available (due to no validators being present in the | mechanism is not available (due to no validators being present in the | |||
| stored response) or if transmission of the content is not desired | stored response) or if transmission of the content is not desired | |||
| even if it has changed. | even if it has changed. | |||
| When a cache makes an inbound HEAD request for a target URI and | When a cache makes an inbound HEAD request for a target URI and | |||
| receives a 200 (OK) response, the cache SHOULD update or invalidate | receives a 200 (OK) response, the cache SHOULD update or invalidate | |||
| each of its stored GET responses that could have been selected for | each of its stored GET responses that could have been chosen for that | |||
| that request (see Section 4.1). | request (see Section 4.1). | |||
| For each of the stored responses that could have been selected, if | For each of the stored responses that could have been chosen, if the | |||
| the stored response and HEAD response have matching values for any | stored response and HEAD response have matching values for any | |||
| received validator fields (ETag and Last-Modified) and, if the HEAD | received validator fields (ETag and Last-Modified) and, if the HEAD | |||
| response has a Content-Length header field, the value of Content- | response has a Content-Length header field, the value of Content- | |||
| Length matches that of the stored response, the cache SHOULD update | Length matches that of the stored response, the cache SHOULD update | |||
| the stored response as described below; otherwise, the cache SHOULD | the stored response as described below; otherwise, the cache SHOULD | |||
| consider the stored response to be stale. | consider the stored response to be stale. | |||
| If a cache updates a stored response with the metadata provided in a | If a cache updates a stored response with the metadata provided in a | |||
| HEAD response, the cache MUST use the header fields provided in the | HEAD response, the cache MUST use the header fields provided in the | |||
| HEAD response to update the stored response (see Section 3.2). | HEAD response to update the stored response (see Section 3.2). | |||
| skipping to change at page 33, line 31 ¶ | skipping to change at page 33, line 31 ¶ | |||
| expired"). | expired"). | |||
| If a response includes a Cache-Control header field with the max-age | If a response includes a Cache-Control header field with the max-age | |||
| directive (Section 5.2.2.1), a recipient MUST ignore the Expires | directive (Section 5.2.2.1), a recipient MUST ignore the Expires | |||
| header field. Likewise, if a response includes the s-maxage | header field. Likewise, if a response includes the s-maxage | |||
| directive (Section 5.2.2.10), a shared cache recipient MUST ignore | directive (Section 5.2.2.10), a shared cache recipient MUST ignore | |||
| the Expires header field. In both these cases, the value in Expires | the Expires header field. In both these cases, the value in Expires | |||
| is only intended for recipients that have not yet implemented the | is only intended for recipients that have not yet implemented the | |||
| Cache-Control header field. | Cache-Control header field. | |||
| An origin server without a clock MUST NOT generate an Expires header | An origin server without a clock (Section 5.6.7 of [HTTP]) MUST NOT | |||
| field unless its value represents a fixed time in the past (always | generate an Expires header field unless its value represents a fixed | |||
| expired) or its value has been associated with the resource by a | time in the past (always expired) or its value has been associated | |||
| system or user with a reliable clock. | with the resource by a system with a clock. | |||
| Historically, HTTP required the Expires field value to be no more | Historically, HTTP required the Expires field value to be no more | |||
| than a year in the future. While longer freshness lifetimes are no | than a year in the future. While longer freshness lifetimes are no | |||
| longer prohibited, extremely large values have been demonstrated to | longer prohibited, extremely large values have been demonstrated to | |||
| cause problems (e.g., clock overflows due to use of 32-bit integers | cause problems (e.g., clock overflows due to use of 32-bit integers | |||
| for time values), and many caches will evict a response far sooner | for time values), and many caches will evict a response far sooner | |||
| than that. | than that. | |||
| 5.4. Pragma | 5.4. Pragma | |||
| skipping to change at page 35, line 22 ¶ | skipping to change at page 35, line 22 ¶ | |||
| Caches expose an additional attack surface, since the contents of the | Caches expose an additional attack surface, since the contents of the | |||
| cache represent an attractive target for malicious exploitation. | cache represent an attractive target for malicious exploitation. | |||
| Because cache contents persist after an HTTP request is complete, an | Because cache contents persist after an HTTP request is complete, an | |||
| attack on the cache can reveal information long after a user believes | attack on the cache can reveal information long after a user believes | |||
| that the information has been removed from the network. Therefore, | that the information has been removed from the network. Therefore, | |||
| cache contents need to be protected as sensitive information. | cache contents need to be protected as sensitive information. | |||
| In particular, because private caches are restricted to a single | In particular, because private caches are restricted to a single | |||
| user, they can be used to reconstruct a user's activity. As a | user, they can be used to reconstruct a user's activity. As a | |||
| result, is important for user agents to allow end users to control | result, it is important for user agents to allow end users to control | |||
| them; for example, allowing stored responses to be removed for some | them; for example, allowing stored responses to be removed for some | |||
| or all origin servers. | or all origin servers. | |||
| 7.1. Cache Poisoning | 7.1. Cache Poisoning | |||
| Storing a malicious payload in a cache can extend the reach of an | Storing a malicious payload in a cache can extend the reach of an | |||
| attacker to affect multiple users. Such "cache poisoning" attacks | attacker to affect multiple users. Such "cache poisoning" attacks | |||
| happen when an attacker uses implementation flaws, elevated | happen when an attacker uses implementation flaws, elevated | |||
| privileges, or other techniques to insert a response into a cache. | privileges, or other techniques to insert a response into a cache. | |||
| This is especially effective when shared caches are used to | This is especially effective when shared caches are used to | |||
| skipping to change at page 38, line 7 ¶ | skipping to change at page 38, line 7 ¶ | |||
| 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 | |||
| [HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | [HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
| Ed., "HTTP Semantics", Work in Progress, Internet-Draft, | Ed., "HTTP Semantics", Work in Progress, Internet-Draft, | |||
| draft-ietf-httpbis-semantics-17, 26 July 2021, | draft-ietf-httpbis-semantics-18, 18 August 2021, | |||
| <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | ||||
| semantics-17>. | ||||
| [HTTP/1.1] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | ||||
| Ed., "HTTP/1.1", Work in Progress, Internet-Draft, draft- | ||||
| ietf-httpbis-messaging-17, 26 July 2021, | ||||
| <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | |||
| messaging-17>. | semantics-18>. | |||
| [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>. | |||
| [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | |||
| 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>. | |||
| skipping to change at page 38, line 41 ¶ | skipping to change at page 38, line 35 ¶ | |||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| 9.2. Informative References | 9.2. Informative References | |||
| [COOKIE] Barth, A., "HTTP State Management Mechanism", RFC 6265, | [COOKIE] Barth, A., "HTTP State Management Mechanism", RFC 6265, | |||
| DOI 10.17487/RFC6265, April 2011, | DOI 10.17487/RFC6265, April 2011, | |||
| <https://www.rfc-editor.org/info/rfc6265>. | <https://www.rfc-editor.org/info/rfc6265>. | |||
| [HTTP/1.1] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | ||||
| Ed., "HTTP/1.1", Work in Progress, Internet-Draft, draft- | ||||
| ietf-httpbis-messaging-18, 18 August 2021, | ||||
| <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | ||||
| messaging-18>. | ||||
| [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, | |||
| DOI 10.17487/RFC2616, June 1999, | DOI 10.17487/RFC2616, June 1999, | |||
| <https://www.rfc-editor.org/info/rfc2616>. | <https://www.rfc-editor.org/info/rfc2616>. | |||
| [RFC5861] Nottingham, M., "HTTP Cache-Control Extensions for Stale | [RFC5861] Nottingham, M., "HTTP Cache-Control Extensions for Stale | |||
| Content", RFC 5861, DOI 10.17487/RFC5861, April 2010, | Content", RFC 5861, DOI 10.17487/RFC5861, April 2010, | |||
| <https://www.rfc-editor.org/info/rfc5861>. | <https://www.rfc-editor.org/info/rfc5861>. | |||
| [RFC5905] Mills, D., Martin, J., Ed., Burbank, J., and W. Kasch, | ||||
| "Network Time Protocol Version 4: Protocol and Algorithms | ||||
| Specification", RFC 5905, DOI 10.17487/RFC5905, June 2010, | ||||
| <https://www.rfc-editor.org/info/rfc5905>. | ||||
| [RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. F. Reschke, | [RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. F. Reschke, | |||
| Ed., "Hypertext Transfer Protocol (HTTP): Caching", | Ed., "Hypertext Transfer Protocol (HTTP): Caching", | |||
| RFC 7234, DOI 10.17487/RFC7234, June 2014, | RFC 7234, DOI 10.17487/RFC7234, June 2014, | |||
| <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>. | |||
| skipping to change at page 46, line 36 ¶ | skipping to change at page 46, line 33 ¶ | |||
| issues?q=label%3Acaching+created%3A%3E2021-05-26> for a summary. | issues?q=label%3Acaching+created%3A%3E2021-05-26> for a summary. | |||
| Furthermore: | Furthermore: | |||
| * Addressed Genart last call review comments | * Addressed Genart last call review comments | |||
| (<https://github.com/httpwg/http-core/issues/847>) | (<https://github.com/httpwg/http-core/issues/847>) | |||
| * In Section 4.3.4, clarify that only selectable responses are | * In Section 4.3.4, clarify that only selectable responses are | |||
| updated (<https://github.com/httpwg/http-core/issues/839>) | updated (<https://github.com/httpwg/http-core/issues/839>) | |||
| C.19. Since draft-ietf-httpbis-cache-17 | ||||
| * Made reference to [HTTP/1.1] informative only | ||||
| (<https://github.com/httpwg/http-core/issues/911>) | ||||
| * Move cache-related aspects of validator use from [HTTP] into | ||||
| Section 4.3.1 (<https://github.com/httpwg/http-core/issues/933>) | ||||
| * Use term "clock" defined in Section 6.6.1 of [HTTP] throughout | ||||
| (<https://github.com/httpwg/http-core/issues/953>) | ||||
| * Throughout, disambiguate "selected representation" and "selected | ||||
| response" (now "chosen response") (<https://github.com/httpwg/ | ||||
| http-core/issues/958>) | ||||
| Acknowledgements | Acknowledgements | |||
| See Appendix "Acknowledgements" of [HTTP]. | See Appendix "Acknowledgements" of [HTTP]. | |||
| Index | Index | |||
| A C E F G H M N O P S V W | A C E F G H M N O P S V W | |||
| A | A | |||
| skipping to change at page 48, line 27 ¶ | skipping to change at page 48, line 39 ¶ | |||
| Pragma header field Section 5.4 | Pragma header field Section 5.4 | |||
| private (cache directive) Section 5.2.2.7 | private (cache directive) Section 5.2.2.7 | |||
| private cache Section 1 | private cache Section 1 | |||
| proxy-revalidate (cache directive) Section 5.2.2.8 | proxy-revalidate (cache directive) Section 5.2.2.8 | |||
| public (cache directive) Section 5.2.2.9 | public (cache directive) Section 5.2.2.9 | |||
| S | S | |||
| s-maxage (cache directive) Section 5.2.2.10 | s-maxage (cache directive) Section 5.2.2.10 | |||
| selected response Section 4.1 | ||||
| shared cache Section 1 | shared cache Section 1 | |||
| stale Section 4.2 | stale Section 4.2 | |||
| V | V | |||
| validator Section 4.3.1 | validator Section 4.3.1 | |||
| W | W | |||
| Warning header field Section 5.5 | Warning header field Section 5.5 | |||
| End of changes. 43 change blocks. | ||||
| 95 lines changed or deleted | 120 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/ | ||||