| draft-ietf-httpbis-cache-19.txt | draft-ietf-httpbis-cache-latest.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: March 14, 2022 J. Reschke, Ed. | Expires: May 1, 2026 J. Reschke, Ed. | |||
| greenbytes | greenbytes | |||
| September 10, 2021 | October 28, 2025 | |||
| HTTP Caching | HTTP Caching | |||
| draft-ietf-httpbis-cache-19 | draft-ietf-httpbis-cache-latest | |||
| 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.20. | The changes in this draft are summarized in Appendix C.1. | |||
| 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 March 14, 2022. | This Internet-Draft will expire on May 1, 2026. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2025 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 | |||
| and restrictions with respect to this document. Code Components | and restrictions with respect to this document. Code Components | |||
| extracted from this document must include Revised BSD License text as | extracted from this document must include Revised BSD License text as | |||
| described in Section 4.e of the Trust Legal Provisions and are | described in Section 4.e of the Trust Legal Provisions and are | |||
| provided without warranty as described in the Revised BSD License. | provided without warranty as described in the Revised BSD License. | |||
| skipping to change at page 2, line 44 ¶ | skipping to change at page 2, line 44 ¶ | |||
| 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.2.1. Imported Rules . . . . . . . . . . . . . . . . . . . 5 | 1.2.1. Imported Rules . . . . . . . . . . . . . . . . . . . 5 | |||
| 1.2.2. Delta Seconds . . . . . . . . . . . . . . . . . . . . 6 | 1.2.2. Delta Seconds . . . . . . . . . . . . . . . . . . . . 5 | |||
| 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 Header and Trailer Fields . . . . . . . . . . . . 8 | 3.1. Storing Header and Trailer Fields . . . . . . . . . . . . 8 | |||
| 3.2. Updating Stored Header Fields . . . . . . . . . . . . . . 9 | 3.2. Updating Stored Header Fields . . . . . . . . . . . . . . 9 | |||
| 3.3. Storing Incomplete Responses . . . . . . . . . . . . . . 10 | 3.3. Storing Incomplete Responses . . . . . . . . . . . . . . 10 | |||
| 3.4. Combining Partial Content . . . . . . . . . . . . . . . . 11 | 3.4. Combining Partial Content . . . . . . . . . . . . . . . . 10 | |||
| 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 . . . . 12 | 4.1. Calculating Cache Keys with the Vary Header Field . . . . 12 | |||
| 4.2. Freshness . . . . . . . . . . . . . . . . . . . . . . . . 14 | 4.2. Freshness . . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
| 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 . . . . . . . . . . . . . . . . . . . 16 | |||
| 4.2.4. Serving Stale Responses . . . . . . . . . . . . . . . 18 | 4.2.4. Serving Stale Responses . . . . . . . . . . . . . . . 18 | |||
| 4.3. Validation . . . . . . . . . . . . . . . . . . . . . . . 18 | 4.3. Validation . . . . . . . . . . . . . . . . . . . . . . . 18 | |||
| 4.3.1. Sending a Validation Request . . . . . . . . . . . . 19 | 4.3.1. Sending a Validation Request . . . . . . . . . . . . 18 | |||
| 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 . . . . . 22 | 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 Directives . . . . . . . . . . . . . . . . . 25 | |||
| 5.2.1.1. max-age . . . . . . . . . . . . . . . . . . . . . 25 | 5.2.1.1. max-age . . . . . . . . . . . . . . . . . . . . . 25 | |||
| 5.2.1.2. max-stale . . . . . . . . . . . . . . . . . . . . 25 | 5.2.1.2. max-stale . . . . . . . . . . . . . . . . . . . . 25 | |||
| 5.2.1.3. min-fresh . . . . . . . . . . . . . . . . . . . . 26 | 5.2.1.3. min-fresh . . . . . . . . . . . . . . . . . . . . 26 | |||
| 5.2.1.4. no-cache . . . . . . . . . . . . . . . . . . . . 26 | 5.2.1.4. no-cache . . . . . . . . . . . . . . . . . . . . 26 | |||
| 5.2.1.5. no-store . . . . . . . . . . . . . . . . . . . . 26 | 5.2.1.5. no-store . . . . . . . . . . . . . . . . . . . . 26 | |||
| 5.2.1.6. no-transform . . . . . . . . . . . . . . . . . . 27 | 5.2.1.6. no-transform . . . . . . . . . . . . . . . . . . 27 | |||
| 5.2.1.7. only-if-cached . . . . . . . . . . . . . . . . . 27 | 5.2.1.7. only-if-cached . . . . . . . . . . . . . . . . . 27 | |||
| 5.2.2. Response Cache-Control Directives . . . . . . . . . . 27 | 5.2.2. Response Directives . . . . . . . . . . . . . . . . . 27 | |||
| 5.2.2.1. max-age . . . . . . . . . . . . . . . . . . . . . 27 | 5.2.2.1. max-age . . . . . . . . . . . . . . . . . . . . . 27 | |||
| 5.2.2.2. must-revalidate . . . . . . . . . . . . . . . . . 27 | 5.2.2.2. must-revalidate . . . . . . . . . . . . . . . . . 27 | |||
| 5.2.2.3. must-understand . . . . . . . . . . . . . . . . . 28 | 5.2.2.3. must-understand . . . . . . . . . . . . . . . . . 28 | |||
| 5.2.2.4. no-cache . . . . . . . . . . . . . . . . . . . . 28 | 5.2.2.4. no-cache . . . . . . . . . . . . . . . . . . . . 28 | |||
| 5.2.2.5. no-store . . . . . . . . . . . . . . . . . . . . 29 | 5.2.2.5. no-store . . . . . . . . . . . . . . . . . . . . 29 | |||
| 5.2.2.6. no-transform . . . . . . . . . . . . . . . . . . 29 | 5.2.2.6. no-transform . . . . . . . . . . . . . . . . . . 29 | |||
| 5.2.2.7. private . . . . . . . . . . . . . . . . . . . . . 29 | 5.2.2.7. private . . . . . . . . . . . . . . . . . . . . . 29 | |||
| 5.2.2.8. proxy-revalidate . . . . . . . . . . . . . . . . 30 | 5.2.2.8. proxy-revalidate . . . . . . . . . . . . . . . . 30 | |||
| 5.2.2.9. public . . . . . . . . . . . . . . . . . . . . . 30 | 5.2.2.9. public . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 5.2.2.10. s-maxage . . . . . . . . . . . . . . . . . . . . 31 | 5.2.2.10. s-maxage . . . . . . . . . . . . . . . . . . . . 31 | |||
| 5.2.3. Cache Control Extensions . . . . . . . . . . . . . . 31 | 5.2.3. Extension Directives . . . . . . . . . . . . . . . . 31 | |||
| 5.2.4. Cache Directive Registry . . . . . . . . . . . . . . 32 | 5.2.4. Cache Directive Registry . . . . . . . . . . . . . . 32 | |||
| 5.3. Expires . . . . . . . . . . . . . . . . . . . . . . . . . 32 | 5.3. Expires . . . . . . . . . . . . . . . . . . . . . . . . . 32 | |||
| 5.4. Pragma . . . . . . . . . . . . . . . . . . . . . . . . . 33 | 5.4. Pragma . . . . . . . . . . . . . . . . . . . . . . . . . 33 | |||
| 5.5. Warning . . . . . . . . . . . . . . . . . . . . . . . . . 34 | 5.5. Warning . . . . . . . . . . . . . . . . . . . . . . . . . 34 | |||
| 6. Relationship to Applications and Other Caches . . . . . . . . 34 | 6. Relationship to Applications and Other Caches . . . . . . . . 34 | |||
| 7. Security Considerations . . . . . . . . . . . . . . . . . . . 35 | 7. Security Considerations . . . . . . . . . . . . . . . . . . . 35 | |||
| 7.1. Cache Poisoning . . . . . . . . . . . . . . . . . . . . . 35 | 7.1. Cache Poisoning . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 7.2. Timing Attacks . . . . . . . . . . . . . . . . . . . . . 35 | 7.2. Timing Attacks . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 7.3. Caching of Sensitive Information . . . . . . . . . . . . 36 | 7.3. Caching of Sensitive Information . . . . . . . . . . . . 36 | |||
| 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 36 | 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 36 | |||
| 8.1. Field Name Registration . . . . . . . . . . . . . . . . . 36 | 8.1. Field Name Registration . . . . . . . . . . . . . . . . . 36 | |||
| 8.2. Cache Directive Registration . . . . . . . . . . . . . . 37 | 8.2. Cache Directive Registration . . . . . . . . . . . . . . 36 | |||
| 8.3. Warn Code Registry . . . . . . . . . . . . . . . . . . . 37 | 8.3. Warn Code Registry . . . . . . . . . . . . . . . . . . . 37 | |||
| 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 37 | 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 9.1. Normative References . . . . . . . . . . . . . . . . . . 37 | 9.1. Normative References . . . . . . . . . . . . . . . . . . 37 | |||
| 9.2. Informative References . . . . . . . . . . . . . . . . . 38 | 9.2. Informative References . . . . . . . . . . . . . . . . . 38 | |||
| Appendix A. Collected ABNF . . . . . . . . . . . . . . . . . . . 39 | Appendix A. Collected ABNF . . . . . . . . . . . . . . . . . . . 38 | |||
| Appendix B. Changes from RFC 7234 . . . . . . . . . . . . . . . 39 | Appendix B. Changes from RFC 7234 . . . . . . . . . . . . . . . 39 | |||
| Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 40 | Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 40 | |||
| C.1. Between RFC7234 and draft 00 . . . . . . . . . . . . . . 40 | C.1. Since draft-ietf-httpbis-cache-19 . . . . . . . . . . . . 40 | |||
| C.2. Since draft-ietf-httpbis-cache-00 . . . . . . . . . . . . 40 | Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 40 | |||
| C.3. Since draft-ietf-httpbis-cache-01 . . . . . . . . . . . . 41 | Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 | |||
| C.4. Since draft-ietf-httpbis-cache-02 . . . . . . . . . . . . 41 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 42 | |||
| C.5. Since draft-ietf-httpbis-cache-03 . . . . . . . . . . . . 41 | ||||
| C.6. Since draft-ietf-httpbis-cache-04 . . . . . . . . . . . . 42 | ||||
| C.7. Since draft-ietf-httpbis-cache-05 . . . . . . . . . . . . 42 | ||||
| C.8. Since draft-ietf-httpbis-cache-06 . . . . . . . . . . . . 42 | ||||
| C.9. Since draft-ietf-httpbis-cache-07 . . . . . . . . . . . . 43 | ||||
| C.10. Since draft-ietf-httpbis-cache-08 . . . . . . . . . . . . 43 | ||||
| C.11. Since draft-ietf-httpbis-cache-09 . . . . . . . . . . . . 43 | ||||
| C.12. Since draft-ietf-httpbis-cache-10 . . . . . . . . . . . . 43 | ||||
| C.13. Since draft-ietf-httpbis-cache-11 . . . . . . . . . . . . 43 | ||||
| C.14. Since draft-ietf-httpbis-cache-12 . . . . . . . . . . . . 43 | ||||
| C.15. Since draft-ietf-httpbis-cache-13 . . . . . . . . . . . . 45 | ||||
| C.16. Since draft-ietf-httpbis-cache-14 . . . . . . . . . . . . 45 | ||||
| C.17. Since draft-ietf-httpbis-cache-15 . . . . . . . . . . . . 46 | ||||
| C.18. Since draft-ietf-httpbis-cache-16 . . . . . . . . . . . . 46 | ||||
| C.19. Since draft-ietf-httpbis-cache-17 . . . . . . . . . . . . 46 | ||||
| C.20. Since draft-ietf-httpbis-cache-18 . . . . . . . . . . . . 46 | ||||
| Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 46 | ||||
| Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 49 | ||||
| 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 | |||
| caching and reusing response messages. | caching and reusing response messages. | |||
| An HTTP _cache_ is a local store of response messages and the | An HTTP "cache" is a local store of response messages and the | |||
| subsystem that controls storage, retrieval, and deletion of messages | subsystem that controls storage, retrieval, and deletion of messages | |||
| in it. A cache stores cacheable responses to reduce the response | in it. A cache stores cacheable responses to reduce the response | |||
| time and network bandwidth consumption on future equivalent requests. | time and network bandwidth consumption on future equivalent requests. | |||
| Any client or server MAY use a cache, though not when acting as a | Any client or server MAY use a cache, though not when acting as a | |||
| tunnel (Section 3.7 of [HTTP]). | tunnel (Section 3.7 of [HTTP]). | |||
| A _shared cache_ is a cache that stores responses for reuse by more | A "shared cache" is a cache that stores responses for reuse by more | |||
| than one user; shared caches are usually (but not always) deployed as | than one user; shared caches are usually (but not always) deployed as | |||
| a part of an intermediary. A _private cache_, in contrast, is | a part of an intermediary. A "private cache", in contrast, is | |||
| dedicated to a single user; often, they are deployed as a component | dedicated to a single user; often, they are deployed as a component | |||
| of a user agent. | of a user agent. | |||
| The goal of HTTP caching is significantly improving performance by | The goal of HTTP caching is significantly improving performance by | |||
| reusing a prior response message to satisfy a current request. A | reusing a prior response message to satisfy a current request. A | |||
| cache considers a stored response "fresh", as defined in Section 4.2, | cache considers a stored response "fresh", as defined in Section 4.2, | |||
| if it can be reused without "validation" (checking with the origin | if it can be reused without "validation" (checking with the origin | |||
| server to see if the cached response remains valid for this request). | server to see if the cached response remains valid for this request). | |||
| A fresh response can therefore reduce both latency and network | A fresh response can therefore reduce both latency and network | |||
| overhead each time the cache reuses it. When a cached response is | overhead each time the cache reuses it. When a cached response is | |||
| skipping to change at page 5, line 43 ¶ | skipping to change at page 5, line 24 ¶ | |||
| considerations regarding error handling. | considerations regarding error handling. | |||
| 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 5.6.1 of [HTTP], | It also uses a list extension, defined in Section 5.6.1 of [HTTP], | |||
| 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. | |||
| 1.2.1. Imported Rules | 1.2.1. Imported Rules | |||
| The following core rule is included by reference, as defined in | The following core rule is included by reference, as defined in | |||
| [RFC5234], Appendix B.1: DIGIT (decimal 0-9). | [RFC5234], Appendix B.1: DIGIT (decimal 0-9). | |||
| [HTTP] defines the following rules: | [HTTP] defines the following rules: | |||
| skipping to change at page 6, line 50 ¶ | skipping to change at page 6, line 37 ¶ | |||
| 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 choose 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. | ||||
| A cache might store multiple responses for a request target that is | A cache might store multiple responses for a request target that is | |||
| subject to content negotiation. Caches differentiate these responses | subject to content negotiation. Caches differentiate these responses | |||
| by incorporating some of the original request's header fields into | by incorporating some of the original request's header fields into | |||
| the cache key as well, using information in the Vary response header | the cache key as well, using information in the 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 | |||
| skipping to change at page 7, line 29 ¶ | skipping to change at page 7, line 19 ¶ | |||
| 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 | |||
| (e.g., 404 (Not Found)), incomplete results (e.g., 206 (Partial | (e.g., 404 (Not Found)), incomplete results (e.g., 206 (Partial | |||
| Content)), and responses to methods other than GET if the method's | Content)), and responses to methods other than GET if the method's | |||
| definition allows such caching and defines something suitable for use | definition allows such caching and defines something suitable for use | |||
| as a cache key. | 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 request. A disconnected cache | otherwise find a forward path for a request. A disconnected cache | |||
| can serve stale responses in some circumstances (Section 4.2.4). | can serve stale responses in some circumstances (Section 4.2.4). | |||
| 3. Storing Responses in Caches | 3. Storing Responses in Caches | |||
| A cache MUST NOT store a response to a request unless: | A cache MUST NOT store a response to a request unless: | |||
| o the request method is understood by the cache; | o the request method is understood by the cache; | |||
| o the response status code is final (see Section 15 of [HTTP]); | o the response status code is final (see Section 15 of [HTTP]); | |||
| o if the response status code is 206 or 304, or the "must- | o if the response status code is 206 or 304, or the must-understand | |||
| understand" cache directive (see Section 5.2.2.3) is present: the | cache directive (see Section 5.2.2.3) is present: the cache | |||
| cache understands the response status code; | understands the response status code; | |||
| o the "no-store" cache directive is not present in the response (see | o the no-store cache directive is not present in the response (see | |||
| Section 5.2.2.5); | Section 5.2.2.5); | |||
| o if the cache is shared: the "private" response directive is either | o if the cache is shared: the private response directive is either | |||
| not present or allows a shared cache to store a modified response; | not present or allows a shared cache to store a modified response; | |||
| see Section 5.2.2.7); | see Section 5.2.2.7); | |||
| o if the cache is shared: the Authorization header field is not | o if the cache is shared: the Authorization header field is not | |||
| present in the request (see Section 11.6.2 of [HTTP]) or a | present in the request (see Section 11.6.2 of [HTTP]) or a | |||
| response directive is present that explicitly allows shared | response directive is present that explicitly allows shared | |||
| caching (see Section 3.5); and, | caching (see Section 3.5); and | |||
| o the response contains at least one of: | o the response contains at least one of the following: | |||
| * a public response directive (see Section 5.2.2.9); | * a public response directive (see Section 5.2.2.9); | |||
| * a private response directive, if the cache is not shared (see | * a private response directive, if the cache is not shared (see | |||
| Section 5.2.2.7); | Section 5.2.2.7); | |||
| * an Expires header field (see Section 5.3); | * an Expires header field (see Section 5.3); | |||
| * a max-age response directive (see Section 5.2.2.1); | * a max-age response directive (see Section 5.2.2.1); | |||
| * if the cache is shared: an s-maxage response directive (see | * if the cache is shared: an s-maxage response directive (see | |||
| Section 5.2.2.10); | Section 5.2.2.10); | |||
| * a Cache Control Extension that allows it to be cached (see | * a cache extension that allows it to be cached (see | |||
| Section 5.2.3); or, | Section 5.2.3); or | |||
| * a status code that is defined as heuristically cacheable (see | * a status code that is defined as heuristically cacheable (see | |||
| Section 4.2.2). | Section 4.2.2). | |||
| Note that a cache-control extension can override any of the | Note that a cache extension can override any of the requirements | |||
| requirements listed; see Section 5.2.3. | listed; 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 Header and Trailer Fields | 3.1. Storing Header and Trailer Fields | |||
| Caches MUST include all received response header fields -- including | Caches MUST include all received response header fields -- including | |||
| unrecognised ones -- when storing a response; this assures that new | unrecognized ones -- when storing a response; this assures that new | |||
| HTTP header fields can be successfully deployed. However, the | HTTP header fields can be successfully deployed. However, the | |||
| following exceptions are made: | following exceptions are made: | |||
| o The Connection header field and fields whose names are listed in | o The Connection header field and fields whose names are listed in | |||
| it are required by Section 7.6.1 of [HTTP] to be removed before | it are required by Section 7.6.1 of [HTTP] to be removed before | |||
| forwarding the message. This MAY be implemented by doing so | forwarding the message. This MAY be implemented by doing so | |||
| before storage. | before storage. | |||
| o Likewise, some fields' semantics require them to be removed before | o Likewise, some fields' semantics require them to be removed before | |||
| forwarding the message, and this MAY be implemented by doing so | forwarding the message, and this MAY be implemented by doing so | |||
| skipping to change at page 9, line 16 ¶ | skipping to change at page 9, line 4 ¶ | |||
| forwarding the message, and this MAY be implemented by doing so | forwarding the message, and this MAY be implemented by doing so | |||
| before storage; see Section 7.6.1 of [HTTP] for some examples. | before storage; see Section 7.6.1 of [HTTP] for some examples. | |||
| o The no-cache (Section 5.2.2.4) and private (Section 5.2.2.7) cache | o The no-cache (Section 5.2.2.4) and private (Section 5.2.2.7) cache | |||
| directives can have arguments that prevent storage of header | directives can have arguments that prevent storage of header | |||
| fields by all caches and shared caches, respectively. | fields by all caches and shared caches, respectively. | |||
| o Header fields that are specific to the proxy that a cache uses | o Header fields that are specific to the proxy that a cache uses | |||
| when forwarding a request MUST NOT be stored, unless the cache | when forwarding a request MUST NOT be stored, unless the cache | |||
| incorporates the identity of the proxy into the cache key. | incorporates the identity of the proxy into the cache key. | |||
| Effectively, this is limited to Proxy-Authenticate (Section 11.7.1 | Effectively, this is limited to Proxy-Authenticate (Section 11.7.1 | |||
| of [HTTP]), Proxy-Authentication-Info (Section 11.7.3 of [HTTP]), | of [HTTP]), Proxy-Authentication-Info (Section 11.7.3 of [HTTP]), | |||
| and Proxy-Authorization (Section 11.7.2 of [HTTP]). | and Proxy-Authorization (Section 11.7.2 of [HTTP]). | |||
| Caches MAY either store trailer fields separate from header fields, | Caches MAY either store trailer fields separate from header fields or | |||
| or discard them. Caches MUST NOT combine trailer fields with header | discard them. Caches MUST NOT combine trailer fields with header | |||
| fields. | fields. | |||
| 3.2. Updating Stored Header Fields | 3.2. Updating Stored Header Fields | |||
| Caches are required to update a stored response's header fields from | Caches are required to update a stored response's header fields from | |||
| another (typically newer) response in several situations; for | another (typically newer) response in several situations; for | |||
| example, see Section 3.4, Section 4.3.4 and Section 4.3.5. | example, see Sections 3.4, 4.3.4, and 4.3.5. | |||
| When doing so, the cache MUST add each header field in the provided | When doing so, the cache MUST add each header field in the provided | |||
| response to the stored response, replacing field values that are | response to the stored response, replacing field values that are | |||
| already present, with the following exceptions: | already present, with the following exceptions: | |||
| o Header fields excepted from storage in Section 3.1, | o Header fields excepted from storage in Section 3.1, | |||
| o Header fields that the cache's stored response depends upon, as | o Header fields that the cache's stored response depends upon, as | |||
| described below, | described below, | |||
| o Header fields that are automatically processed and removed by the | o Header fields that are automatically processed and removed by the | |||
| recipient, as described below, and | recipient, as described below, and | |||
| o The Content-Length header field. | o The Content-Length header field. | |||
| In some cases, caches (especially in user agents) store the results | In some cases, caches (especially in user agents) store the results | |||
| of processing the received response, rather than the response itself, | of processing the received response, rather than the response itself, | |||
| and updating header fields that affect that processing can result in | and updating header fields that affect that processing can result in | |||
| inconsistent behavior and security issues. Caches in this situation | inconsistent behavior and security issues. Caches in this situation | |||
| MAY omit these header fields from updating stored responses on an | MAY omit these header fields from updating stored responses on an | |||
| exceptional basis, but SHOULD limit such omission to those fields | exceptional basis but SHOULD limit such omission to those fields | |||
| necessary to assure integrity of the stored response. | necessary to assure integrity of the stored response. | |||
| For example, a browser might decode the content coding of a response | For example, a browser might decode the content coding of a response | |||
| while it is being received, creating a disconnect between the data it | while it is being received, creating a disconnect between the data it | |||
| has stored and the response's original metadata. Updating that | has stored and the response's original metadata. Updating that | |||
| stored metadata with a different Content-Encoding header field would | stored metadata with a different Content-Encoding header field would | |||
| be problematic. Likewise, a browser might store a post-parse HTML | be problematic. Likewise, a browser might store a post-parse HTML | |||
| tree, rather than the content received in the response; updating the | tree rather than the content received in the response; updating the | |||
| Content-Type header field would not be workable in this case, because | Content-Type header field would not be workable in this case because | |||
| any assumptions about the format made in parsing would now be | any assumptions about the format made in parsing would now be | |||
| invalid. | invalid. | |||
| Furthermore, some fields are automatically processed and removed by | Furthermore, some fields are automatically processed and removed by | |||
| the HTTP implementation; for example, the Content-Range header field. | the HTTP implementation, such as the Content-Range header field. | |||
| Implementations MAY automatically omit such header fields from | Implementations MAY automatically omit such header fields from | |||
| updates, even when the processing does not actually occur. | updates, even when the processing does not actually occur. | |||
| Note that the Content-* prefix is not a signal that a header field is | Note that the Content-* prefix is not a signal that a header field is | |||
| omitted from update; it is a convention for MIME header fields, not | omitted from update; it is a convention for MIME header fields, not | |||
| HTTP. | HTTP. | |||
| 3.3. Storing Incomplete Responses | 3.3. Storing Incomplete Responses | |||
| If the request method is GET, the response status code is 200 (OK), | 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 | and the entire response header section has been received, a cache MAY | |||
| store a response body that is not complete (Section 3.4 of [HTTP]) if | store a response that is not complete (Section 6.1 of [HTTP]) | |||
| the stored response is recorded as being incomplete. Likewise, a 206 | provided that the stored response is recorded as being incomplete. | |||
| (Partial Content) response MAY be stored as if it were an incomplete | Likewise, a 206 (Partial Content) response MAY be stored as if it | |||
| 200 (OK) response. However, a cache MUST NOT store incomplete or | were an incomplete 200 (OK) response. However, a cache MUST NOT | |||
| partial-content responses if it does not support the Range and | store incomplete or partial-content responses if it does not support | |||
| Content-Range header fields or if it does not understand the range | the Range and Content-Range header fields or if it does not | |||
| units used in those fields. | 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 14.2 of [HTTP]) and combining the | subsequent range request (Section 14.2 of [HTTP]) and combining the | |||
| successful response with the stored response, as defined in | successful response with the stored response, as defined in | |||
| Section 3.4. A cache MUST NOT use an incomplete response to answer | Section 3.4. A cache MUST NOT use an incomplete response to answer | |||
| requests unless the response has been made complete, or the request | requests unless the response has been made complete, or the request | |||
| is partial and specifies a range wholly within the incomplete | is partial and specifies a range 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 using the 206 (Partial Content) status | without explicitly marking it using the 206 (Partial Content) status | |||
| code. | code. | |||
| skipping to change at page 11, line 26 ¶ | skipping to change at page 11, line 11 ¶ | |||
| When combining the new response with one or more stored responses, a | When combining the new response with one or more stored responses, a | |||
| cache MUST update the stored response header fields using the header | cache MUST update the stored response header fields using the header | |||
| fields provided in the new response, as per Section 3.2. | fields provided in the new response, as per Section 3.2. | |||
| 3.5. Storing Responses to Authenticated Requests | 3.5. 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 | |||
| Authorization header field (Section 11.6.2 of [HTTP]) to satisfy any | Authorization header field (Section 11.6.2 of [HTTP]) to satisfy any | |||
| subsequent request unless the response contains a Cache-Control field | subsequent request unless the response contains a Cache-Control field | |||
| with a response directive (Section 5.2.2) that allows it to be stored | with a response directive (Section 5.2.2) that allows it to be stored | |||
| by a shared cache and the cache conforms to the requirements of that | by a shared cache, and the cache conforms to the requirements of that | |||
| directive for that response. | directive for that response. | |||
| In this specification, the following response directives have such an | In this specification, the following response directives have such an | |||
| effect: must-revalidate (Section 5.2.2.2), public (Section 5.2.2.9), | effect: must-revalidate (Section 5.2.2.2), public (Section 5.2.2.9), | |||
| and s-maxage (Section 5.2.2.10). | and s-maxage (Section 5.2.2.10). | |||
| 4. Constructing Responses from Caches | 4. Constructing Responses from Caches | |||
| 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: | |||
| o The presented target URI (Section 7.1 of [HTTP]) and that of the | o the presented target URI (Section 7.1 of [HTTP]) and that of the | |||
| stored response match, and | stored response match, and | |||
| o the request method associated with the stored response allows it | o 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 | |||
| o request header fields nominated by the stored response (if any) | o 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 | |||
| o the stored response does not contain the no-cache cache directive | o the stored response does not contain the no-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 | |||
| o the stored response is either: | o the stored response is one of the following: | |||
| * fresh (see Section 4.2), or | * fresh (see Section 4.2), or | |||
| * allowed to be served stale (see Section 4.2.4), or | * allowed to be served stale (see Section 4.2.4), or | |||
| * successfully validated (see Section 4.3). | * successfully validated (see Section 4.3). | |||
| Note that a cache-control extension can override any of the | Note that a cache extension can override any of the requirements | |||
| requirements listed; see Section 5.2.3. | listed; see Section 5.2.3. | |||
| When a stored response is used to satisfy a request without | When a stored response is used to satisfy a request without | |||
| validation, a cache MUST generate an Age header field (Section 5.1), | validation, a cache MUST generate an Age header field (Section 5.1), | |||
| replacing any present in the response with a value equal to the | replacing any present in the response with a value equal to the | |||
| stored response's current_age; see Section 4.2.3. | stored response's current_age; see Section 4.2.3. | |||
| A cache MUST write through requests with methods that are unsafe | A cache MUST write through requests with methods that are unsafe | |||
| (Section 9.2.1 of [HTTP]) to the origin server; i.e., a cache is not | (Section 9.2.1 of [HTTP]) to the origin server; i.e., a cache is not | |||
| allowed to generate a reply to such a request before having forwarded | allowed to generate a reply to such a request before having forwarded | |||
| the request and having received a corresponding response. | the request and having received a corresponding response. | |||
| Also, note that unsafe requests might invalidate already-stored | Also, note that unsafe requests might invalidate already-stored | |||
| responses; see Section 4.4. | responses; see Section 4.4. | |||
| A response that is stored or storable can be used to satisfy multiple | A cache can use a response that is stored or storable to satisfy | |||
| requests, provided that it is allowed to reuse that response for the | multiple requests, provided that it is allowed to reuse that response | |||
| requests in question. This enables caches to _collapse requests_ -- | for the requests in question. This enables a cache to "collapse | |||
| or combine multiple incoming requests into a single forward request | requests" -- or combine multiple incoming requests into a single | |||
| upon a cache miss -- thereby reducing load on the origin server and | forward request upon a cache miss -- thereby reducing load on the | |||
| network. However, note that if the response returned is not able to | origin server and network. Note, however, that if the cache cannot | |||
| be used for some or all of the collapsed requests, additional latency | use the returned response for some or all of the collapsed requests, | |||
| might be introduced, because they will need to be forwarded to be | it will need to forward the requests in order to satisfy them, | |||
| satisfied. | potentially introducing additional latency. | |||
| 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 without a clock (Section 5.6.7 of [HTTP]) MUST revalidate | A cache without a clock (Section 5.6.7 of [HTTP]) MUST revalidate | |||
| stored responses 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 | |||
| skipping to change at page 13, line 8 ¶ | skipping to change at page 12, line 43 ¶ | |||
| 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 presented request header | response without revalidation unless all the presented request header | |||
| fields nominated by that Vary field value match those fields in the | fields nominated by that Vary field value match those fields in the | |||
| original request (i.e., the request that caused the cached response | original request (i.e., the request that caused the cached response | |||
| to be stored). | to be stored). | |||
| The header fields from two requests are defined to match if and only | The header fields from two requests are defined to match if and only | |||
| if those in the first request can be transformed to those in the | if those in the first request can be transformed to those in the | |||
| second request by applying any of: | second request by applying any of the following: | |||
| o adding or removing whitespace, where allowed in the header field's | o adding or removing whitespace, where allowed in the header field's | |||
| syntax | syntax | |||
| o combining multiple header field lines with the same field name | o combining multiple header field lines with the same field name | |||
| (see Section 5.2 of [HTTP]) | (see Section 5.2 of [HTTP]) | |||
| o normalizing both header field values in a way that is known to | o 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 | |||
| skipping to change at page 14, line 7 ¶ | skipping to change at page 13, line 42 ¶ | |||
| cache SHOULD choose the most recent (see Section 4.2.3) stored | cache SHOULD choose the most recent (see Section 4.2.3) stored | |||
| response with a valid Vary field value. | response with a valid Vary field value. | |||
| If no stored response matches, the cache cannot satisfy the presented | If no stored response matches, the cache cannot satisfy the presented | |||
| request. Typically, the request is forwarded to the origin server, | request. Typically, the request is forwarded to the origin server, | |||
| potentially with preconditions added to describe what responses the | potentially with preconditions added to describe what responses the | |||
| cache has already stored (Section 4.3). | 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 | |||
| intends that a stored response can no longer be used by a cache | intends that a stored response can no longer be used by a cache | |||
| without further validation, whereas a _heuristic expiration time_ is | without further validation, whereas a "heuristic expiration time" is | |||
| assigned by a cache when no explicit expiration time is available. | assigned by a cache when no explicit expiration time is available. | |||
| A response's _age_ is the time that has passed since it was generated | A response's "age" is the time that has passed since it was generated | |||
| by, or successfully validated with, the origin server. | by, or successfully validated with, the origin server. | |||
| When a response is fresh, it can be used to satisfy subsequent | When a response is fresh, it can be used to satisfy subsequent | |||
| requests without contacting the origin server, thereby improving | requests without contacting the origin server, thereby improving | |||
| efficiency. | efficiency. | |||
| The primary mechanism for determining freshness is for an origin | The primary mechanism for determining freshness is for an origin | |||
| server to provide an explicit expiration time in the future, using | server to provide an explicit expiration time in the future, using | |||
| either the Expires header field (Section 5.3) or the max-age response | either the Expires header field (Section 5.3) or the max-age response | |||
| directive (Section 5.2.2.1). Generally, origin servers will assign | directive (Section 5.2.2.1). Generally, origin servers will assign | |||
| skipping to change at page 15, line 34 ¶ | skipping to change at page 15, line 19 ¶ | |||
| other than "GMT" to be invalid for calculating expiration. | other than "GMT" to be invalid for calculating expiration. | |||
| Note that freshness applies only to cache operation; it cannot be | Note that freshness applies only to cache operation; it cannot be | |||
| used to force a user agent to refresh its display or reload a | used to force a user agent to refresh its display or reload a | |||
| resource. See Section 6 for an explanation of the difference between | resource. See Section 6 for an explanation of the difference between | |||
| caches and history mechanisms. | caches and history mechanisms. | |||
| 4.2.1. Calculating Freshness Lifetime | 4.2.1. Calculating Freshness Lifetime | |||
| A cache can calculate the freshness lifetime (denoted as | A cache can calculate the freshness lifetime (denoted as | |||
| freshness_lifetime) of a response by using the first match of: | freshness_lifetime) of a response by evaluating the following rules | |||
| and using the first match: | ||||
| o If the cache is shared and the s-maxage response directive | o 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 | |||
| o If the max-age response directive (Section 5.2.2.1) is present, | o If the max-age response directive (Section 5.2.2.1) is present, | |||
| use its value, or | use its value, or | |||
| o If the Expires response header field (Section 5.3) is present, use | o 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 | |||
| skipping to change at page 16, line 11 ¶ | skipping to change at page 15, line 43 ¶ | |||
| o Otherwise, no explicit expiration time is present in the response. | o 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 | |||
| (e.g., two Expires header field lines or multiple Cache-Control: max- | (e.g., two Expires header field lines or multiple Cache-Control: max- | |||
| age directives), either the first occurrence should be used, or the | age directives), either the first occurrence should be used or the | |||
| response should be considered stale. If directives conflict (e.g., | response should be considered stale. If directives conflict (e.g., | |||
| both max-age and no-cache are present), the most restrictive | both max-age and no-cache are present), the most restrictive | |||
| directive should be honored. Caches are encouraged to consider | directive should be honored. Caches are encouraged to consider | |||
| responses that have invalid freshness information (e.g., a max-age | responses that have invalid freshness information (e.g., a max-age | |||
| directive with non-integer content) to be stale. | directive with non-integer content) to be stale. | |||
| 4.2.2. Calculating Heuristic Freshness | 4.2.2. Calculating Heuristic Freshness | |||
| Since origin servers do not always provide explicit expiration times, | Since origin servers do not always provide explicit expiration times, | |||
| 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 field values | is not specified, employing algorithms that use other field values | |||
| (such as the Last-Modified time) to estimate a plausible expiration | (such as the Last-Modified time) to estimate a plausible expiration | |||
| time. This specification does not provide specific algorithms, but | time. This specification does not provide specific algorithms, but | |||
| does impose worst-case constraints on their results. | it 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 heuristics can only | of the requirements in Section 3, heuristics can only be used on | |||
| be used on responses without explicit freshness whose status codes | responses without explicit freshness whose status codes are defined | |||
| are defined as _heuristically cacheable_ (e.g., see Section 15.1 of | as "heuristically cacheable" (e.g., see Section 15.1 of [HTTP]) and | |||
| [HTTP]), and those responses without explicit freshness that have | on responses without explicit freshness that have been marked as | |||
| been marked as explicitly cacheable (e.g., with a "public" response | explicitly cacheable (e.g., with a public response directive). | |||
| directive). | ||||
| Note that in previous specifications heuristically cacheable response | Note that in previous specifications, heuristically cacheable | |||
| status codes were called "cacheable by default." | response status codes were called "cacheable by default". | |||
| If the response has a Last-Modified header field (Section 8.8.2 of | If the response has a Last-Modified header field (Section 8.8.2 of | |||
| [HTTP]), caches are encouraged to use a heuristic expiration value | [HTTP]), caches are encouraged to use a heuristic expiration value | |||
| that is no more than some fraction of the interval since that time. | that is no more than some fraction of the interval since that time. | |||
| A typical setting of this fraction might be 10%. | A typical setting of this fraction might be 10%. | |||
| | *Note:* Section 13.9 of [RFC2616] prohibited caches from | | *Note:* A previous version of the HTTP specification | |||
| | calculating heuristic freshness for URIs with query components | | (Section 13.9 of [RFC2616]) prohibited caches from calculating | |||
| | (i.e., those containing '?'). In practice, this has not been | | heuristic freshness for URIs with query components (i.e., those | |||
| | widely implemented. Therefore, origin servers are encouraged | | containing "?"). In practice, this has not been widely | |||
| | to send explicit directives (e.g., Cache-Control: no-cache) if | | implemented. Therefore, origin servers are encouraged to send | |||
| | they wish to prevent caching. | | explicit directives (e.g., Cache-Control: no-cache) if they | |||
| | wish to prevent caching. | ||||
| 4.2.3. Calculating Age | 4.2.3. Calculating Age | |||
| The Age header field is used to convey an estimated age of the | The Age header field is used to convey an estimated age of the | |||
| response message when obtained from a cache. The Age field value is | response message when obtained from a cache. The Age field value is | |||
| the cache's estimate of the number of seconds since the origin server | the cache's estimate of the number of seconds since the origin server | |||
| generated or validated the response. The Age value is therefore the | generated or validated the response. The Age value is therefore the | |||
| sum of the time that the response has been resident in each of the | sum of the time that the response has been resident in each of the | |||
| caches along the path from the origin server, plus the time it has | caches along the path from the origin server, plus the time it has | |||
| 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" | |||
| field (Section 5.1), in a form appropriate for arithmetic | The term "age_value" denotes the value of the Age header field | |||
| operation; or 0, if not available. | (Section 5.1), in a form appropriate for arithmetic operation; or | |||
| 0, if not available. | ||||
| _date_value_ The term "date_value" denotes the value of the Date | "date_value" | |||
| header field, in a form appropriate for arithmetic operations. | The term "date_value" denotes the value of the Date header field, | |||
| See Section 6.6.1 of [HTTP] for the definition of the Date header | in a form appropriate for arithmetic operations. See | |||
| field, and for requirements regarding responses without it. | Section 6.6.1 of [HTTP] for the definition of the Date header | |||
| field and for requirements regarding responses without it. | ||||
| _now_ The term "now" means the current value of this | "now" | |||
| implementation's clock (Section 5.6.7 of [HTTP]). | The term "now" means the current value of this implementation's | |||
| clock (Section 5.6.7 of [HTTP]). | ||||
| _request_time_ The value of the clock at the time of the request | "request_time" | |||
| that resulted in the stored response. | The value of the clock at the time of the request that resulted in | |||
| the stored response. | ||||
| _response_time_ The value of the clock at the time the response was | "response_time" | |||
| received. | The value of the clock at the time the response was 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 | 1. the "apparent_age": response_time minus date_value, if the | |||
| implementation's clock is reasonably well synchronized to the | implementation's clock is reasonably well synchronized to the | |||
| origin server's clock. If the result is negative, the result is | origin server's clock. If the result is negative, the result is | |||
| replaced by 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 | |||
| skipping to change at page 18, line 26 ¶ | skipping to change at page 18, line 19 ¶ | |||
| resident_time = now - response_time; | resident_time = now - response_time; | |||
| current_age = corrected_initial_age + resident_time; | current_age = corrected_initial_age + resident_time; | |||
| 4.2.4. Serving Stale Responses | 4.2.4. Serving Stale Responses | |||
| A "stale" response is one that either has explicit expiry information | A "stale" response is one that either has explicit expiry information | |||
| or is allowed to have heuristic expiry calculated, but is not fresh | or is allowed to have heuristic expiry calculated, but is not fresh | |||
| according to the calculations in Section 4.2. | according to the calculations in Section 4.2. | |||
| A cache MUST NOT generate a stale response if it is prohibited by an | A cache MUST NOT generate a stale response if it is prohibited by an | |||
| explicit in-protocol directive (e.g., by a "no-cache" cache | explicit in-protocol directive (e.g., by a no-cache response | |||
| directive, a "must-revalidate" cache-response-directive, or an | directive, a must-revalidate response directive, or an applicable | |||
| applicable "s-maxage" or "proxy-revalidate" cache-response-directive; | s-maxage or proxy-revalidate response directive; see Section 5.2.2). | |||
| see Section 5.2.2). | ||||
| 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, extension | |||
| extension directives such as those defined in [RFC5861], or by | directives such as those defined in [RFC5861], or configuration in | |||
| configuration in accordance with an out-of-band contract). | 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 chosen; 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 of [HTTP]) in the forwarded request to | |||
| to give the next inbound server an opportunity to choose a valid | give the next inbound server an opportunity to choose a valid stored | |||
| stored response to use, updating the stored metadata in the process, | response to use, updating the stored metadata in the process, or to | |||
| or to replace the stored response(s) with a new response. This | replace the stored response(s) with a new response. This process is | |||
| process is known as _validating_ or _revalidating_ the stored | 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 either | |||
| with either a request it is attempting to satisfy, or -- if it is | starts with a request it is attempting to satisfy or -- if it is | |||
| initiating the request independently -- it synthesises a request | initiating the request independently -- synthesizes a request using a | |||
| using a stored response by copying the method, target URI, and | stored response by copying the method, target URI, and request header | |||
| request header fields identified by the Vary header field | 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 a stored | |||
| response(s) that have the same URI. Typically, this will include | response(s) that has the same URI. Typically, this will include only | |||
| only those stored responses(s) that have the same cache key, although | the stored response(s) that has the same cache key, although a cache | |||
| a cache is allowed to validate a response that it cannot choose with | is allowed to validate a response that it cannot choose with the | |||
| the request header fields it is sending (see Section 4.1). | 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., | |||
| the client is referring specifically to a previously obtained | the client is referring specifically to a previously obtained | |||
| 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: | When generating a conditional request for validation, a cache: | |||
| o MUST send the relevant entity-tags (using If-Match, If-None-Match, | o MUST send the relevant entity tags (using If-Match, If-None-Match, | |||
| or If-Range) if the entity-tags were provided in the stored | or If-Range) if the entity tags were provided in the stored | |||
| response(s) being validated. | response(s) being validated. | |||
| o SHOULD send the Last-Modified value (using If-Modified-Since) if | o SHOULD send the Last-Modified value (using If-Modified-Since) if | |||
| the request is not for a subrange, a single stored response is | the request is not for a subrange, a single stored response is | |||
| being validated, and that response contains a Last-Modified value. | being validated, and that response contains a Last-Modified value. | |||
| o MAY send the Last-Modified value (using If-Unmodified-Since or If- | o MAY send the Last-Modified value (using If-Unmodified-Since or If- | |||
| Range) if the request is for a subrange, a single stored response | Range) if the request is for a subrange, a single stored response | |||
| is being validated, and that response contains only a Last- | is being validated, and that response contains only a Last- | |||
| Modified value (not an entity-tag). | Modified value (not an entity tag). | |||
| In most cases, both validators are generated in cache validation | In most cases, both validators are generated in cache validation | |||
| requests, even when entity-tags are clearly superior, to allow old | requests, even when entity tags are clearly superior, to allow old | |||
| intermediaries that do not understand entity-tag preconditions to | intermediaries that do not understand entity tag preconditions to | |||
| respond appropriately. | 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. | |||
| skipping to change at page 21, line 18 ¶ | skipping to change at page 21, line 7 ¶ | |||
| field is present, the time that the stored response was received) to | field is present, the time that the stored response was 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]) with respect to the | If-Range header field (Section 13.1.5 of [HTTP]) with respect to the | |||
| cache's chosen 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 | |||
| forwarded request is 304 (Not Modified) and has an ETag field value | forwarded request is 304 (Not Modified) and has an ETag field value | |||
| with an entity-tag that is not in the client's list, the cache MUST | with an entity tag that is not in the client's list, the cache MUST | |||
| generate a 200 (OK) response for the client by reusing its | generate a 200 (OK) response for the client by reusing its | |||
| corresponding stored response, as updated by the 304 response | corresponding stored response, as updated by the 304 response | |||
| metadata (Section 4.3.4). | metadata (Section 4.3.4). | |||
| 4.3.3. Handling a Validation Response | 4.3.3. Handling a Validation Response | |||
| Cache handling of a response to a conditional request depends upon | Cache handling of a response to a conditional request depends upon | |||
| its status code: | its status code: | |||
| o A 304 (Not Modified) response status code indicates that the | o A 304 (Not Modified) response status code indicates that the | |||
| stored response can be updated and reused; see Section 4.3.4. | stored response can be updated and reused; see Section 4.3.4. | |||
| o A full response (i.e., one containing content) indicates that none | o A full response (i.e., one containing content) indicates that none | |||
| of the stored responses nominated in the conditional request is | of the stored responses nominated in the conditional request are | |||
| suitable. Instead, the cache MUST use the full response to | suitable. Instead, the cache MUST use the full response to | |||
| satisfy the request. The cache MAY store such a full response, | satisfy the request. The cache MAY store such a full response, | |||
| subject to its constraints (see Section 3). | subject to its constraints (see Section 3). | |||
| o However, if a cache receives a 5xx (Server Error) response while | o However, if a cache receives a 5xx (Server Error) response while | |||
| attempting to validate a response, it can either forward this | attempting to validate a response, it can either forward this | |||
| response to the requesting client, or act as if the server failed | response to the requesting client or act as if the server failed | |||
| to respond. In the latter case, the cache can send a previously | to respond. In the latter case, the cache can send a previously | |||
| 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 chosen 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 responses is further filtered by the | |||
| the first match of: | first match of: | |||
| o If the new response contains one or more _strong validators_ (see | o 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 | identifies 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 | |||
| validators are identified for update. If none of the initial set | validators are identified for update. If none of the initial set | |||
| contain at least one of the same strong validators, then the cache | contains at least one of the same strong validators, then the | |||
| MUST NOT use the new response to update any stored responses. | cache MUST NOT use the new response to update any stored | |||
| responses. | ||||
| o If the new response contains no strong validators but does contain | o If the new response contains no strong validators but does contain | |||
| one or more _weak validators_, and those validators correspond to | one or more "weak validators", and those validators correspond to | |||
| one of the initial set's stored responses, then the most recent of | one of the initial set's stored responses, then the most recent of | |||
| those matching stored responses is identified for update. | those matching stored responses is identified for update. | |||
| o If the new response does not include any form of validator (such | o If the new response does not include any form of validator (such | |||
| as where a client generates an If-Modified-Since request from a | as where a client generates an If-Modified-Since request from a | |||
| source other than the Last-Modified response header field), and | source other than the Last-Modified response header field), and | |||
| there is only one stored response in the initial set, and that | there is only one stored response in the initial set, and that | |||
| stored response also lacks a validator, then that stored response | stored response also lacks a validator, then that stored response | |||
| is identified for update. | is identified for update. | |||
| skipping to change at page 23, line 25 ¶ | skipping to change at page 23, line 20 ¶ | |||
| 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). | |||
| 4.4. Invalidating Stored Responses | 4.4. Invalidating Stored Responses | |||
| Because unsafe request methods (Section 9.2.1 of [HTTP]) such as PUT, | Because unsafe request methods (Section 9.2.1 of [HTTP]) such as PUT, | |||
| POST or DELETE have the potential for changing state on the origin | POST, or DELETE have the potential for changing state on the origin | |||
| server, intervening caches are required to invalidate stored | server, intervening caches are required to invalidate stored | |||
| responses to keep their contents up to date. | responses to keep their contents up to date. | |||
| A cache MUST invalidate the target URI (Section 7.1 of [HTTP]) when | A cache MUST invalidate the target URI (Section 7.1 of [HTTP]) when | |||
| it receives a non-error status code in response to an unsafe request | it receives a non-error status code in response to an unsafe request | |||
| method (including methods whose safety is unknown). | method (including methods whose safety is unknown). | |||
| A cache MAY invalidate other URIs when it receives a non-error status | A cache MAY invalidate other URIs when it receives a non-error status | |||
| code in response to an unsafe request method (including methods whose | code in response to an unsafe request method (including methods whose | |||
| safety is unknown). In particular, the URI(s) in the Location and | safety is unknown). In particular, the URI(s) in the Location and | |||
| Content-Location response header fields (if present) are candidates | Content-Location response header fields (if present) are candidates | |||
| for invalidation; other URIs might be discovered through mechanisms | for invalidation; other URIs might be discovered through mechanisms | |||
| not specified in this document. However, a cache MUST NOT trigger an | not specified in this document. However, a cache MUST NOT trigger an | |||
| invalidation under these conditions if the origin (Section 4.3.1 of | invalidation under these conditions if the origin (Section 4.3.1 of | |||
| [HTTP]) of the URI to be invalidated differs from that of the target | [HTTP]) of the URI to be invalidated differs from that of the target | |||
| URI (Section 7.1 of [HTTP]). This helps prevent denial-of-service | URI (Section 7.1 of [HTTP]). This helps prevent denial-of-service | |||
| attacks. | attacks. | |||
| _Invalidate_ means that the cache will either remove all stored | "Invalidate" means that the cache will either remove all stored | |||
| responses whose target URI matches the given URI, or will mark them | responses whose target URI matches the given URI or mark them as | |||
| as "invalid" and in need of a mandatory validation before they can be | "invalid" and in need of a mandatory validation before they can be | |||
| sent in response to a subsequent request. | sent in response to a subsequent request. | |||
| A "non-error response" is one with a 2xx (Successful) or 3xx | A "non-error response" is one with a 2xx (Successful) or 3xx | |||
| (Redirection) status code. | (Redirection) status code. | |||
| Note that this does not guarantee that all appropriate responses are | Note that this does not guarantee that all appropriate responses are | |||
| invalidated globally; a state-changing request would only invalidate | invalidated globally; a state-changing request would only invalidate | |||
| responses in the caches it travels through. | responses in the caches it travels through. | |||
| 5. Field Definitions | 5. Field Definitions | |||
| skipping to change at page 24, line 42 ¶ | skipping to change at page 24, line 38 ¶ | |||
| negative integer), a cache SHOULD ignore the field. | negative integer), a cache SHOULD ignore the field. | |||
| The presence of an Age header field implies that the response was not | The presence of an Age header field implies that the response was not | |||
| generated or validated by the origin server for this request. | generated or validated by the origin server for this request. | |||
| However, lack of an Age header field does not imply the origin was | However, lack of an Age header field does not imply the origin was | |||
| contacted. | contacted. | |||
| 5.2. Cache-Control | 5.2. Cache-Control | |||
| The "Cache-Control" header field is used to list directives for | The "Cache-Control" header field is used to list directives for | |||
| caches along the request/response chain. Such cache directives are | caches along the request/response chain. Cache directives are | |||
| unidirectional in that the presence of a directive in a request does | unidirectional, in that the presence of a directive in a request does | |||
| not imply that the same directive is present in the response, or to | not imply that the same directive is present or copied in the | |||
| be repeated in it. | response. | |||
| See Section 5.2.3 for information about how Cache-Control directives | See Section 5.2.3 for information about how Cache-Control directives | |||
| defined elsewhere are handled. | defined elsewhere are handled. | |||
| A proxy, whether or not it implements a cache, MUST pass cache | A proxy, whether or not it implements a cache, MUST pass cache | |||
| directives through in forwarded messages, regardless of their | directives through in forwarded messages, regardless of their | |||
| significance to that application, since the directives might apply to | significance to that application, since the directives might apply to | |||
| all recipients along the request/response chain. It is not possible | all recipients along the request/response chain. It is not possible | |||
| to target a directive to a specific cache. | to target a directive to a specific cache. | |||
| skipping to change at page 25, line 24 ¶ | skipping to change at page 25, line 18 ¶ | |||
| define arguments, recipients ought to accept both forms, even if a | define arguments, recipients ought to accept both forms, even if a | |||
| specific form is required for generation. | specific form is required for generation. | |||
| Cache-Control = #cache-directive | Cache-Control = #cache-directive | |||
| cache-directive = token [ "=" ( token / quoted-string ) ] | cache-directive = token [ "=" ( token / quoted-string ) ] | |||
| For the cache directives defined below, no argument is defined (nor | For the cache directives defined below, no argument is defined (nor | |||
| allowed) unless stated otherwise. | allowed) unless stated otherwise. | |||
| 5.2.1. Request Cache-Control Directives | 5.2.1. Request Directives | |||
| This section defines cache request directives. They are advisory; | This section defines cache request directives. They are advisory; | |||
| caches MAY implement them, but are not required to. | caches MAY implement them, but are not required to. | |||
| 5.2.1.1. max-age | 5.2.1.1. max-age | |||
| Argument syntax: | Argument syntax: | |||
| delta-seconds (see Section 1.2.2) | delta-seconds (see Section 1.2.2) | |||
| The "max-age" request directive indicates that the client prefers a | The max-age request directive indicates that the client prefers a | |||
| response whose age is less than or equal to the specified number of | response whose age is less than or equal to the specified number of | |||
| seconds. Unless the max-stale request directive is also present, the | seconds. Unless the max-stale request directive is also present, the | |||
| client does not wish to receive a stale response. | client does not wish to receive a stale response. | |||
| This directive uses the token form of the argument syntax: e.g., | This directive uses the token form of the argument syntax: e.g., | |||
| 'max-age=5' not 'max-age="5"'. A sender MUST NOT generate the | 'max-age=5' not 'max-age="5"'. A sender MUST NOT generate the | |||
| quoted-string form. | quoted-string form. | |||
| 5.2.1.2. max-stale | 5.2.1.2. max-stale | |||
| Argument syntax: | Argument syntax: | |||
| delta-seconds (see Section 1.2.2) | delta-seconds (see Section 1.2.2) | |||
| The "max-stale" request directive indicates that the client will | The max-stale request directive indicates that the client will accept | |||
| accept a response that has exceeded its freshness lifetime. If a | a response that has exceeded its freshness lifetime. If a value is | |||
| value is present, then the client is willing to accept a response | present, then the client is willing to accept a response that has | |||
| that has exceeded its freshness lifetime by no more than the | exceeded its freshness lifetime by no more than the specified number | |||
| specified number of seconds. If no value is assigned to max-stale, | of seconds. If no value is assigned to max-stale, then the client | |||
| then the client will accept a stale response of any age. | will accept a stale response of any age. | |||
| This directive uses the token form of the argument syntax: e.g., | This directive uses the token form of the argument syntax: e.g., | |||
| 'max-stale=10' not 'max-stale="10"'. A sender MUST NOT generate the | 'max-stale=10' not 'max-stale="10"'. A sender MUST NOT generate the | |||
| quoted-string form. | quoted-string form. | |||
| 5.2.1.3. min-fresh | 5.2.1.3. min-fresh | |||
| Argument syntax: | Argument syntax: | |||
| delta-seconds (see Section 1.2.2) | delta-seconds (see Section 1.2.2) | |||
| The "min-fresh" request directive indicates that the client prefers a | The min-fresh request directive indicates that the client prefers a | |||
| response whose freshness lifetime is no less than its current age | response whose freshness lifetime is no less than its current age | |||
| plus the specified time in seconds. That is, the client wants a | plus the specified time in seconds. That is, the client wants a | |||
| response that will still be fresh for at least the specified number | response that will still be fresh for at least the specified number | |||
| of seconds. | of seconds. | |||
| This directive uses the token form of the argument syntax: e.g., | This directive uses the token form of the argument syntax: e.g., | |||
| 'min-fresh=20' not 'min-fresh="20"'. A sender MUST NOT generate the | 'min-fresh=20' not 'min-fresh="20"'. A sender MUST NOT generate the | |||
| quoted-string form. | quoted-string form. | |||
| 5.2.1.4. no-cache | 5.2.1.4. no-cache | |||
| The "no-cache" request directive indicates that the client prefers | The no-cache request directive indicates that the client prefers a | |||
| stored response not be used to satisfy the request without successful | stored response not be used to satisfy the request without successful | |||
| validation on the origin server. | validation on the origin server. | |||
| 5.2.1.5. no-store | 5.2.1.5. no-store | |||
| The "no-store" request directive indicates that a cache MUST NOT | The no-store request directive indicates that a cache MUST NOT store | |||
| store any part of either this request or any response to it. This | any part of either this request or any response to it. This | |||
| directive applies to both private and shared caches. "MUST NOT | directive applies to both private and shared caches. "MUST NOT | |||
| store" in this context means that the cache MUST NOT intentionally | store" in this context means that the cache MUST NOT intentionally | |||
| store the information in non-volatile storage, and MUST make a best- | store the information in non-volatile storage and MUST make a best- | |||
| effort attempt to remove the information from volatile storage as | effort attempt to remove the information from volatile storage as | |||
| promptly as possible after forwarding it. | promptly as possible after forwarding it. | |||
| This directive is _not_ a reliable or sufficient mechanism for | This directive is not a reliable or sufficient mechanism for ensuring | |||
| ensuring privacy. In particular, malicious or compromised caches | privacy. In particular, malicious or compromised caches might not | |||
| might not recognize or obey this directive, and communications | recognize or obey this directive, and communications networks might | |||
| networks might be vulnerable to eavesdropping. | be vulnerable to eavesdropping. | |||
| Note that if a request containing this directive is satisfied from a | Note that if a request containing this directive is satisfied from a | |||
| cache, the no-store request directive does not apply to the already | cache, the no-store request directive does not apply to the already | |||
| stored response. | stored response. | |||
| 5.2.1.6. no-transform | 5.2.1.6. no-transform | |||
| The "no-transform" request directive indicates that the client is | The no-transform request directive indicates that the client is | |||
| asking for intermediaries to avoid transforming the content, as | asking for intermediaries to avoid transforming the content, as | |||
| defined in Section 7.7 of [HTTP]. | defined in Section 7.7 of [HTTP]. | |||
| 5.2.1.7. only-if-cached | 5.2.1.7. only-if-cached | |||
| The "only-if-cached" request directive indicates that the client only | The only-if-cached request directive indicates that the client only | |||
| wishes to obtain a stored response. Caches that honor this request | wishes to obtain a stored response. Caches that honor this request | |||
| directive SHOULD, upon receiving it, either respond using a stored | directive SHOULD, upon receiving it, respond with either a stored | |||
| response consistent with the other constraints of the request, or | response consistent with the other constraints of the request or a | |||
| respond with a 504 (Gateway Timeout) status code. | 504 (Gateway Timeout) status code. | |||
| 5.2.2. Response Cache-Control Directives | 5.2.2. Response Directives | |||
| This section defines cache response directives. A cache MUST obey | This section defines cache response directives. A cache MUST obey | |||
| the Cache-Control directives defined in this section. | the Cache-Control directives defined in this section. | |||
| 5.2.2.1. max-age | 5.2.2.1. max-age | |||
| Argument syntax: | Argument syntax: | |||
| delta-seconds (see Section 1.2.2) | delta-seconds (see Section 1.2.2) | |||
| The "max-age" response directive indicates that the response is to be | The max-age response directive indicates that the response is to be | |||
| considered stale after its age is greater than the specified number | considered stale after its age is greater than the specified number | |||
| of seconds. | of seconds. | |||
| This directive uses the token form of the argument syntax: e.g., | This directive uses the token form of the argument syntax: e.g., | |||
| 'max-age=5' not 'max-age="5"'. A sender MUST NOT generate the | 'max-age=5' not 'max-age="5"'. A sender MUST NOT generate the | |||
| quoted-string form. | quoted-string form. | |||
| 5.2.2.2. must-revalidate | 5.2.2.2. must-revalidate | |||
| The "must-revalidate" response directive indicates that once the | The must-revalidate response directive indicates that once the | |||
| response has become stale, a cache MUST NOT reuse that response to | response has become stale, a cache MUST NOT reuse that response to | |||
| satisfy another request until it has been successfully validated by | satisfy another request until it has been successfully validated by | |||
| the origin, as defined by Section 4.3. | the origin, as defined by Section 4.3. | |||
| The must-revalidate directive is necessary to support reliable | The must-revalidate directive is necessary to support reliable | |||
| operation for certain protocol features. In all circumstances a | operation for certain protocol features. In all circumstances, a | |||
| cache MUST NOT ignore the must-revalidate directive; in particular, | cache MUST NOT ignore the must-revalidate directive; in particular, | |||
| if a cache is disconnected, the cache MUST generate an error response | if a cache is disconnected, the cache MUST generate an error response | |||
| rather than reuse the stale response. The generated status code | rather than reuse the stale response. The generated status code | |||
| SHOULD be 504 (Gateway Timeout) unless another error status code is | SHOULD be 504 (Gateway Timeout) unless another error status code is | |||
| more applicable. | more applicable. | |||
| The must-revalidate directive ought to be used by servers if and only | The must-revalidate directive ought to be used by servers if and only | |||
| if failure to validate a request could cause incorrect operation, | if failure to validate a request could cause incorrect operation, | |||
| such as a silently unexecuted financial transaction. | such as a silently unexecuted financial transaction. | |||
| The must-revalidate directive also permits a shared cache to reuse a | The must-revalidate directive also permits a shared cache to reuse a | |||
| response to a request containing an Authorization header field | response to a request containing an Authorization header field | |||
| (Section 11.6.2 of [HTTP]), subject to the above requirement on | (Section 11.6.2 of [HTTP]), subject to the above requirement on | |||
| revalidation (Section 3.5). | revalidation (Section 3.5). | |||
| 5.2.2.3. must-understand | 5.2.2.3. must-understand | |||
| The "must-understand" response directive limits caching of the | The must-understand response directive limits caching of the response | |||
| response to a cache that understands and conforms to the requirements | to a cache that understands and conforms to the requirements for that | |||
| for that response's status code. | response's status code. | |||
| Responses containing "must-understand" SHOULD also contain the "no- | A response that contains the must-understand directive SHOULD also | |||
| store" directive; caches that implement "must-understand" SHOULD | contain the no-store directive. When a cache that implements the | |||
| ignore the "no-store" directive in responses that contain both | must-understand directive receives a response that includes it, the | |||
| directives and a status code that the cache understands and conforms | cache SHOULD ignore the no-store directive if it understands and | |||
| to any related caching requirements. | implements the status code's caching requirements. | |||
| 5.2.2.4. no-cache | 5.2.2.4. no-cache | |||
| Argument syntax: | Argument syntax: | |||
| #field-name | #field-name | |||
| The "no-cache" response directive, in its unqualified form (without | The no-cache response directive, in its unqualified form (without an | |||
| an argument), indicates that the response MUST NOT be used to satisfy | argument), indicates that the response MUST NOT be used to satisfy | |||
| any other request without forwarding it for validation and receiving | any other request without forwarding it for validation and receiving | |||
| a successful response; see Section 4.3. | a successful response; see Section 4.3. | |||
| This allows an origin server to prevent a cache from using the | This allows an origin server to prevent a cache from using the | |||
| response to satisfy a request without contacting it, even by caches | response to satisfy a request without contacting it, even by caches | |||
| that have been configured to send stale responses. | that have been configured to send stale responses. | |||
| The qualified form of no-cache response directive, with an argument | The qualified form of the no-cache response directive, with an | |||
| that lists one or more field names, indicates that a cache MAY use | argument that lists one or more field names, indicates that a cache | |||
| the response to satisfy a subsequent request, subject to any other | MAY use the response to satisfy a subsequent request, subject to any | |||
| restrictions on caching, if the listed header fields are excluded | other restrictions on caching, if the listed header fields are | |||
| from the subsequent response or the subsequent response has been | excluded from the subsequent response or the subsequent response has | |||
| successfully revalidated with the origin server (updating or removing | been successfully revalidated with the origin server (updating or | |||
| those fields). This allows an origin server to prevent the re-use of | removing those fields). This allows an origin server to prevent the | |||
| certain header fields in a response, while still allowing caching of | reuse of certain header fields in a response, while still allowing | |||
| the rest of the response. | caching of the rest of the response. | |||
| The field names given are not limited to the set of header fields | The field names given are not limited to the set of header fields | |||
| defined by this specification. Field names are case-insensitive. | defined by this specification. Field names are case-insensitive. | |||
| This directive uses the quoted-string form of the argument syntax. A | This directive uses the quoted-string form of the argument syntax. A | |||
| sender SHOULD NOT generate the token form (even if quoting appears | sender SHOULD NOT generate the token form (even if quoting appears | |||
| not to be needed for single-entry lists). | not to be needed for single-entry lists). | |||
| | *Note:* The qualified form of the directive is often handled by | | *Note:* The qualified form of the directive is often handled by | |||
| | caches as if an unqualified no-cache directive was received; | | caches as if an unqualified no-cache directive was received; | |||
| | i.e., the special handling for the qualified form is not widely | | that is, the special handling for the qualified form is not | |||
| | implemented. | | widely implemented. | |||
| 5.2.2.5. no-store | 5.2.2.5. no-store | |||
| The "no-store" response directive indicates that a cache MUST NOT | The no-store response directive indicates that a cache MUST NOT store | |||
| store any part of either the immediate request or response, and MUST | any part of either the immediate request or the response and MUST NOT | |||
| NOT use the response to satisfy any other request. | use the response to satisfy any other request. | |||
| This directive applies to both private and shared caches. "MUST NOT | This directive applies to both private and shared caches. "MUST NOT | |||
| store" in this context means that the cache MUST NOT intentionally | store" in this context means that the cache MUST NOT intentionally | |||
| store the information in non-volatile storage, and MUST make a best- | store the information in non-volatile storage and MUST make a best- | |||
| effort attempt to remove the information from volatile storage as | effort attempt to remove the information from volatile storage as | |||
| promptly as possible after forwarding it. | promptly as possible after forwarding it. | |||
| This directive is _not_ a reliable or sufficient mechanism for | This directive is not a reliable or sufficient mechanism for ensuring | |||
| ensuring privacy. In particular, malicious or compromised caches | privacy. In particular, malicious or compromised caches might not | |||
| might not recognize or obey this directive, and communications | recognize or obey this directive, and communications networks might | |||
| networks might be vulnerable to eavesdropping. | be vulnerable to eavesdropping. | |||
| Note that the "must-understand" cache directive overrides "no-store" | Note that the must-understand cache directive overrides no-store in | |||
| in certain circumstances; see Section 5.2.2.3. | certain circumstances; see Section 5.2.2.3. | |||
| 5.2.2.6. no-transform | 5.2.2.6. no-transform | |||
| The "no-transform" response directive indicates that an intermediary | The no-transform response directive indicates that an intermediary | |||
| (regardless of whether it implements a cache) MUST NOT transform the | (regardless of whether it implements a cache) MUST NOT transform the | |||
| content, as defined in Section 7.7 of [HTTP]. | content, as defined in Section 7.7 of [HTTP]. | |||
| 5.2.2.7. private | 5.2.2.7. private | |||
| Argument syntax: | Argument syntax: | |||
| #field-name | #field-name | |||
| The unqualified "private" response directive indicates that a shared | The unqualified private response directive indicates that a shared | |||
| cache MUST NOT store the response (i.e., the response is intended for | cache MUST NOT store the response (i.e., the response is intended for | |||
| a single user). It also indicates that a private cache MAY store the | a single user). It also indicates that a private cache MAY store the | |||
| response, subject the constraints defined in Section 3, even if the | response, subject to the constraints defined in Section 3, even if | |||
| response would not otherwise be heuristically cacheable by a private | the response would not otherwise be heuristically cacheable by a | |||
| cache. | private cache. | |||
| If a qualified private response directive is present, with an | If a qualified private response directive is present, with an | |||
| argument that lists one or more field names, then only the listed | argument that lists one or more field names, then only the listed | |||
| header fields are limited to a single user: a shared cache MUST NOT | header fields are limited to a single user: a shared cache MUST NOT | |||
| store the listed header fields if they are present in the original | store the listed header fields if they are present in the original | |||
| response, but MAY store the remainder of the response message without | response but MAY store the remainder of the response message without | |||
| those header fields, subject the constraints defined in Section 3. | those header fields, subject the constraints defined in Section 3. | |||
| The field names given are not limited to the set of header fields | The field names given are not limited to the set of header fields | |||
| defined by this specification. Field names are case-insensitive. | defined by this specification. Field names are case-insensitive. | |||
| This directive uses the quoted-string form of the argument syntax. A | This directive uses the quoted-string form of the argument syntax. A | |||
| sender SHOULD NOT generate the token form (even if quoting appears | sender SHOULD NOT generate the token form (even if quoting appears | |||
| not to be needed for single-entry lists). | not to be needed for single-entry lists). | |||
| | *Note:* This usage of the word "private" only controls where | | *Note:* This usage of the word "private" only controls where | |||
| | the response can be stored; it cannot ensure the privacy of the | | the response can be stored; it cannot ensure the privacy of the | |||
| | message content. Also, the qualified form of the directive is | | message content. Also, the qualified form of the directive is | |||
| | often handled by caches as if an unqualified private directive | | often handled by caches as if an unqualified private directive | |||
| | was received; i.e., the special handling for the qualified form | | was received; that is, the special handling for the qualified | |||
| | is not widely implemented. | | form is not widely implemented. | |||
| 5.2.2.8. proxy-revalidate | 5.2.2.8. proxy-revalidate | |||
| The "proxy-revalidate" response directive indicates that once the | The proxy-revalidate response directive indicates that once the | |||
| response has become stale, a shared cache MUST NOT reuse that | response has become stale, a shared cache MUST NOT reuse that | |||
| response to satisfy another request until it has been successfully | response to satisfy another request until it has been successfully | |||
| validated by the origin, as defined by Section 4.3. This is | validated by the origin, as defined by Section 4.3. This is | |||
| analogous to must-revalidate (Section 5.2.2.2), except that proxy- | analogous to must-revalidate (Section 5.2.2.2), except that proxy- | |||
| revalidate does not apply to private caches. | revalidate does not apply to private caches. | |||
| Note that "proxy-revalidate" on its own does not imply that a | Note that proxy-revalidate on its own does not imply that a response | |||
| response is cacheable. For example, it might be combined with the | is cacheable. For example, it might be combined with the public | |||
| public directive (Section 5.2.2.9), allowing the response to be | directive (Section 5.2.2.9), allowing the response to be cached while | |||
| cached while requiring only a shared cache to revalidate when stale. | requiring only a shared cache to revalidate when stale. | |||
| 5.2.2.9. public | 5.2.2.9. public | |||
| The "public" response directive indicates that a cache MAY store the | The public response directive indicates that a cache MAY store the | |||
| response even if it would otherwise be prohibited, subject to the | response even if it would otherwise be prohibited, subject to the | |||
| constraints defined in Section 3. In other words, public explicitly | constraints defined in Section 3. In other words, public explicitly | |||
| marks the response as cacheable. For example, public permits a | marks the response as cacheable. For example, public permits a | |||
| shared cache to reuse a response to a request containing an | shared cache to reuse a response to a request containing an | |||
| Authorization header field (Section 3.5). | Authorization header field (Section 3.5). | |||
| Note that it is unnecessary to add the public directive to a response | Note that it is unnecessary to add the public directive to a response | |||
| that is already cacheable according to Section 3. | that is already cacheable according to Section 3. | |||
| If a response with the public directive has no explicit freshness | If a response with the public directive has no explicit freshness | |||
| information, it is heuristically cacheable (Section 4.2.2). | information, it is heuristically cacheable (Section 4.2.2). | |||
| 5.2.2.10. s-maxage | 5.2.2.10. s-maxage | |||
| Argument syntax: | Argument syntax: | |||
| delta-seconds (see Section 1.2.2) | delta-seconds (see Section 1.2.2) | |||
| The "s-maxage" response directive indicates that, for a shared cache, | The s-maxage response directive indicates that, for a shared cache, | |||
| the maximum age specified by this directive overrides the maximum age | the maximum age specified by this directive overrides the maximum age | |||
| specified by either the max-age directive or the Expires header | specified by either the max-age directive or the Expires header | |||
| field. | field. | |||
| The s-maxage directive incorporates the proxy-revalidate | The s-maxage directive incorporates the semantics of the proxy- | |||
| (Section 5.2.2.8) response directive's semantics for a shared cache. | revalidate response directive (Section 5.2.2.8) for a shared cache. | |||
| A shared cache MUST NOT reuse a stale response with s-maxage to | A shared cache MUST NOT reuse a stale response with s-maxage to | |||
| satisfy another request until it has been successfully validated by | satisfy another request until it has been successfully validated by | |||
| the origin, as defined by Section 4.3. This directive also permits a | the origin, as defined by Section 4.3. This directive also permits a | |||
| shared cache to reuse a response to a request containing an | shared cache to reuse a response to a request containing an | |||
| Authorization header field, subject to the above requirements on | Authorization header field, subject to the above requirements on | |||
| maximum age and revalidation (Section 3.5). | maximum age and revalidation (Section 3.5). | |||
| This directive uses the token form of the argument syntax: e.g., | This directive uses the token form of the argument syntax: e.g., | |||
| 's-maxage=10' not 's-maxage="10"'. A sender MUST NOT generate the | 's-maxage=10' not 's-maxage="10"'. A sender MUST NOT generate the | |||
| quoted-string form. | quoted-string form. | |||
| 5.2.3. Cache Control Extensions | 5.2.3. Extension Directives | |||
| The Cache-Control header field can be extended through the use of one | The Cache-Control header field can be extended through the use of one | |||
| or more extension cache directives. A cache MUST ignore unrecognized | or more extension cache directives. A cache MUST ignore unrecognized | |||
| cache directives. | cache directives. | |||
| Informational extensions (those that do not require a change in cache | Informational extensions (those that do not require a change in cache | |||
| behavior) can be added without changing the semantics of other | behavior) can be added without changing the semantics of other | |||
| directives. | directives. | |||
| Behavioral extensions are designed to work by acting as modifiers to | Behavioral extensions are designed to work by acting as modifiers to | |||
| the existing base of cache directives. Both the new directive and | the existing base of cache directives. Both the new directive and | |||
| the old directive are supplied, such that applications that do not | the old directive are supplied, such that applications that do not | |||
| understand the new directive will default to the behavior specified | understand the new directive will default to the behavior specified | |||
| by the old directive, and those that understand the new directive | by the old directive, and those that understand the new directive | |||
| will recognize it as modifying the requirements associated with the | will recognize it as modifying the requirements associated with the | |||
| old directive. In this way, extensions to the existing cache-control | old directive. In this way, extensions to the existing cache | |||
| directives can be made without breaking deployed caches. | directives can be made without breaking deployed caches. | |||
| For example, consider a hypothetical new response directive called | For example, consider a hypothetical new response directive called | |||
| "community" that acts as a modifier to the private directive: in | "community" that acts as a modifier to the private directive: in | |||
| addition to private caches, any cache that is shared only by members | addition to private caches, only a cache that is shared by members of | |||
| of the named community is allowed to cache the response. An origin | the named community is allowed to cache the response. An origin | |||
| server wishing to allow the UCI community to use an otherwise private | server wishing to allow the UCI community to use an otherwise private | |||
| response in their shared cache(s) could do so by including | response in their shared cache(s) could do so by including | |||
| Cache-Control: private, community="UCI" | Cache-Control: private, community="UCI" | |||
| A cache that recognizes such a community cache directive could | A cache that recognizes such a community cache directive could | |||
| broaden its behavior in accordance with that extension. A cache that | broaden its behavior in accordance with that extension. A cache that | |||
| does not recognize the community cache directive would ignore it and | does not recognize the community cache directive would ignore it and | |||
| adhere to the private directive. | adhere to the private directive. | |||
| New extension directives ought to consider defining: | New extension directives ought to consider defining: | |||
| o What it means for a directive to be specified multiple times, | o What it means for a directive to be specified multiple times, | |||
| o When the directive does not take an argument, what it means when | o When the directive does not take an argument, what it means when | |||
| an argument is present, | an argument is present, | |||
| o When the directive requires an argument, what it means when it is | o When the directive requires an argument, what it means when it is | |||
| missing, | missing, and | |||
| o Whether the directive is specific to requests, responses, or able | o Whether the directive is specific to requests, specific to | |||
| to be used in either. | responses, or able to be used in either. | |||
| 5.2.4. Cache Directive Registry | 5.2.4. Cache Directive Registry | |||
| The "Hypertext Transfer Protocol (HTTP) Cache Directive Registry" | The "Hypertext Transfer Protocol (HTTP) Cache Directive Registry" | |||
| defines the namespace for the cache directives. It has been created | defines the namespace for the cache directives. It has been created | |||
| and is now maintained at <https://www.iana.org/assignments/http- | and is now maintained at <https://www.iana.org/assignments/http- | |||
| cache-directives>. | cache-directives>. | |||
| A registration MUST include the following fields: | A registration MUST include the following fields: | |||
| skipping to change at page 34, line 43 ¶ | skipping to change at page 34, line 43 ¶ | |||
| cached data in other ways beyond its freshness lifetime. | cached data in other ways beyond its freshness lifetime. | |||
| This specification does not prohibit the application from taking HTTP | This specification does not prohibit the application from taking HTTP | |||
| caching into account; for example, a history mechanism might tell the | caching into account; for example, a history mechanism might tell the | |||
| user that a view is stale, or it might honor cache directives (e.g., | user that a view is stale, or it might honor cache directives (e.g., | |||
| Cache-Control: no-store). | Cache-Control: no-store). | |||
| However, when an application caches data and does not make this | However, when an application caches data and does not make this | |||
| apparent to or easily controllable by the user, it is strongly | apparent to or easily controllable by the user, it is strongly | |||
| encouraged to define its operation with respect to HTTP cache | encouraged to define its operation with respect to HTTP cache | |||
| directives, so as not to surprise authors who expect caching | directives so as not to surprise authors who expect caching semantics | |||
| semantics to be honoured. For example, while it might be reasonable | to be honored. For example, while it might be reasonable to define | |||
| to define an application cache "above" HTTP that allows a response | an application cache "above" HTTP that allows a response containing | |||
| containing Cache-Control: no-store to be reused for requests that are | Cache-Control: no-store to be reused for requests that are directly | |||
| directly related to the request that fetched it (such as those | related to the request that fetched it (such as those created during | |||
| created during the same page load), it would likely be surprising and | the same page load), it would likely be surprising and confusing to | |||
| confusing to users and authors if it were allowed to be reused for | users and authors if it were allowed to be reused for requests | |||
| requests unrelated in any way to the one from which it was obtained. | unrelated in any way to the one from which it was obtained. | |||
| 7. Security Considerations | 7. Security Considerations | |||
| This section is meant to inform developers, information providers, | This section is meant to inform developers, information providers, | |||
| and users of known security concerns specific to HTTP caching. More | and users of known security concerns specific to HTTP caching. More | |||
| general security considerations are addressed in "HTTP/1.1" | general security considerations are addressed in "HTTP/1.1" | |||
| (Section 11 of [HTTP/1.1]) and "HTTP Semantics" (Section 17 of | (Section 11 of [HTTP/1.1]) and "HTTP Semantics" (Section 17 of | |||
| [HTTP]). | [HTTP]). | |||
| Caches expose an additional attack surface, since the contents of the | Caches expose an additional attack surface because the contents of | |||
| cache represent an attractive target for malicious exploitation. | the cache represent an attractive target for malicious exploitation. | |||
| Because cache contents persist after an HTTP request is complete, an | Since 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, it 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, by allowing stored responses to be removed for | |||
| or all origin servers. | some 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 malicious content 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 | |||
| distribute malicious content to many clients. | distribute malicious content to many clients. | |||
| One common attack vector for cache poisoning is to exploit | 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 [HTTP/1.1] for the relevant requirements regarding | Section 6.3 of [HTTP/1.1] for the relevant requirements regarding | |||
| HTTP/1.1. | HTTP/1.1. | |||
| 7.2. Timing Attacks | 7.2. Timing Attacks | |||
| Because one of the primary uses of a cache is to optimise | Because one of the primary uses of a cache is to optimize | |||
| performance, its use can "leak" information about what resources have | performance, its use can "leak" information about which resources | |||
| been previously requested. | have been previously requested. | |||
| For example, if a user visits a site and their browser caches some of | 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 | its responses and then navigates to a second site, that site can | |||
| attempt to load responses it knows exists on the first site. If they | attempt to load responses it knows exist on the first site. If they | |||
| load quickly, it can be assumed that the user has visited that site, | load quickly, it can be assumed that the user has visited that site, | |||
| or even a specific page on it. | or even a specific page on it. | |||
| Such "timing attacks" can be mitigated by adding more information to | 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 cache key, such as the identity of the referring site (to prevent | |||
| the attack described above). This is sometimes called "double | the attack described above). This is sometimes called "double | |||
| keying." | keying". | |||
| 7.3. Caching of Sensitive Information | 7.3. Caching of Sensitive Information | |||
| Implementation and deployment flaws (as well as misunderstanding of | Implementation and deployment flaws (often led to by the | |||
| cache operation) might lead to caching of sensitive information | misunderstanding of cache operation) might lead to the caching of | |||
| (e.g., authentication credentials) that is thought to be private, | sensitive information (e.g., authentication credentials) that is | |||
| exposing it to unauthorized parties. | thought to be private, exposing it to unauthorized parties. | |||
| Note that the Set-Cookie response header field [COOKIE] does not | Note that the Set-Cookie response header field [COOKIE] 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 that wish to control caching of these responses are | |||
| to emit appropriate Cache-Control response header fields. | encouraged 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 | |||
| (iesg@ietf.org) - Internet Engineering Task Force". | (iesg@ietf.org) - Internet Engineering Task Force". | |||
| 8.1. Field Name Registration | 8.1. Field Name Registration | |||
| First, introduce the new "Hypertext Transfer Protocol (HTTP) Field | IANA has updated the "Hypertext Transfer Protocol (HTTP) Field Name | |||
| Name Registry" at <https://www.iana.org/assignments/http-fields> as | Registry" at <https://www.iana.org/assignments/http-fields>, as | |||
| described in Section 18.4 of [HTTP]. | described in Section 18.4 of [HTTP], with the field names listed in | |||
| the table below: | ||||
| Then, please update the registry with the field names listed in the | ||||
| table below: | ||||
| +---------------+-----------+------+----------+ | +---------------+------------+---------+----------+ | |||
| | Field Name | Status | Ref. | Comments | | | Field Name | Status | Section | Comments | | |||
| +---------------+-----------+------+----------+ | +---------------+------------+---------+----------+ | |||
| | Age | standard | 5.1 | | | | Age | permanent | 5.1 | | | |||
| | Cache-Control | standard | 5.2 | | | | Cache-Control | permanent | 5.2 | | | |||
| | Expires | standard | 5.3 | | | | Expires | permanent | 5.3 | | | |||
| | Pragma | standard | 5.4 | | | | Pragma | deprecated | 5.4 | | | |||
| | Warning | obsoleted | 5.5 | | | | Warning | obsoleted | 5.5 | | | |||
| +---------------+-----------+------+----------+ | +---------------+------------+---------+----------+ | |||
| Table 1 | Table 1 | |||
| 8.2. Cache Directive Registration | 8.2. Cache Directive Registration | |||
| Please update the "Hypertext Transfer Protocol (HTTP) Cache Directive | IANA has updated the "Hypertext Transfer Protocol (HTTP) Cache | |||
| Registry" at <https://www.iana.org/assignments/http-cache-directives> | Directive Registry" at <https://www.iana.org/assignments/http-cache- | |||
| with the registration procedure of Section 5.2.4 and the cache | directives> with the registration procedure per Section 5.2.4 and the | |||
| directive names summarized in the table below. | cache directive names summarized in the table below. | |||
| +------------------+----------------------------------+ | +------------------+------------------+ | |||
| | Cache Directive | Reference | | | Cache Directive | Section | | |||
| +------------------+----------------------------------+ | +------------------+------------------+ | |||
| | max-age | Section 5.2.1.1, Section 5.2.2.1 | | | max-age | 5.2.1.1, 5.2.2.1 | | |||
| | max-stale | Section 5.2.1.2 | | | max-stale | 5.2.1.2 | | |||
| | min-fresh | Section 5.2.1.3 | | | min-fresh | 5.2.1.3 | | |||
| | must-revalidate | Section 5.2.2.2 | | | must-revalidate | 5.2.2.2 | | |||
| | must-understand | Section 5.2.2.3 | | | must-understand | 5.2.2.3 | | |||
| | no-cache | Section 5.2.1.4, Section 5.2.2.4 | | | no-cache | 5.2.1.4, 5.2.2.4 | | |||
| | no-store | Section 5.2.1.5, Section 5.2.2.5 | | | no-store | 5.2.1.5, 5.2.2.5 | | |||
| | no-transform | Section 5.2.1.6, Section 5.2.2.6 | | | no-transform | 5.2.1.6, 5.2.2.6 | | |||
| | only-if-cached | Section 5.2.1.7 | | | only-if-cached | 5.2.1.7 | | |||
| | private | Section 5.2.2.7 | | | private | 5.2.2.7 | | |||
| | proxy-revalidate | Section 5.2.2.8 | | | proxy-revalidate | 5.2.2.8 | | |||
| | public | Section 5.2.2.9 | | | public | 5.2.2.9 | | |||
| | s-maxage | Section 5.2.2.10 | | | s-maxage | 5.2.2.10 | | |||
| +------------------+----------------------------------+ | +------------------+------------------+ | |||
| Table 2 | Table 2 | |||
| 8.3. Warn Code Registry | 8.3. Warn Code Registry | |||
| Please add a note to the "Hypertext Transfer Protocol (HTTP) Warn | IANA has added the following note to the "Hypertext Transfer Protocol | |||
| Codes" registry at <https://www.iana.org/assignments/http-warn-codes> | (HTTP) Warn Codes" registry at <https://www.iana.org/assignments/ | |||
| to the effect that Warning is obsoleted. | http-warn-codes> stating that "Warning" has been obsoleted: | |||
| | The Warning header field (and the warn codes that it uses) has | ||||
| | been obsoleted for HTTP per [RFC9111]. | ||||
| 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-latest, September 2021, | draft-ietf-httpbis-semantics-latest, October 2025, | |||
| <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | |||
| semantics-latest>. | semantics-latest>. | |||
| [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, | |||
| skipping to change at page 38, line 26 ¶ | skipping to change at page 38, line 21 ¶ | |||
| 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, | [HTTP/1.1] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
| Ed., "HTTP/1.1", Work in Progress, Internet-Draft, draft- | Ed., "HTTP/1.1", Work in Progress, Internet-Draft, draft- | |||
| ietf-httpbis-messaging-latest, September 2021, | ietf-httpbis-messaging-latest, October 2025, | |||
| <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | |||
| messaging-latest>. | messaging-latest>. | |||
| [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, May 2010, | |||
| <https://www.rfc-editor.org/info/rfc5861>. | <https://www.rfc-editor.org/info/rfc5861>. | |||
| [RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. F. Reschke, | [RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
| Ed., "Hypertext Transfer Protocol (HTTP): Caching", | Ed., "Hypertext Transfer Protocol (HTTP/1.1): 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>. | |||
| 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 per | |||
| Section 5.6.1 of [HTTP]. | Section 5.6.1 of [HTTP]. | |||
| 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 [HTTP], Section 5.6.7> | HTTP-date = <HTTP-date, see [HTTP], Section 5.6.7> | |||
| skipping to change at page 39, line 36 ¶ | skipping to change at page 39, line 31 ¶ | |||
| quoted-string = <quoted-string, see [HTTP], Section 5.6.4> | quoted-string = <quoted-string, see [HTTP], Section 5.6.4> | |||
| token = <token, see [HTTP], Section 5.6.2> | token = <token, see [HTTP], Section 5.6.2> | |||
| Appendix B. Changes from RFC 7234 | Appendix B. Changes from RFC 7234 | |||
| Handling of duplicate and conflicting cache directives has been | Handling of duplicate and conflicting cache directives has been | |||
| clarified. (Section 4.2.1) | clarified. (Section 4.2.1) | |||
| Cache invalidation of the URIs in the Location and Content-Location | Cache invalidation of the URIs in the Location and Content-Location | |||
| header fields is no longer required, but still allowed. | header fields is no longer required but is still allowed. | |||
| (Section 4.4) | (Section 4.4) | |||
| Cache invalidation of the URIs in the Location and Content-Location | Cache invalidation of the URIs in the Location and Content-Location | |||
| header fields is disallowed when the origin is different; previously, | header fields is disallowed when the origin is different; previously, | |||
| it was the host. (Section 4.4) | it was the host. (Section 4.4) | |||
| Handling invalid and multiple Age header field values has been | Handling invalid and multiple Age header field values has been | |||
| clarified. (Section 5.1) | clarified. (Section 5.1) | |||
| Some cache directives defined by this specification now have stronger | Some cache directives defined by this specification now have stronger | |||
| prohibitions against generating the quoted form of their values, | prohibitions against generating the quoted form of their values, | |||
| since this has been found to create interoperability problems. | since this has been found to create interoperability problems. | |||
| Consumers of extension cache directives are no longer required to | Consumers of extension cache directives are no longer required to | |||
| accept both token and quoted-string forms, but they still need to | accept both token and quoted-string forms, but they still need to | |||
| parse them properly for unknown extensions. (Section 5.2) | parse them properly for unknown extensions. (Section 5.2) | |||
| The "public" and "private" cache directives were clarified, so that | ||||
| they do not make responses reusable under any condition. | ||||
| (Section 5.2.2) | ||||
| The "must-understand" cache directive was introduced; caches are no | The public and private cache directives were clarified, so that they | |||
| do not make responses reusable under any condition. (Section 5.2.2) | ||||
| The must-understand cache directive was introduced; caches are no | ||||
| longer required to understand the semantics of new response status | longer required to understand the semantics of new response status | |||
| codes unless it is present. (Section 5.2.2.3) | codes unless it is present. (Section 5.2.2.3) | |||
| The Warning response header was obsoleted. Much of the information | The Warning response header was obsoleted. Much of the information | |||
| supported by Warning could be gleaned by examining the response, and | supported by Warning could be gleaned by examining the response, and | |||
| the remaining warn-codes -- although potentially useful -- were | the remaining information -- although potentially useful -- was | |||
| entirely advisory. In practice, Warning was not added by caches or | entirely advisory. In practice, Warning was not added by caches or | |||
| intermediaries. (Section 5.5) | intermediaries. (Section 5.5) | |||
| Appendix C. Change Log | Appendix C. Change Log | |||
| This section is to be removed before publishing as an RFC. | This section is to be removed before publishing as an RFC. | |||
| C.1. Between RFC7234 and draft 00 | See <https://www.ietf.org/archive/id/draft-ietf-httpbis-cache- | |||
| 19.html#appendix-C> for changes up to version 19 of this document. | ||||
| The changes were purely editorial: | ||||
| o Change boilerplate and abstract to indicate the "draft" status, | ||||
| and update references to ancestor specifications. | ||||
| o Remove version "1.1" from document title, indicating that this | ||||
| specification applies to all HTTP versions. | ||||
| o Adjust historical notes. | ||||
| o Update links to sibling specifications. | ||||
| o Replace sections listing changes from RFC 2616 by new empty | ||||
| sections referring to RFC 723x. | ||||
| o Remove acknowledgements specific to RFC 723x. | ||||
| o Move "Acknowledgements" to the very end and make them unnumbered. | ||||
| C.2. Since draft-ietf-httpbis-cache-00 | ||||
| The changes are purely editorial: | ||||
| o Moved all extensibility tips, registration procedures, and | ||||
| registry tables from the IANA considerations to normative | ||||
| sections, reducing the IANA considerations to just instructions | ||||
| that will be removed prior to publication as an RFC. | ||||
| C.3. Since draft-ietf-httpbis-cache-01 | ||||
| o Cite RFC 8126 instead of RFC 5226 (<https://github.com/httpwg/ | ||||
| http-core/issues/75>) | ||||
| o In Section 5.4, misleading statement about the relation between | ||||
| Pragma and Cache-Control (<https://github.com/httpwg/http-core/ | ||||
| issues/92>, <https://www.rfc-editor.org/errata/eid4674>) | ||||
| C.4. Since draft-ietf-httpbis-cache-02 | ||||
| o In Section 3, explain that only final responses are cacheable | ||||
| (<https://github.com/httpwg/http-core/issues/29>) | ||||
| o In Section 5.2.2, clarify what responses various directives apply | ||||
| to (<https://github.com/httpwg/http-core/issues/52>) | ||||
| o In Section 4.3.1, clarify the source of validators in conditional | ||||
| requests (<https://github.com/httpwg/http-core/issues/110>) | ||||
| o Revise Section 6 to apply to more than just History Lists | ||||
| (<https://github.com/httpwg/http-core/issues/126>) | ||||
| o In Section 5.5, deprecated "Warning" header field | ||||
| (<https://github.com/httpwg/http-core/issues/139>) | ||||
| o In Section 3.5, remove a spurious note | ||||
| (<https://github.com/httpwg/http-core/issues/141>) | ||||
| C.5. Since draft-ietf-httpbis-cache-03 | ||||
| o In Section 2, define what a disconnected cache is | ||||
| (<https://github.com/httpwg/http-core/issues/5>) | ||||
| o In Section 4, clarify language around how to select a response | ||||
| when more than one matches (<https://github.com/httpwg/http-core/ | ||||
| issues/23>) | ||||
| o in Section 4.2.4, mention stale-while-revalidate and stale-if- | ||||
| error (<https://github.com/httpwg/http-core/issues/122>) | ||||
| o Remove requirements around cache request directives | ||||
| (<https://github.com/httpwg/http-core/issues/129>) | ||||
| o Deprecate Pragma (<https://github.com/httpwg/http-core/ | ||||
| issues/140>) | ||||
| o In Section 3.5 and Section 5.2.2, note effect of some directives | ||||
| on authenticated requests (<https://github.com/httpwg/http-core/ | ||||
| issues/161>) | ||||
| C.6. Since draft-ietf-httpbis-cache-04 | ||||
| o In Section 5.2, remove the registrations for stale-if-error and | ||||
| stale-while-revalidate which happened in RFC 7234 | ||||
| (<https://github.com/httpwg/http-core/issues/207>) | ||||
| C.7. Since draft-ietf-httpbis-cache-05 | ||||
| o In Section 3.3, clarify how weakly framed content is considered | ||||
| for purposes of completeness (<https://github.com/httpwg/http- | ||||
| core/issues/25>) | ||||
| o Throughout, 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>, | ||||
| <https://www.rfc-editor.org/errata/eid5300>) | ||||
| 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>) | ||||
| C.8. Since draft-ietf-httpbis-cache-06 | ||||
| o In Section 3 and Section 5.2.2.3, change response cacheability to | ||||
| only require understanding the response status code if the must- | ||||
| understand cache directive is present (<https://github.com/httpwg/ | ||||
| http-core/issues/120>) | ||||
| o Change requirements for handling different forms of cache | ||||
| directives in Section 5.2 (<https://github.com/httpwg/http-core/ | ||||
| issues/128>) | ||||
| o Fix typo in Section 5.2.2.10 (<https://github.com/httpwg/http- | ||||
| core/issues/264>) | ||||
| o In Section 5.2.2.9 and Section 5.2.2.7, clarify "private" and | ||||
| "public" so that they do not override all other cache directives | ||||
| (<https://github.com/httpwg/http-core/issues/268>) | ||||
| o In Section 3, distinguish between private with and without | ||||
| qualifying headers (<https://github.com/httpwg/http-core/ | ||||
| issues/270>) | ||||
| o In Section 4.1, clarify that any "*" as a member of Vary will | ||||
| disable caching (<https://github.com/httpwg/http-core/issues/286>) | ||||
| o In Section 1.1, reference RFC 8174 as well | ||||
| (<https://github.com/httpwg/http-core/issues/303>) | ||||
| C.9. Since draft-ietf-httpbis-cache-07 | ||||
| o Throughout, replace "effective request URI", "request-target" and | ||||
| similar with "target URI" (<https://github.com/httpwg/http-core/ | ||||
| issues/259>) | ||||
| o In Section 5.2.2.9 and Section 5.2.2.7, make it clear that these | ||||
| directives do not ignore other requirements for caching | ||||
| (<https://github.com/httpwg/http-core/issues/320>) | ||||
| o In Section 3.3, move definition of "complete" into semantics | ||||
| (<https://github.com/httpwg/http-core/issues/334>) | ||||
| C.10. Since draft-ietf-httpbis-cache-08 | ||||
| o Appendix A now uses the sender variant of the "#" list expansion | ||||
| (<https://github.com/httpwg/http-core/issues/192>) | ||||
| C.11. Since draft-ietf-httpbis-cache-09 | ||||
| o In Section 5.1, discuss handling of invalid and multiple Age | ||||
| header field values (<https://github.com/httpwg/http-core/ | ||||
| issues/193>) | ||||
| o Switch to xml2rfc v3 mode for draft generation | ||||
| (<https://github.com/httpwg/http-core/issues/394>) | ||||
| C.12. Since draft-ietf-httpbis-cache-10 | ||||
| o In Section 5.2 (Cache-Control), adjust ABNF to allow empty lists | ||||
| (<https://github.com/httpwg/http-core/issues/210>) | ||||
| C.13. Since draft-ietf-httpbis-cache-11 | ||||
| o None. | ||||
| C.14. Since draft-ietf-httpbis-cache-12 | ||||
| o In Section 4.2.4, remove 'no-store', as it won't be in cache in | ||||
| the first place (<https://github.com/httpwg/http-core/issues/447>, | ||||
| <https://www.rfc-editor.org/errata/eid6279>) | ||||
| o In Section 3.1, make it clear that only response headers need be | ||||
| stored (<https://github.com/httpwg/http-core/issues/457>) | ||||
| o Rewrote "Updating Stored Header Fields" Section 3.2 | ||||
| (<https://github.com/httpwg/http-core/issues/458>) | ||||
| o In Section 4.2.1 clarify how to handle invalid and conflicting | ||||
| directives (<https://github.com/httpwg/http-core/issues/460>) | ||||
| o In Section 4.3.3, mention retry of failed validation requests | ||||
| (<https://github.com/httpwg/http-core/issues/462>) | ||||
| o In Section 4.3.3, clarify requirement on storing a full response | ||||
| to a conditional request (<https://github.com/httpwg/http-core/ | ||||
| issues/463>) | ||||
| o In Section 5.1, clarify error handling | ||||
| (<https://github.com/httpwg/http-core/issues/471>) | ||||
| o In Section 4.2, remove spurious "UTC" (<https://github.com/httpwg/ | ||||
| http-core/issues/472>) | ||||
| o In Section 4.2, correct the date-related rule names to consider | ||||
| case-insensitive (<https://github.com/httpwg/http-core/ | ||||
| issues/473>) | ||||
| o In Section 6, strengthen recommendation for application caches to | ||||
| pay attention to cache directives (<https://github.com/httpwg/ | ||||
| http-core/issues/474>) | ||||
| o In Section 4, mention collapsed requests | ||||
| (<https://github.com/httpwg/http-core/issues/475>) | ||||
| o In Section 4.4, relax requirements on Content-Location and | ||||
| Location invalidation (<https://github.com/httpwg/http-core/ | ||||
| issues/478>) | ||||
| o In Section 4.3.4, refine the exceptions to update on a 304 | ||||
| (<https://github.com/httpwg/http-core/issues/488>) | ||||
| o Moved table of Cache-Control directives into Section 8.2 | ||||
| (<https://github.com/httpwg/http-core/issues/506>) | ||||
| o In Section 1.2, remove unused core ABNF rules | ||||
| (<https://github.com/httpwg/http-core/issues/529>) | ||||
| o Changed to using "payload data" when defining requirements about | ||||
| the data being conveyed within a message, instead of the terms | ||||
| "payload body" or "response body" or "representation body", since | ||||
| they often get confused with the HTTP/1.1 message body (which | ||||
| includes transfer coding) (<https://github.com/httpwg/http-core/ | ||||
| issues/553>) | ||||
| C.15. Since draft-ietf-httpbis-cache-13 | ||||
| o In Section 5.2.2.2, clarify requirements around generating an | ||||
| error response (<https://github.com/httpwg/http-core/issues/608>) | ||||
| o Changed to using "content" instead of "payload" or "payload data" | ||||
| to avoid confusion with the payload of version-specific messaging | ||||
| frames (<https://github.com/httpwg/http-core/issues/654>) | ||||
| o In Section 4.3.4, clarify how multiple validators are handled | ||||
| (<https://github.com/httpwg/http-core/issues/659>) | ||||
| o In Section 4.2.3, Section 5.2, and Section 5.2.2.4, remove notes | ||||
| about very old HTTP/1.0 behaviours (<https://github.com/httpwg/ | ||||
| http-core/issues/660>) | ||||
| o In Section 5.2.2.3, modify operation to be more backwards- | ||||
| compatible with existing implementations | ||||
| (<https://github.com/httpwg/http-core/issues/661>) | ||||
| C.16. Since draft-ietf-httpbis-cache-14 | ||||
| o Fix subsection ordering in Section 5.2.2 | ||||
| (<https://github.com/httpwg/http-core/issues/674>) | ||||
| o In Section 2, define what a cache key is | ||||
| (<https://github.com/httpwg/http-core/issues/728>) | ||||
| o In Section 3.1, clarify what cache proxy headers apply to | ||||
| (<https://github.com/httpwg/http-core/issues/729>) | ||||
| o In Section 7.1, cache poisoning can affect private caches too | ||||
| (<https://github.com/httpwg/http-core/issues/730>) | ||||
| o In Section 5.1, adjust handling of invalid values to match most | ||||
| deployed caches (<https://github.com/httpwg/http-core/issues/778>) | ||||
| o In Section 5.3, mention parsing requirement relaxation | ||||
| (<https://github.com/httpwg/http-core/issues/779>) | ||||
| C.17. Since draft-ietf-httpbis-cache-15 | ||||
| o In Section 4.3.1, tune description of relation between cache keys | ||||
| and validators (<https://github.com/httpwg/http-core/issues/832>) | ||||
| C.18. Since draft-ietf-httpbis-cache-16 | ||||
| This draft addresses mostly editorial issues raised during or past | ||||
| IETF Last Call; see <https://github.com/httpwg/http-core/ | ||||
| issues?q=label%3Acaching+created%3A%3E2021-05-26> for a summary. | ||||
| Furthermore: | ||||
| o Addressed Genart last call review comments | ||||
| (<https://github.com/httpwg/http-core/issues/847>) | ||||
| o In Section 4.3.4, clarify that only selectable responses are | ||||
| updated (<https://github.com/httpwg/http-core/issues/839>) | ||||
| C.19. Since draft-ietf-httpbis-cache-17 | ||||
| o Made reference to [HTTP/1.1] informative only | ||||
| (<https://github.com/httpwg/http-core/issues/911>) | ||||
| o Move cache-related aspects of validator use from [HTTP] into | ||||
| Section 4.3.1 (<https://github.com/httpwg/http-core/issues/933>) | ||||
| o Use term "clock" defined in Section 6.6.1 of [HTTP] throughout | ||||
| (<https://github.com/httpwg/http-core/issues/953>) | ||||
| o Throughout, disambiguate "selected representation" and "selected | C.1. Since draft-ietf-httpbis-cache-19 | |||
| response" (now "chosen response") (<https://github.com/httpwg/ | ||||
| http-core/issues/958>) | ||||
| C.20. Since draft-ietf-httpbis-cache-18 | This (unpublished) draft contains changes that were made after draft | |||
| 19 was approved by the IESG. Most changes are editorial only. | ||||
| o None. | o None. | |||
| Acknowledgements | Acknowledgements | |||
| See Appendix "Acknowledgements" of [HTTP]. | See Appendix "Acknowledgements" of [HTTP], which applies to this | |||
| document as well. | ||||
| 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 | |||
| age Section 4.2 | age Section 4.2 | |||
| Age header field *_Section 5.1_* | Age header field *_Section 5.1_* | |||
| skipping to change at page 49, line 17 ¶ | skipping to change at page 42, line 46 ¶ | |||
| Roy T. Fielding (editor) | Roy T. Fielding (editor) | |||
| Adobe | Adobe | |||
| 345 Park Ave | 345 Park Ave | |||
| San Jose, CA 95110 | San Jose, CA 95110 | |||
| United States of America | 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 | |||
| Prahran VIC | Prahran | |||
| Australia | Australia | |||
| Email: mnot@mnot.net | Email: mnot@mnot.net | |||
| URI: https://www.mnot.net/ | URI: https://www.mnot.net/ | |||
| Julian Reschke (editor) | Julian Reschke (editor) | |||
| greenbytes GmbH | greenbytes GmbH | |||
| Hafenweg 16 | Hafenweg 16 | |||
| 48155 Münster | 48155 Münster | |||
| 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. 157 change blocks. | ||||
| 644 lines changed or deleted | 332 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||