| draft-ietf-httpbis-cache-16.txt | draft-ietf-httpbis-cache-17.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: 28 November 2021 J. Reschke, Ed. | Expires: 27 January 2022 J. Reschke, Ed. | |||
| greenbytes | greenbytes | |||
| 27 May 2021 | 26 July 2021 | |||
| HTTP Caching | HTTP Caching | |||
| draft-ietf-httpbis-cache-16 | draft-ietf-httpbis-cache-17 | |||
| 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.17. | The changes in this draft are summarized in Appendix C.18. | |||
| 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 28 November 2021. | This Internet-Draft will expire on 27 January 2022. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2021 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents (https://trustee.ietf.org/ | |||
| license-info) in effect on the date of publication of this document. | license-info) in effect on the date of publication of this document. | |||
| Please review these documents carefully, as they describe your rights | Please review these documents carefully, as they describe your rights | |||
| skipping to change at page 2, line 43 ¶ | skipping to change at page 2, line 43 ¶ | |||
| outside the IETF Standards Process, and derivative works of it may | outside the IETF Standards Process, and derivative works of it may | |||
| not be created outside the IETF Standards Process, except to format | not be created outside the IETF Standards Process, except to format | |||
| it for publication as an RFC or to translate it into languages other | it for publication as an RFC or to translate it into languages other | |||
| than English. | than English. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 1.1. Requirements Notation . . . . . . . . . . . . . . . . . . 5 | 1.1. Requirements Notation . . . . . . . . . . . . . . . . . . 5 | |||
| 1.2. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 5 | 1.2. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 1.3. Delta Seconds . . . . . . . . . . . . . . . . . . . . . . 6 | 1.2.1. Imported Rules . . . . . . . . . . . . . . . . . . . 5 | |||
| 1.2.2. Delta Seconds . . . . . . . . . . . . . . . . . . . . 6 | ||||
| 2. Overview of Cache Operation . . . . . . . . . . . . . . . . . 6 | 2. Overview of Cache Operation . . . . . . . . . . . . . . . . . 6 | |||
| 3. Storing Responses in Caches . . . . . . . . . . . . . . . . . 7 | 3. Storing Responses in Caches . . . . . . . . . . . . . . . . . 7 | |||
| 3.1. Storing 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 . . . . . . . . . . . . . . . . 11 | |||
| 3.5. Storing Responses to Authenticated Requests . . . . . . . 11 | 3.5. Storing Responses to Authenticated Requests . . . . . . . 11 | |||
| 4. Constructing Responses from Caches . . . . . . . . . . . . . 11 | 4. Constructing Responses from Caches . . . . . . . . . . . . . 11 | |||
| 4.1. Calculating Cache Keys with Vary . . . . . . . . . . . . 12 | 4.1. Calculating Cache Keys with the Vary Header Field . . . . 13 | |||
| 4.2. Freshness . . . . . . . . . . . . . . . . . . . . . . . . 14 | 4.2. Freshness . . . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 4.2.1. Calculating Freshness Lifetime . . . . . . . . . . . 15 | 4.2.1. Calculating Freshness Lifetime . . . . . . . . . . . 15 | |||
| 4.2.2. Calculating Heuristic Freshness . . . . . . . . . . . 16 | 4.2.2. Calculating Heuristic Freshness . . . . . . . . . . . 16 | |||
| 4.2.3. Calculating Age . . . . . . . . . . . . . . . . . . . 17 | 4.2.3. Calculating Age . . . . . . . . . . . . . . . . . . . 17 | |||
| 4.2.4. Serving Stale Responses . . . . . . . . . . . . . . . 18 | 4.2.4. Serving Stale Responses . . . . . . . . . . . . . . . 18 | |||
| 4.3. Validation . . . . . . . . . . . . . . . . . . . . . . . 18 | 4.3. Validation . . . . . . . . . . . . . . . . . . . . . . . 19 | |||
| 4.3.1. Sending a Validation Request . . . . . . . . . . . . 19 | 4.3.1. Sending a Validation Request . . . . . . . . . . . . 19 | |||
| 4.3.2. Handling a Received Validation Request . . . . . . . 19 | 4.3.2. Handling a Received Validation Request . . . . . . . 20 | |||
| 4.3.3. Handling a Validation Response . . . . . . . . . . . 21 | 4.3.3. Handling a Validation Response . . . . . . . . . . . 21 | |||
| 4.3.4. Freshening Stored Responses upon Validation . . . . . 21 | 4.3.4. Freshening Stored Responses upon Validation . . . . . 21 | |||
| 4.3.5. Freshening Responses with HEAD . . . . . . . . . . . 22 | 4.3.5. Freshening Responses with HEAD . . . . . . . . . . . 22 | |||
| 4.4. Invalidating Stored Responses . . . . . . . . . . . . . . 22 | 4.4. Invalidating Stored Responses . . . . . . . . . . . . . . 23 | |||
| 5. Field Definitions . . . . . . . . . . . . . . . . . . . . . . 23 | 5. Field Definitions . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 5.1. Age . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 | 5.1. Age . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 5.2. Cache-Control . . . . . . . . . . . . . . . . . . . . . . 24 | 5.2. Cache-Control . . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 5.2.1. Request Cache-Control Directives . . . . . . . . . . 24 | 5.2.1. Request Cache-Control Directives . . . . . . . . . . 25 | |||
| 5.2.1.1. max-age . . . . . . . . . . . . . . . . . . . . . 24 | 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 . . . . . . . . . . . . . . . . . . . . 25 | 5.2.1.3. min-fresh . . . . . . . . . . . . . . . . . . . . 26 | |||
| 5.2.1.4. no-cache . . . . . . . . . . . . . . . . . . . . 25 | 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 . . . . . . . . . . . . . . . . . . 26 | 5.2.1.6. no-transform . . . . . . . . . . . . . . . . . . 27 | |||
| 5.2.1.7. only-if-cached . . . . . . . . . . . . . . . . . 26 | 5.2.1.7. only-if-cached . . . . . . . . . . . . . . . . . 27 | |||
| 5.2.2. Response Cache-Control Directives . . . . . . . . . . 26 | 5.2.2. Response Cache-Control Directives . . . . . . . . . . 27 | |||
| 5.2.2.1. max-age . . . . . . . . . . . . . . . . . . . . . 26 | 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 . . . . . . . . . . . . . . . . . 27 | 5.2.2.3. must-understand . . . . . . . . . . . . . . . . . 28 | |||
| 5.2.2.4. no-cache . . . . . . . . . . . . . . . . . . . . 27 | 5.2.2.4. no-cache . . . . . . . . . . . . . . . . . . . . 28 | |||
| 5.2.2.5. no-store . . . . . . . . . . . . . . . . . . . . 28 | 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 . . . . . . . . . . . . . . . . . . . . 30 | 5.2.2.10. s-maxage . . . . . . . . . . . . . . . . . . . . 31 | |||
| 5.2.3. Cache Control Extensions . . . . . . . . . . . . . . 31 | 5.2.3. Cache Control Extensions . . . . . . . . . . . . . . 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 . . . . . . . . . . . . . . . . . . . . . . . . . 33 | 5.5. Warning . . . . . . . . . . . . . . . . . . . . . . . . . 34 | |||
| 6. Relationship to Applications and Other Caches . . . . . . . . 33 | 6. Relationship to Applications and Other Caches . . . . . . . . 34 | |||
| 7. Security Considerations . . . . . . . . . . . . . . . . . . . 34 | 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 . . . . . . . . . . . . 35 | 7.3. Caching of Sensitive Information . . . . . . . . . . . . 36 | |||
| 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 35 | 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 36 | |||
| 8.1. Field Name Registration . . . . . . . . . . . . . . . . . 36 | 8.1. Field Name Registration . . . . . . . . . . . . . . . . . 36 | |||
| 8.2. Cache Directive Registration . . . . . . . . . . . . . . 36 | 8.2. Cache Directive Registration . . . . . . . . . . . . . . 37 | |||
| 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 . . . . . . . . . . . . . . . . . . . 39 | |||
| 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. Between RFC7234 and draft 00 . . . . . . . . . . . . . . 40 | |||
| C.2. Since draft-ietf-httpbis-cache-00 . . . . . . . . . . . . 41 | C.2. Since draft-ietf-httpbis-cache-00 . . . . . . . . . . . . 41 | |||
| C.3. Since draft-ietf-httpbis-cache-01 . . . . . . . . . . . . 41 | C.3. Since draft-ietf-httpbis-cache-01 . . . . . . . . . . . . 41 | |||
| C.4. Since draft-ietf-httpbis-cache-02 . . . . . . . . . . . . 41 | C.4. Since draft-ietf-httpbis-cache-02 . . . . . . . . . . . . 41 | |||
| C.5. Since draft-ietf-httpbis-cache-03 . . . . . . . . . . . . 41 | C.5. Since draft-ietf-httpbis-cache-03 . . . . . . . . . . . . 41 | |||
| C.6. Since draft-ietf-httpbis-cache-04 . . . . . . . . . . . . 42 | C.6. Since draft-ietf-httpbis-cache-04 . . . . . . . . . . . . 42 | |||
| C.7. Since draft-ietf-httpbis-cache-05 . . . . . . . . . . . . 42 | C.7. Since draft-ietf-httpbis-cache-05 . . . . . . . . . . . . 42 | |||
| C.8. Since draft-ietf-httpbis-cache-06 . . . . . . . . . . . . 42 | C.8. Since draft-ietf-httpbis-cache-06 . . . . . . . . . . . . 42 | |||
| C.9. Since draft-ietf-httpbis-cache-07 . . . . . . . . . . . . 43 | C.9. Since draft-ietf-httpbis-cache-07 . . . . . . . . . . . . 43 | |||
| C.10. Since draft-ietf-httpbis-cache-08 . . . . . . . . . . . . 43 | C.10. Since draft-ietf-httpbis-cache-08 . . . . . . . . . . . . 43 | |||
| C.11. Since draft-ietf-httpbis-cache-09 . . . . . . . . . . . . 43 | C.11. Since draft-ietf-httpbis-cache-09 . . . . . . . . . . . . 43 | |||
| C.12. Since draft-ietf-httpbis-cache-10 . . . . . . . . . . . . 43 | C.12. Since draft-ietf-httpbis-cache-10 . . . . . . . . . . . . 44 | |||
| C.13. Since draft-ietf-httpbis-cache-11 . . . . . . . . . . . . 44 | C.13. Since draft-ietf-httpbis-cache-11 . . . . . . . . . . . . 44 | |||
| C.14. Since draft-ietf-httpbis-cache-12 . . . . . . . . . . . . 44 | C.14. Since draft-ietf-httpbis-cache-12 . . . . . . . . . . . . 44 | |||
| C.15. Since draft-ietf-httpbis-cache-13 . . . . . . . . . . . . 45 | C.15. Since draft-ietf-httpbis-cache-13 . . . . . . . . . . . . 45 | |||
| C.16. Since draft-ietf-httpbis-cache-14 . . . . . . . . . . . . 45 | C.16. Since draft-ietf-httpbis-cache-14 . . . . . . . . . . . . 45 | |||
| C.17. Since draft-ietf-httpbis-cache-15 . . . . . . . . . . . . 46 | C.17. Since draft-ietf-httpbis-cache-15 . . . . . . . . . . . . 46 | |||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 46 | C.18. Since draft-ietf-httpbis-cache-16 . . . . . . . . . . . . 46 | |||
| Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 46 | ||||
| Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 | Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 48 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 48 | |||
| 1. Introduction | 1. Introduction | |||
| The Hypertext Transfer Protocol (HTTP) is a stateless application- | The Hypertext Transfer Protocol (HTTP) is a stateless application- | |||
| level request/response protocol that uses extensible semantics and | level request/response protocol that uses extensible semantics and | |||
| self-descriptive messages for flexible interaction with network-based | self-descriptive messages for flexible interaction with network-based | |||
| hypertext information systems. It is typically used for distributed | hypertext information systems. It is typically used for distributed | |||
| information systems, where the use of response caches can improve | information systems, where the use of response caches can improve | |||
| performance. This document defines aspects of HTTP related to | performance. This document defines aspects of HTTP related to | |||
| 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. | 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. | |||
| HTTP caching's goal is significantly improving performance by reusing | The goal of HTTP caching is significantly improving performance by | |||
| a prior response message to satisfy a current request. A cache | reusing a prior response message to satisfy a current request. A | |||
| considers a stored response "fresh", as defined in Section 4.2, if it | cache considers a stored response "fresh", as defined in Section 4.2, | |||
| can be reused without "validation" (checking with the origin server | if it can be reused without "validation" (checking with the origin | |||
| to see if the cached response remains valid for this request). A | server to see if the cached response remains valid for this request). | |||
| fresh response can therefore reduce both latency and network overhead | A fresh response can therefore reduce both latency and network | |||
| each time the cache reuses it. When a cached response is not fresh, | overhead each time the cache reuses it. When a cached response is | |||
| it might still be reusable if validation can freshen it (Section 4.3) | not fresh, it might still be reusable if validation can freshen it | |||
| or if the origin is unavailable (Section 4.2.4). | (Section 4.3) or if the origin is unavailable (Section 4.2.4). | |||
| This document obsoletes RFC 7234, with the changes being summarized | This document obsoletes RFC 7234, with the changes being summarized | |||
| in Appendix B. | in Appendix B. | |||
| 1.1. Requirements Notation | 1.1. Requirements Notation | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| "OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
| 14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
| capitals, as shown here. | capitals, as shown here. | |||
| Section 2 of [Semantics] defines conformance criteria and contains | Section 2 of [HTTP] defines conformance criteria and contains | |||
| 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 | It also uses a list extension, defined in Section 5.6.1 of [HTTP], | |||
| [Semantics], that allows for compact definition of comma-separated | that allows for compact definition of comma-separated lists using a | |||
| lists using a '#' operator (similar to how the '*' operator indicates | '#' operator (similar to how the '*' operator indicates repetition). | |||
| repetition). Appendix A shows the collected grammar with all list | Appendix A shows the collected grammar with all list operators | |||
| operators expanded to standard ABNF notation. | expanded to standard ABNF notation. | |||
| 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). | |||
| [Semantics] defines the following rules: | [HTTP] defines the following rules: | |||
| HTTP-date = <HTTP-date, see [Semantics], Section 5.6.7> | HTTP-date = <HTTP-date, see [HTTP], Section 5.6.7> | |||
| OWS = <OWS, see [Semantics], Section 5.6.3> | OWS = <OWS, see [HTTP], Section 5.6.3> | |||
| field-name = <field-name, see [Semantics], Section 5.1> | field-name = <field-name, see [HTTP], Section 5.1> | |||
| quoted-string = <quoted-string, see [Semantics], Section 5.6.4> | quoted-string = <quoted-string, see [HTTP], Section 5.6.4> | |||
| token = <token, see [Semantics], Section 5.6.2> | token = <token, see [HTTP], Section 5.6.2> | |||
| 1.3. Delta Seconds | 1.2.2. Delta Seconds | |||
| The delta-seconds rule specifies a non-negative integer, representing | The delta-seconds rule specifies a non-negative integer, representing | |||
| time in seconds. | time in seconds. | |||
| delta-seconds = 1*DIGIT | delta-seconds = 1*DIGIT | |||
| A recipient parsing a delta-seconds value and converting it to binary | A recipient parsing a delta-seconds value and converting it to binary | |||
| form ought to use an arithmetic type of at least 31 bits of non- | form ought to use an arithmetic type of at least 31 bits of non- | |||
| negative integer range. If a cache receives a delta-seconds value | negative integer range. If a cache receives a delta-seconds value | |||
| greater than the greatest integer it can represent, or if any of its | greater than the greatest integer it can represent, or if any of its | |||
| subsequent calculations overflows, the cache MUST consider the value | subsequent calculations overflows, the cache MUST consider the value | |||
| to be 2147483648 (2^31) or the greatest positive integer it can | to be 2147483648 (2^31) or the greatest positive integer it can | |||
| conveniently represent. | conveniently represent. | |||
| | *Note:* The value 2147483648 is here for historical reasons, | | *Note:* The value 2147483648 is here for historical reasons, | |||
| | represents infinity (over 68 years), and does not need to be | | represents infinity (over 68 years), and does not need to be | |||
| | stored in binary form; an implementation could produce it as a | | stored in binary form; an implementation could produce it as a | |||
| | canned string if any overflow occurs, even if the calculations | | string if any overflow occurs, even if the calculations are | |||
| | are performed with an arithmetic type incapable of directly | | performed with an arithmetic type incapable of directly | |||
| | representing that number. What matters here is that an | | representing that number. What matters here is that an | |||
| | overflow be detected and not treated as a negative value in | | overflow be detected and not treated as a negative value in | |||
| | later calculations. | | later calculations. | |||
| 2. Overview of Cache Operation | 2. Overview of Cache Operation | |||
| Proper cache operation preserves the semantics of HTTP transfers | Proper cache operation preserves the semantics of HTTP transfers | |||
| ([Semantics]) while reducing the transmission of information already | while reducing the transmission of information already held in the | |||
| held in the cache. Although caching is an entirely OPTIONAL feature | cache. See Section 3 of [HTTP] for the general terminology and core | |||
| of HTTP, it can be assumed that reusing a cached response is | concepts of HTTP. | |||
| desirable and that such reuse is the default behavior when no | ||||
| requirement or local configuration prevents it. Therefore, HTTP | Although caching is an entirely OPTIONAL feature of HTTP, it can be | |||
| cache requirements are focused on preventing a cache from either | assumed that reusing a cached response is desirable and that such | |||
| storing a non-reusable response or reusing a stored response | reuse is the default behavior when no requirement or local | |||
| inappropriately, rather than mandating that caches always store and | configuration prevents it. Therefore, HTTP cache requirements are | |||
| reuse particular responses. | focused on preventing a cache from either storing a non-reusable | |||
| response or reusing a stored response inappropriately, rather than | ||||
| mandating that caches always store and reuse particular responses. | ||||
| The _cache key_ is the information a cache uses to select a response | The _cache key_ is the information a cache uses to select a response | |||
| and is comprised of, at a minimum, the request method and target URI | and is composed from, at a minimum, the request method and target URI | |||
| used to retrieve the stored response; the method determines under | used to retrieve the stored response; the method determines under | |||
| which circumstances that response can be used to satisfy a subsequent | which circumstances that response can be used to satisfy a subsequent | |||
| request. However, many HTTP caches in common use today only cache | request. However, many HTTP caches in common use today only cache | |||
| GET responses, and therefore only use the URI as the cache key, | GET responses, and therefore only use the URI as the cache key, | |||
| forwarding other methods. | forwarding other methods. | |||
| If a request target is subject to content negotiation, the cache | If a request target is subject to content negotiation, the cache | |||
| might store multiple responses for it. Caches differentiate these | might store multiple responses for it. Caches differentiate these | |||
| responses by incorporating values of the original request's selecting | responses by incorporating values of the original request's selecting | |||
| header fields into the cache key as well, using information in the | header fields into the cache key as well, using information in the | |||
| Vary response header field, as per Section 4.1. | Vary response header field, as per Section 4.1. | |||
| Caches might incorporate additional material into the cache key. For | Caches might incorporate additional material into the cache key. For | |||
| example, user agent caches might include the referring site's | example, user agent caches might include the referring site's | |||
| identity, thereby "double keying" the cache to avoid some privacy | identity, thereby "double keying" the cache to avoid some privacy | |||
| risks (see Section 7.2). | risks (see Section 7.2). | |||
| Most commonly, caches store the successful result of a retrieval | Most commonly, caches store the successful result of a retrieval | |||
| request: i.e., a 200 (OK) response to a GET request, which contains a | request: i.e., a 200 (OK) response to a GET request, which contains a | |||
| representation of the target resource (Section 9.3.1 of [Semantics]). | 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: | |||
| * the request method is understood by the cache; | * the request method is understood by the cache; | |||
| * the response status code is final (see Section 15 of [Semantics]); | * the response status code is final (see Section 15 of [HTTP]); | |||
| * if the response status code is 206 or 304, or the "must- | * if the response status code is 206 or 304, or the "must- | |||
| understand" cache directive (see Section 5.2.2.3) is present: the | understand" cache directive (see Section 5.2.2.3) is present: the | |||
| cache understands the response status code; | cache understands the response status code; | |||
| * the "no-store" cache directive is not present in the response (see | * the "no-store" cache directive is not present in the response (see | |||
| Section 5.2.2.5); | Section 5.2.2.5); | |||
| * if the cache is shared: the "private" response directive is either | * 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); | |||
| * if the cache is shared: the Authorization header field is not | * if the cache is shared: the Authorization header field is not | |||
| present in the request (see Section 11.6.2 of [Semantics]) 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, | |||
| * the response contains at least one of: | * the response contains at least one of: | |||
| - 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); | |||
| skipping to change at page 9, line 6 ¶ | skipping to change at page 8, line 50 ¶ | |||
| 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 | unrecognised 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: | |||
| * The Connection header field and fields whose names are listed in | * The Connection header field and fields whose names are listed in | |||
| it are required by Section 7.6.1 of [Semantics] to be removed | it are required by Section 7.6.1 of [HTTP] to be removed before | |||
| before forwarding the message. This MAY be implemented by doing | forwarding the message. This MAY be implemented by doing so | |||
| so before storage. | before storage. | |||
| * Likewise, some fields' semantics require them to be removed before | * 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 | |||
| before storage; see Section 7.6.1 of [Semantics] for some | before storage; see Section 7.6.1 of [HTTP] for some examples. | |||
| examples. | ||||
| * The no-cache (Section 5.2.2.4) and private (Section 5.2.2.7) cache | * 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. | |||
| * Header fields that are specific to the proxy that a cache uses | * 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 [Semantics]), Proxy-Authentication-Info (Section 11.7.3 of | of [HTTP]), Proxy-Authentication-Info (Section 11.7.3 of [HTTP]), | |||
| [Semantics]), and Proxy-Authorization (Section 11.7.2 of | and Proxy-Authorization (Section 11.7.2 of [HTTP]). | |||
| [Semantics]). | ||||
| Caches MAY either store trailer fields separate from header fields, | Caches MAY either store trailer fields separate from header fields, | |||
| or discard them. Caches MUST NOT combine trailer fields with header | or 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 Section 3.4, Section 4.3.4 and Section 4.3.5. | |||
| skipping to change at page 10, line 36 ¶ | skipping to change at page 10, line 28 ¶ | |||
| 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 | store a response body that is not complete (Section 3.4 of [HTTP]) if | |||
| [Semantics]) if the stored response is recorded as being incomplete. | the stored response is recorded as being incomplete. Likewise, a 206 | |||
| Likewise, a 206 (Partial Content) response MAY be stored as if it | (Partial Content) response MAY be stored as if it were an incomplete | |||
| were an incomplete 200 (OK) response. However, a cache MUST NOT | 200 (OK) response. However, a cache MUST NOT store incomplete or | |||
| store incomplete or partial-content responses if it does not support | partial-content responses if it does not support the Range and | |||
| the Range and Content-Range header fields or if it does not | Content-Range header fields or if it does not understand the range | |||
| understand the range units used in those fields. | 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 [Semantics]) and combining | subsequent range request (Section 14.2 of [HTTP]) and combining the | |||
| 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. | |||
| 3.4. Combining Partial Content | 3.4. Combining Partial Content | |||
| A response might transfer only a partial representation if the | A response might transfer only a partial representation if the | |||
| connection closed prematurely or if the request used one or more | connection closed prematurely or if the request used one or more | |||
| Range specifiers (Section 14.2 of [Semantics]). After several such | Range specifiers (Section 14.2 of [HTTP]). After several such | |||
| transfers, a cache might have received several ranges of the same | transfers, a cache might have received several ranges of the same | |||
| representation. A cache MAY combine these ranges into a single | representation. A cache MAY combine these ranges into a single | |||
| stored response, and reuse that response to satisfy later requests, | stored response, and reuse that response to satisfy later requests, | |||
| if they all share the same strong validator and the cache complies | if they all share the same strong validator and the cache complies | |||
| with the client requirements in Section 15.3.7.3 of [Semantics]. | with the client requirements in Section 15.3.7.3 of [HTTP]. | |||
| 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 [Semantics]) to satisfy | Authorization header field (Section 11.6.2 of [HTTP]) to satisfy any | |||
| any subsequent request unless the response contains a Cache-Control | subsequent request unless the response contains a Cache-Control field | |||
| field with a response directive (Section 5.2.2) that allows it to be | with a response directive (Section 5.2.2) that allows it to be stored | |||
| stored by a shared cache and the cache conforms to the requirements | by a shared cache and the cache conforms to the requirements of that | |||
| 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: | |||
| * The presented target URI (Section 7.1 of [Semantics]) and that of | * The presented target URI (Section 7.1 of [HTTP]) and that of the | |||
| the stored response match, and | stored response match, and | |||
| * the request method associated with the stored response allows it | * the request method associated with the stored response allows it | |||
| to be used for the presented request, and | to be used for the presented request, and | |||
| * selecting header fields nominated by the stored response (if any) | * selecting header fields nominated by the stored response (if any) | |||
| match those presented (see Section 4.1), and | match those presented (see Section 4.1), and | |||
| * the stored response does not contain the no-cache cache directive | * the stored response does not contain the no-cache cache directive | |||
| (Section 5.2.2.4), unless it is successfully validated | (Section 5.2.2.4), unless it is successfully validated | |||
| (Section 4.3), and | (Section 4.3), and | |||
| skipping to change at page 12, line 20 ¶ | skipping to change at page 12, line 20 ¶ | |||
| Note that a cache-control extension can override any of the | Note that a cache-control extension can override any of the | |||
| requirements listed; see Section 5.2.3. | requirements 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 [Semantics]) to the origin server; i.e., a cache is | (Section 9.2.1 of [HTTP]) to the origin server; i.e., a cache is not | |||
| not allowed to generate a reply to such a request before having | allowed to generate a reply to such a request before having forwarded | |||
| 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 response that is stored or storable can be used to satisfy multiple | |||
| requests, provided that it is allowed to reuse that response for the | requests, provided that it is allowed to reuse that response for the | |||
| requests in question. This enables caches to _collapse requests_ - | requests in question. This enables caches to _collapse requests_ - | |||
| or combine multiple incoming requests into a single forward one upon | or combine multiple incoming requests into a single forward request | |||
| a cache miss - thereby reducing load on the origin server and | upon a cache miss - thereby reducing load on the origin server and | |||
| network. However, note that if the response returned is not able to | network. However, note that if the response returned is not able to | |||
| be used for some or all of the collapsed requests, additional latency | be used for some or all of the collapsed requests, additional latency | |||
| might be introduced, because they will need to be forwarded to be | might be introduced, because they will need to be forwarded to be | |||
| satisfied. | satisfied. | |||
| When more than one suitable response is stored, a cache MUST use the | When more than one suitable response is stored, a cache MUST use the | |||
| most recent one (as determined by the Date header field). It can | most recent one (as determined by the Date header field). It can | |||
| also forward the request with "Cache-Control: max-age=0" or "Cache- | also forward the request with "Cache-Control: max-age=0" or "Cache- | |||
| Control: no-cache" to disambiguate which response to use. | Control: no-cache" to disambiguate which response to use. | |||
| A cache that does not have a clock available MUST NOT use stored | A cache that does not have a clock available MUST NOT use stored | |||
| responses without revalidating them upon every use. | responses without revalidating them upon every use. | |||
| 4.1. Calculating Cache Keys with Vary | 4.1. Calculating Cache Keys with the Vary Header Field | |||
| When a cache receives a request that can be satisfied by a stored | When a cache receives a request that can be satisfied by a stored | |||
| response that has a Vary header field (Section 12.5.5 of | response and that stored response contains a Vary header field | |||
| [Semantics]), it MUST NOT use that response unless all the selecting | (Section 12.5.5 of [HTTP]), the cache MUST NOT use that stored | |||
| header fields nominated by the Vary header field match in both the | response without revalidation unless all the selecting header fields | |||
| original request (i.e., that associated with the stored response), | (nominated by that Vary field value) in the present request match | |||
| and the presented request. | those fields in the original request (i.e., the request that caused | |||
| the cached response to be stored). | ||||
| The selecting header fields from two requests are defined to match if | The selecting header fields from two requests are defined to match if | |||
| and only if those in the first request can be transformed to those in | and only if those in the first request can be transformed to those in | |||
| the second request by applying any of: | the second request by applying any of: | |||
| * adding or removing whitespace, where allowed in the header field's | * adding or removing whitespace, where allowed in the header field's | |||
| syntax | syntax | |||
| * combining multiple header field lines with the same field name | * combining multiple header field lines with the same field name | |||
| (see Section 5.2 of [Semantics]) | (see Section 5.2 of [HTTP]) | |||
| * normalizing both header field values in a way that is known to | * normalizing both header field values in a way that is known to | |||
| have identical semantics, according to the header field's | have identical semantics, according to the header field's | |||
| specification (e.g., reordering field values when order is not | specification (e.g., reordering field values when order is not | |||
| significant; case-normalization, where values are defined to be | significant; case-normalization, where values are defined to be | |||
| case-insensitive) | case-insensitive) | |||
| If (after any normalization that might take place) a header field is | If (after any normalization that might take place) a header field is | |||
| absent from a request, it can only match another request if it is | absent from a request, it can only match another request if it is | |||
| also absent there. | also absent there. | |||
| A Vary header field value containing a member "*" always fails to | A stored response with a Vary header field value containing a member | |||
| match. | "*" always fails to match. | |||
| The stored response with matching selecting header fields is known as | The stored response with matching selecting header fields is known as | |||
| the _selected response_. | the _selected response_. | |||
| If multiple selected responses are available (potentially including | If multiple selected responses are available (potentially including | |||
| responses without a Vary header field), the cache will need to choose | responses without a Vary header field), the cache will need to choose | |||
| one to use. When a selecting header field has a known mechanism for | one to use. When a selecting header field has a known mechanism for | |||
| doing so (e.g., qvalues on Accept and similar request header fields), | doing so (e.g., qvalues on Accept and similar request header fields), | |||
| that mechanism MAY be used to select a preferred response. If such a | that mechanism MAY be used to select a preferred response. If such a | |||
| mechanism is not available, or leads to equally preferred responses, | mechanism is not available, or leads to equally preferred responses, | |||
| skipping to change at page 15, line 6 ¶ | skipping to change at page 15, line 13 ¶ | |||
| time under certain circumstances (see Section 4.2.2). | time under certain circumstances (see Section 4.2.2). | |||
| The calculation to determine if a response is fresh is: | The calculation to determine if a response is fresh is: | |||
| response_is_fresh = (freshness_lifetime > current_age) | response_is_fresh = (freshness_lifetime > current_age) | |||
| freshness_lifetime is defined in Section 4.2.1; current_age is | freshness_lifetime is defined in Section 4.2.1; current_age is | |||
| defined in Section 4.2.3. | defined in Section 4.2.3. | |||
| Clients can send the max-age or min-fresh request directives | Clients can send the max-age or min-fresh request directives | |||
| (Section 5.2.1) to constrain or relax freshness calculations for the | (Section 5.2.1) to suggest limits on the freshness calculations for | |||
| corresponding response. However, caches are not required to honor | the corresponding response. However, caches are not required to | |||
| them. | honor them. | |||
| When calculating freshness, to avoid common problems in date parsing: | When calculating freshness, to avoid common problems in date parsing: | |||
| * Although all date formats are specified to be case-sensitive, a | * Although all date formats are specified to be case-sensitive, a | |||
| cache recipient SHOULD match the field value case-insensitively. | cache recipient SHOULD match the field value case-insensitively. | |||
| * If a cache recipient's internal implementation of time has less | * If a cache recipient's internal implementation of time has less | |||
| resolution than the value of an HTTP-date, the recipient MUST | resolution than the value of an HTTP-date, the recipient MUST | |||
| internally represent a parsed Expires date as the nearest time | internally represent a parsed Expires date as the nearest time | |||
| equal to or earlier than the received value. | equal to or earlier than the received value. | |||
| skipping to change at page 15, line 45 ¶ | skipping to change at page 15, line 52 ¶ | |||
| * If the cache is shared and the s-maxage response directive | * If the cache is shared and the s-maxage response directive | |||
| (Section 5.2.2.10) is present, use its value, or | (Section 5.2.2.10) is present, use its value, or | |||
| * If the max-age response directive (Section 5.2.2.1) is present, | * If the max-age response directive (Section 5.2.2.1) is present, | |||
| use its value, or | use its value, or | |||
| * If the Expires response header field (Section 5.3) is present, use | * If the Expires response header field (Section 5.3) is present, use | |||
| its value minus the value of the Date response header field (using | its value minus the value of the Date response header field (using | |||
| the time the message was received if it is not present, as per | the time the message was received if it is not present, as per | |||
| Section 10.2.2 of [Semantics]), or | Section 10.2.2 of [HTTP]), or | |||
| * Otherwise, no explicit expiration time is present in the response. | * Otherwise, no explicit expiration time is present in the response. | |||
| A heuristic freshness lifetime might be applicable; see | A heuristic freshness lifetime might be applicable; see | |||
| Section 4.2.2. | Section 4.2.2. | |||
| Note that this calculation is not vulnerable to clock skew, since all | Note that this calculation is intended to reduce clock skew by using | |||
| of the information comes from the origin server. | the clock information provided by the origin server whenever | |||
| 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. | |||
| skipping to change at page 16, line 28 ¶ | skipping to change at page 16, line 36 ¶ | |||
| 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. | 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, this means that heuristics can only | |||
| be used on responses without explicit freshness whose status codes | be used on responses without explicit freshness whose status codes | |||
| are defined as _heuristically cacheable_ (e.g., see Section 15.1 of | are defined as _heuristically cacheable_ (e.g., see Section 15.1 of | |||
| [Semantics]), and those responses without explicit freshness that | [HTTP]), and those responses without explicit freshness that have | |||
| have been marked as explicitly cacheable (e.g., with a "public" | been marked as explicitly cacheable (e.g., with a "public" response | |||
| response directive). | directive). | |||
| Note that in previous specifications heuristically cacheable response | Note that in previous specifications heuristically cacheable response | |||
| status codes were called "cacheable by default." | 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 | |||
| [Semantics]), caches are encouraged to use a heuristic expiration | [HTTP]), caches are encouraged to use a heuristic expiration value | |||
| value that is no more than some fraction of the interval since that | that is no more than some fraction of the interval since that time. | |||
| 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:* Section 13.9 of [RFC2616] prohibited caches from | |||
| | calculating heuristic freshness for URIs with query components | | calculating heuristic freshness for URIs with query components | |||
| | (i.e., those containing '?'). In practice, this has not been | | (i.e., those containing '?'). In practice, this has not been | |||
| | widely implemented. Therefore, origin servers are encouraged | | widely implemented. Therefore, origin servers are encouraged | |||
| | to send explicit directives (e.g., Cache-Control: no-cache) if | | to send explicit directives (e.g., Cache-Control: no-cache) if | |||
| | they wish to prevent caching. | | they wish to prevent caching. | |||
| 4.2.3. Calculating Age | 4.2.3. Calculating Age | |||
| skipping to change at page 17, line 23 ¶ | skipping to change at page 17, line 30 ¶ | |||
| been in transit along network paths. | been in transit along network paths. | |||
| Age calculation uses the following data: | Age calculation uses the following data: | |||
| _age_value_ The term "age_value" denotes the value of the Age header | _age_value_ The term "age_value" denotes the value of the Age header | |||
| field (Section 5.1), in a form appropriate for arithmetic | field (Section 5.1), in a form appropriate for arithmetic | |||
| operation; or 0, if not available. | operation; or 0, if not available. | |||
| _date_value_ The term "date_value" denotes the value of the Date | _date_value_ The term "date_value" denotes the value of the Date | |||
| header field, in a form appropriate for arithmetic operations. | header field, in a form appropriate for arithmetic operations. | |||
| See Section 10.2.2 of [Semantics] for the definition of the Date | See Section 10.2.2 of [HTTP] for the definition of the Date header | |||
| header field, and for requirements regarding responses without it. | field, and for requirements regarding responses without it. | |||
| _now_ The term "now" means "the current value of the clock at the | _now_ The term "now" means "the current value of the clock at the | |||
| host performing the calculation". A host ought to use NTP | host performing the calculation". A host ought to use NTP | |||
| ([RFC5905]) or some similar protocol to synchronize its clocks to | ([RFC5905]) or some similar protocol to synchronize its clocks to | |||
| Coordinated Universal Time. | Coordinated Universal Time. | |||
| _request_time_ The current value of the clock at the host at the | _request_time_ The current value of the clock at the host at the | |||
| time the request resulting in the stored response was made. | time the request resulting in the stored response was made. | |||
| _response_time_ The current value of the clock at the host at the | _response_time_ The current value of the clock at the host at the | |||
| skipping to change at page 18, line 42 ¶ | skipping to change at page 19, line 10 ¶ | |||
| or doing so is explicitly permitted by the client or origin server | or doing so is explicitly permitted by the client or origin server | |||
| (e.g., by the max-stale request directive in Section 5.2.1, by | (e.g., by the max-stale request directive in Section 5.2.1, by | |||
| extension directives such as those defined in [RFC5861], or by | extension directives such as those defined in [RFC5861], or by | |||
| configuration in accordance with an out-of-band contract). | configuration in accordance with an out-of-band contract). | |||
| 4.3. Validation | 4.3. Validation | |||
| When a cache has one or more stored responses for a requested URI, | When a cache has one or more stored responses for a requested URI, | |||
| but cannot serve any of them (e.g., because they are not fresh, or | but cannot serve any of them (e.g., because they are not fresh, or | |||
| one cannot be selected; see Section 4.1), it can use the conditional | one cannot be selected; see Section 4.1), it can use the conditional | |||
| request mechanism (Section 13.1 of [Semantics]) in the forwarded | request mechanism (Section 13.1 of [HTTP]) in the forwarded request | |||
| request to give the next inbound server an opportunity to select a | to give the next inbound server an opportunity to select a valid | |||
| valid stored response to use, updating the stored metadata in the | stored response to use, updating the stored metadata in the process, | |||
| process, or to replace the stored response(s) with a new response. | or to replace the stored response(s) with a new response. This | |||
| This process is known as _validating_ or _revalidating_ the stored | process is known as _validating_ or _revalidating_ the stored | |||
| response. | response. | |||
| 4.3.1. Sending a Validation Request | 4.3.1. Sending a Validation Request | |||
| When generating a conditional request for validation, a cache starts | When generating a conditional request for validation, a cache starts | |||
| with either a request it is attempting to satisfy, or - if it is | with either a request it is attempting to satisfy, or - if it is | |||
| initiating the request independently - it synthesises a request using | initiating the request independently - it synthesises a request using | |||
| a stored response by copying the method, target URI, and request | a stored response by copying the method, target URI, and request | |||
| header fields identified by the Vary header field (Section 4.1). | header fields identified by the Vary header field (Section 4.1). | |||
| It then updates that request with one or more precondition header | It then updates that request with one or more precondition header | |||
| fields. These contain validator metadata sourced from stored | fields. These contain validator metadata sourced from stored | |||
| response(s) that have the same URI. Typically, this will include | response(s) that have the same URI. Typically, this will include | |||
| only those stored responses(s) that have the same cache key, although | only those stored responses(s) that have the same cache key, although | |||
| a cache is allowed to validate a response that it cannot select with | a cache is allowed to validate a response that it cannot select with | |||
| the request header fields it is sending. | the request header fields it is sending (see Section 4.1). | |||
| The precondition header fields are then compared by recipients to | The precondition header fields are then compared by recipients to | |||
| determine whether any stored response is equivalent to a current | determine whether any stored response is equivalent to a current | |||
| representation of the resource. | representation of the resource. | |||
| One such validator is the timestamp given in a Last-Modified header | One such validator is the timestamp given in a Last-Modified header | |||
| field (Section 8.8.2 of [Semantics]), which can be used in an If- | field (Section 8.8.2 of [HTTP]), which can be used in an If-Modified- | |||
| Modified-Since header field for response validation, or in an If- | Since header field for response validation, or in an If-Unmodified- | |||
| Unmodified-Since or If-Range header field for representation | Since or If-Range header field for representation selection (i.e., | |||
| selection (i.e., the client is referring specifically to a previously | the client is referring specifically to a previously obtained | |||
| 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 [Semantics]). One or more entity-tags, indicating | (Section 8.8.3 of [HTTP]). One or more entity-tags, indicating one | |||
| 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). | |||
| 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 | |||
| skipping to change at page 20, line 15 ¶ | skipping to change at page 20, line 30 ¶ | |||
| A cache MUST NOT evaluate conditional header fields that only apply | A cache MUST NOT evaluate conditional header fields that only apply | |||
| to an origin server, occur in a request with semantics that cannot be | to an origin server, occur in a request with semantics that cannot be | |||
| satisfied with a cached response, or occur in a request with a target | satisfied with a cached response, or occur in a request with a target | |||
| resource for which it has no stored responses; such preconditions are | resource for which it has no stored responses; such preconditions are | |||
| likely intended for some other (inbound) server. | likely intended for some other (inbound) server. | |||
| The proper evaluation of conditional requests by a cache depends on | The proper evaluation of conditional requests by a cache depends on | |||
| the received precondition header fields and their precedence. In | the received precondition header fields and their precedence. In | |||
| summary, the If-Match and If-Unmodified-Since conditional header | summary, the If-Match and If-Unmodified-Since conditional header | |||
| fields are not applicable to a cache, and If-None-Match takes | fields are not applicable to a cache, and If-None-Match takes | |||
| precedence over If-Modified-Since. See Section 13.2.2 of [Semantics] | precedence over If-Modified-Since. See Section 13.2.2 of [HTTP] for | |||
| for a complete specification of precondition precedence. | a complete specification of precondition precedence. | |||
| A request containing an If-None-Match header field (Section 13.1.2 of | A request containing an If-None-Match header field (Section 13.1.2 of | |||
| [Semantics]) indicates that the client wants to validate one or more | [HTTP]) indicates that the client wants to validate one or more of | |||
| of its own stored responses in comparison to the stored response | its own stored responses in comparison to the stored response | |||
| selected by the cache (as per Section 4). | selected by the cache (as per Section 4). | |||
| If an If-None-Match header field is not present, a request containing | If an If-None-Match header field is not present, a request containing | |||
| an If-Modified-Since header field (Section 13.1.3 of [Semantics]) | an If-Modified-Since header field (Section 13.1.3 of [HTTP]) | |||
| indicates that the client wants to validate one or more of its own | indicates that the client wants to validate one or more of its own | |||
| stored responses by modification date. | stored responses by modification date. | |||
| If a request contains an If-Modified-Since header field and the Last- | If a request contains an If-Modified-Since header field and the Last- | |||
| Modified header field is not present in a selected stored response, a | Modified header field is not present in a selected stored response, a | |||
| cache SHOULD use the stored response's Date field value (or, if no | cache SHOULD use the stored response's Date field value (or, if no | |||
| Date field is present, the time that the stored response was | Date field is present, the time that the stored response was | |||
| received) to evaluate the conditional. | received) to 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 [Semantics], also needs to evaluate a | defined in Section 14.2 of [HTTP], also needs to evaluate a received | |||
| received If-Range header field (Section 13.1.5 of [Semantics]) | If-Range header field (Section 13.1.5 of [HTTP]) regarding its | |||
| regarding its selected stored response. | selected stored response. | |||
| When a cache decides to forward a request to revalidate its own | When a cache decides to forward a request to revalidate its own | |||
| stored responses for a request that contains an If-None-Match list of | stored responses for a request that contains an If-None-Match list of | |||
| entity-tags, the cache MAY combine the received list with a list of | entity-tags, the cache MAY combine the received list with a list of | |||
| entity-tags from its own stored set of responses (fresh or stale) and | entity-tags from its own stored set of responses (fresh or stale) and | |||
| send the union of the two lists as a replacement If-None-Match header | send the union of the two lists as a replacement If-None-Match header | |||
| field value in the forwarded request. If a stored response contains | field value in the forwarded request. If a stored response contains | |||
| only partial content, the cache MUST NOT include its entity-tag in | only partial content, the cache MUST NOT include its entity-tag in | |||
| the union unless the request is for a range that would be fully | the union unless the request is for a range that would be fully | |||
| satisfied by that partial stored response. If the response to the | satisfied by that partial stored response. If the response to the | |||
| skipping to change at page 21, line 28 ¶ | skipping to change at page 21, line 43 ¶ | |||
| * However, if a cache receives a 5xx (Server Error) response while | * 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 and already has | When a cache receives a 304 (Not Modified) response, it needs to | |||
| one or more stored 200 (OK) responses for the applicable request URI, | identify stored responses that are suitable for updating with the new | |||
| the cache needs to identify which (if any) are to be updated by the | information provided, and then do so. | |||
| new information provided, and then do so. | ||||
| The stored response(s) to update are identified by using the first | The initial set of stored responses to update are those that could | |||
| match (if any) of: | have been selected for that request - i.e., those that meet the | |||
| requirements in Section 4, except the last requirement to be fresh, | ||||
| able to be served stale or just validated. | ||||
| Then, that initial set of stored response(s) is further filtered by | ||||
| the first match of: | ||||
| * If the new response contains one or more _strong validators_ (see | * If the new response contains one or more _strong validators_ (see | |||
| Section 8.8.1 of [Semantics]), then each of those strong | Section 8.8.1 of [HTTP]), then each of those strong validators | |||
| validators identify the selected representation for update. All | identify a selected representation for update. All the stored | |||
| the stored responses with one of those same strong validators are | responses in the initial set with one of those same strong | |||
| identified for update. If none of the stored responses contain at | validators are identified for update. If none of the initial set | |||
| least one of the same strong validators, then the cache MUST NOT | contain at least one of the same strong validators, then the cache | |||
| use the new response to update any stored responses. | MUST NOT use the new response to update any stored responses. | |||
| * If the new response contains no strong validators but does contain | * 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 cache's stored responses, then the most recent of those | one of the initial set's stored responses, then the most recent of | |||
| matching stored responses is identified for update. | those matching stored responses is identified for update. | |||
| * If the new response does not include any form of validator (such | * 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, and that stored response also | there is only one stored response in the initial set, and that | |||
| lacks a validator, then that stored response is identified for | stored response also lacks a validator, then that stored response | |||
| update. | is identified for update. | |||
| For each stored response identified, the cache MUST update its header | For each stored response identified, the cache MUST update its header | |||
| fields with the header fields provided in the 304 (Not Modified) | fields with the header fields provided in the 304 (Not Modified) | |||
| response, as per Section 3.2. | response, as per Section 3.2. | |||
| 4.3.5. Freshening Responses with HEAD | 4.3.5. Freshening Responses with HEAD | |||
| A response to the HEAD method is identical to what an equivalent | A response to the HEAD method is identical to what an equivalent | |||
| request made with a GET would have been, without sending the content. | request made with a GET would have been, without sending the content. | |||
| This property of HEAD responses can be used to invalidate or update a | This property of HEAD responses can be used to invalidate or update a | |||
| skipping to change at page 22, line 45 ¶ | skipping to change at page 23, line 19 ¶ | |||
| Length matches that of the stored response, the cache SHOULD update | Length matches that of the stored response, the cache SHOULD update | |||
| the stored response as described below; otherwise, the cache SHOULD | the stored response as described below; otherwise, the cache SHOULD | |||
| consider the stored response to be stale. | consider the stored response to be stale. | |||
| If a cache updates a stored response with the metadata provided in a | If a cache updates a stored response with the metadata provided in a | |||
| HEAD response, the cache MUST use the header fields provided in the | HEAD response, the cache MUST use the header fields provided in the | |||
| HEAD response to update the stored response (see Section 3.2). | HEAD response to update the stored response (see Section 3.2). | |||
| 4.4. Invalidating Stored Responses | 4.4. Invalidating Stored Responses | |||
| Because unsafe request methods (Section 9.2.1 of [Semantics]) such as | Because unsafe request methods (Section 9.2.1 of [HTTP]) such as PUT, | |||
| PUT, POST or DELETE have the potential for changing state on the | POST or DELETE have the potential for changing state on the origin | |||
| 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 [Semantics]) | A cache MUST invalidate the target URI (Section 7.1 of [HTTP]) when | |||
| when it receives a non-error status code in response to an unsafe | it receives a non-error status code in response to an unsafe request | |||
| 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 | |||
| [Semantics]) of the URI to be invalidated differs from that of the | [HTTP]) of the URI to be invalidated differs from that of the target | |||
| target URI (Section 7.1 of [Semantics]). This helps prevent denial- | URI (Section 7.1 of [HTTP]). This helps prevent denial-of-service | |||
| 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 will mark them | |||
| as "invalid" and in need of a mandatory validation before they can be | as "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 | |||
| skipping to change at page 23, line 43 ¶ | skipping to change at page 24, line 20 ¶ | |||
| 5.1. Age | 5.1. Age | |||
| The "Age" response header field conveys the sender's estimate of the | The "Age" response header field conveys the sender's estimate of the | |||
| time since the response was generated or successfully validated at | time since the response was generated or successfully validated at | |||
| the origin server. Age values are calculated as specified in | the origin server. Age values are calculated as specified in | |||
| Section 4.2.3. | Section 4.2.3. | |||
| Age = delta-seconds | Age = delta-seconds | |||
| The Age field value is a non-negative integer, representing time in | The Age field value is a non-negative integer, representing time in | |||
| seconds (see Section 1.3). | seconds (see Section 1.2.2). | |||
| Although it is defined as a singleton header field, a cache | Although it is defined as a singleton header field, a cache | |||
| encountering a message with a list-based Age field value SHOULD use | encountering a message with a list-based Age field value SHOULD use | |||
| the first member of the field value, discarding subsequent ones. | the first member of the field value, discarding subsequent ones. | |||
| If the field value (after discarding additional members, as per | If the field value (after discarding additional members, as per | |||
| above) is invalid (e.g., it contains something other than a non- | above) is invalid (e.g., it contains something other than a non- | |||
| 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 | |||
| skipping to change at page 24, line 49 ¶ | skipping to change at page 25, line 27 ¶ | |||
| 5.2.1. Request Cache-Control Directives | 5.2.1. Request Cache-Control 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.3) | 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.3) | 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 a response that has exceeded its freshness lifetime. If a | accept a response that has exceeded its freshness lifetime. If a | |||
| value is present, then the client is willing to accept a response | value is present, then the client is willing to accept a response | |||
| that has exceeded its freshness lifetime by no more than the | that has exceeded its freshness lifetime by no more than the | |||
| specified number of seconds. If no value is assigned to max-stale, | specified number of seconds. If no value is assigned to max-stale, | |||
| then the client will accept a stale response of any age. | then the client 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.3) | 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. | |||
| skipping to change at page 26, line 28 ¶ | skipping to change at page 27, line 9 ¶ | |||
| networks might be vulnerable to eavesdropping. | networks might 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 [Semantics]. | 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, either respond using a stored | |||
| response consistent with the other constraints of the request, or | response consistent with the other constraints of the request, or | |||
| respond with a 504 (Gateway Timeout) status code. | respond with a 504 (Gateway Timeout) status code. | |||
| 5.2.2. Response Cache-Control Directives | 5.2.2. Response Cache-Control 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.3) | 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 | |||
| skipping to change at page 27, line 30 ¶ | skipping to change at page 28, line 11 ¶ | |||
| 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 [Semantics]), 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 to a cache that understands and conforms to the requirements | response to a cache that understands and conforms to the requirements | |||
| for that response's status code. | for that response's status code. | |||
| Responses containing "must-understand" SHOULD also contain the "no- | Responses containing "must-understand" SHOULD also contain the "no- | |||
| store" directive; caches that implement "must-understand" SHOULD | store" directive; caches that implement "must-understand" SHOULD | |||
| skipping to change at page 29, line 12 ¶ | skipping to change at page 29, line 38 ¶ | |||
| might not recognize or obey this directive, and communications | might not recognize or obey this directive, and communications | |||
| networks might be vulnerable to eavesdropping. | networks might 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 certain circumstances; see Section 5.2.2.3. | in 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 [Semantics]. | 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 | |||
| skipping to change at page 30, line 38 ¶ | skipping to change at page 31, line 12 ¶ | |||
| 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.3) | 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 proxy-revalidate | |||
| (Section 5.2.2.8) response directive's semantics for a shared cache. | (Section 5.2.2.8) response directive's semantics 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 | |||
| skipping to change at page 31, line 12 ¶ | skipping to change at page 31, line 35 ¶ | |||
| 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. Cache Control Extensions | |||
| 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 cache-extension tokens, each with an optional value. A cache | or more extension cache directives. A cache MUST ignore unrecognized | |||
| 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 | |||
| skipping to change at page 31, line 37 ¶ | skipping to change at page 32, line 14 ¶ | |||
| 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, any cache that is shared only by members | |||
| of the named community is allowed to cache the response. An origin | of 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-extension 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-extension 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: | |||
| * What it means for a directive to be specified multiple times, | * What it means for a directive to be specified multiple times, | |||
| * When the directive does not take an argument, what it means when | * When the directive does not take an argument, what it means when | |||
| an argument is present, | an argument is present, | |||
| * When the directive requires an argument, what it means when it is | * When the directive requires an argument, what it means when it is | |||
| skipping to change at page 32, line 35 ¶ | skipping to change at page 33, line 10 ¶ | |||
| The "Expires" response header field gives the date/time after which | The "Expires" response header field gives the date/time after which | |||
| the response is considered stale. See Section 4.2 for further | the response is considered stale. See Section 4.2 for further | |||
| discussion of the freshness model. | discussion of the freshness model. | |||
| The presence of an Expires header field does not imply that the | The presence of an Expires header field does not imply that the | |||
| original resource will change or cease to exist at, before, or after | original resource will change or cease to exist at, before, or after | |||
| that time. | that time. | |||
| The Expires field value is an HTTP-date timestamp, as defined in | The Expires field value is an HTTP-date timestamp, as defined in | |||
| Section 5.6.7 of [Semantics]. See also Section 4.2 for parsing | Section 5.6.7 of [HTTP]. See also Section 4.2 for parsing | |||
| requirements specific to caches. | requirements specific to caches. | |||
| Expires = HTTP-date | Expires = HTTP-date | |||
| For example | For example | |||
| Expires: Thu, 01 Dec 1994 16:00:00 GMT | Expires: Thu, 01 Dec 1994 16:00:00 GMT | |||
| A cache recipient MUST interpret invalid date formats, especially the | A cache recipient MUST interpret invalid date formats, especially the | |||
| value "0", as representing a time in the past (i.e., "already | value "0", as representing a time in the past (i.e., "already | |||
| skipping to change at page 34, line 37 ¶ | skipping to change at page 35, line 10 ¶ | |||
| directly related to the request that fetched it (such as those | directly related to the request that fetched it (such as those | |||
| created during the same page load), it would likely be surprising and | created during the same page load), it would likely be surprising and | |||
| confusing to users and authors if it were allowed to be reused for | confusing to users and authors if it were allowed to be reused for | |||
| requests unrelated in any way to the one from which it was obtained. | requests 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 [Messaging]) and "HTTP Semantics" (Section 17 of | (Section 11 of [HTTP/1.1]) and "HTTP Semantics" (Section 17 of | |||
| [Semantics]). | [HTTP]). | |||
| Caches expose additional potential vulnerabilities, since the | Caches expose an additional attack surface, since the contents of the | |||
| contents of the cache represent an attractive target for malicious | cache represent an attractive target for malicious exploitation. | |||
| exploitation. Because cache contents persist after an HTTP request | Because cache contents persist after an HTTP request is complete, an | |||
| is complete, an attack on the cache can reveal information long after | attack on the cache can reveal information long after a user believes | |||
| a user believes that the information has been removed from the | that the information has been removed from the network. Therefore, | |||
| network. Therefore, cache contents need to be protected as sensitive | cache contents need to be protected as sensitive information. | |||
| information. | ||||
| In particular, because private caches are restricted to a single | ||||
| user, they can be used to reconstruct a user's activity. As a | ||||
| result, is important for user agents to allow end users to control | ||||
| them; for example, allowing stored responses to be removed for some | ||||
| or all origin servers. | ||||
| 7.1. Cache Poisoning | 7.1. Cache Poisoning | |||
| Various attacks might be amplified by being stored in a cache. Such | Storing a malicious payload in a cache can extend the reach of an | |||
| "cache poisoning" attacks happen when an attacker uses implementation | attacker to affect multiple users. Such "cache poisoning" attacks | |||
| flaws, elevated privileges, or other techniques to insert a response | happen when an attacker uses implementation flaws, elevated | |||
| into a cache. This is especially effective when shared caches are | privileges, or other techniques to insert a response into a cache. | |||
| used to distribute malicious content to many clients. | This is especially effective when shared caches are used to | |||
| 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 [Messaging] 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 optimise | |||
| performance, its use can "leak" information about what resources have | performance, its use can "leak" information about what resources have | |||
| been previously requested. | 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 | |||
| skipping to change at page 35, line 42 ¶ | skipping to change at page 36, line 17 ¶ | |||
| 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 (as well as misunderstanding of | |||
| cache operation) might lead to caching of sensitive information | cache operation) might lead to caching of sensitive information | |||
| (e.g., authentication credentials) that is thought to be private, | (e.g., authentication credentials) that is thought to be private, | |||
| exposing it to unauthorized parties. | exposing it to unauthorized parties. | |||
| Note that the Set-Cookie response header field [RFC6265] 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 who wish to control caching of these responses are encouraged | |||
| to emit appropriate Cache-Control response header fields. | to emit appropriate Cache-Control response header fields. | |||
| 8. IANA Considerations | 8. IANA Considerations | |||
| The change controller for the following registrations is: "IETF | The change controller for the following registrations is: "IETF | |||
| (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 | First, introduce the new "Hypertext Transfer Protocol (HTTP) Field | |||
| Name Registry" at <https://www.iana.org/assignments/http-fields> as | Name Registry" at <https://www.iana.org/assignments/http-fields> as | |||
| described in Section 18.4 of [Semantics]. | described in Section 18.4 of [HTTP]. | |||
| Then, please update the registry with the field names listed in the | Then, please update the registry with the field names listed in the | |||
| table below: | table below: | |||
| +===============+===========+======+==========+ | +===============+===========+======+==========+ | |||
| | Field Name | Status | Ref. | Comments | | | Field Name | Status | Ref. | Comments | | |||
| +===============+===========+======+==========+ | +===============+===========+======+==========+ | |||
| | Age | standard | 5.1 | | | | Age | standard | 5.1 | | | |||
| +---------------+-----------+------+----------+ | +---------------+-----------+------+----------+ | |||
| | Cache-Control | standard | 5.2 | | | | Cache-Control | standard | 5.2 | | | |||
| skipping to change at page 37, line 47 ¶ | skipping to change at page 38, line 5 ¶ | |||
| 8.3. Warn Code Registry | 8.3. Warn Code Registry | |||
| Please add a note to the "Hypertext Transfer Protocol (HTTP) Warn | Please add a note to the "Hypertext Transfer Protocol (HTTP) Warn | |||
| Codes" registry at <https://www.iana.org/assignments/http-warn-codes> | Codes" registry at <https://www.iana.org/assignments/http-warn-codes> | |||
| to the effect that Warning is obsoleted. | to the effect that Warning is obsoleted. | |||
| 9. References | 9. References | |||
| 9.1. Normative References | 9.1. Normative References | |||
| [Messaging] | [HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
| Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | Ed., "HTTP Semantics", Work in Progress, Internet-Draft, | |||
| draft-ietf-httpbis-semantics-17, 26 July 2021, | ||||
| <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | ||||
| semantics-17>. | ||||
| [HTTP/1.1] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | ||||
| Ed., "HTTP/1.1", Work in Progress, Internet-Draft, draft- | Ed., "HTTP/1.1", Work in Progress, Internet-Draft, draft- | |||
| ietf-httpbis-messaging-16, 27 May 2021, | ietf-httpbis-messaging-17, 26 July 2021, | |||
| <https://tools.ietf.org/html/draft-ietf-httpbis-messaging- | <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | |||
| 16>. | messaging-17>. | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | |||
| Specifications: ABNF", STD 68, RFC 5234, | Specifications: ABNF", STD 68, RFC 5234, | |||
| DOI 10.17487/RFC5234, January 2008, | DOI 10.17487/RFC5234, January 2008, | |||
| <https://www.rfc-editor.org/info/rfc5234>. | <https://www.rfc-editor.org/info/rfc5234>. | |||
| [RFC7405] Kyzivat, P., "Case-Sensitive String Support in ABNF", | [RFC7405] Kyzivat, P., "Case-Sensitive String Support in ABNF", | |||
| RFC 7405, DOI 10.17487/RFC7405, December 2014, | RFC 7405, DOI 10.17487/RFC7405, December 2014, | |||
| <https://www.rfc-editor.org/info/rfc7405>. | <https://www.rfc-editor.org/info/rfc7405>. | |||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| [Semantics] | ||||
| Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | ||||
| Ed., "HTTP Semantics", Work in Progress, Internet-Draft, | ||||
| draft-ietf-httpbis-semantics-16, 27 May 2021, | ||||
| <https://tools.ietf.org/html/draft-ietf-httpbis-semantics- | ||||
| 16>. | ||||
| 9.2. Informative References | 9.2. Informative References | |||
| [COOKIE] Barth, A., "HTTP State Management Mechanism", RFC 6265, | ||||
| DOI 10.17487/RFC6265, April 2011, | ||||
| <https://www.rfc-editor.org/info/rfc6265>. | ||||
| [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., | [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., | |||
| Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext | Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext | |||
| Transfer Protocol -- HTTP/1.1", RFC 2616, | Transfer Protocol -- HTTP/1.1", RFC 2616, | |||
| DOI 10.17487/RFC2616, June 1999, | DOI 10.17487/RFC2616, June 1999, | |||
| <https://www.rfc-editor.org/info/rfc2616>. | <https://www.rfc-editor.org/info/rfc2616>. | |||
| [RFC5861] Nottingham, M., "HTTP Cache-Control Extensions for Stale | [RFC5861] Nottingham, M., "HTTP Cache-Control Extensions for Stale | |||
| Content", RFC 5861, DOI 10.17487/RFC5861, April 2010, | Content", RFC 5861, DOI 10.17487/RFC5861, April 2010, | |||
| <https://www.rfc-editor.org/info/rfc5861>. | <https://www.rfc-editor.org/info/rfc5861>. | |||
| [RFC5905] Mills, D., Martin, J., Ed., Burbank, J., and W. Kasch, | [RFC5905] Mills, D., Martin, J., Ed., Burbank, J., and W. Kasch, | |||
| "Network Time Protocol Version 4: Protocol and Algorithms | "Network Time Protocol Version 4: Protocol and Algorithms | |||
| Specification", RFC 5905, DOI 10.17487/RFC5905, June 2010, | Specification", RFC 5905, DOI 10.17487/RFC5905, June 2010, | |||
| <https://www.rfc-editor.org/info/rfc5905>. | <https://www.rfc-editor.org/info/rfc5905>. | |||
| [RFC6265] Barth, A., "HTTP State Management Mechanism", RFC 6265, | ||||
| DOI 10.17487/RFC6265, April 2011, | ||||
| <https://www.rfc-editor.org/info/rfc6265>. | ||||
| [RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. F. Reschke, | [RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. F. Reschke, | |||
| Ed., "Hypertext Transfer Protocol (HTTP): Caching", | Ed., "Hypertext Transfer Protocol (HTTP): Caching", | |||
| RFC 7234, DOI 10.17487/RFC7234, June 2014, | RFC 7234, DOI 10.17487/RFC7234, June 2014, | |||
| <https://www.rfc-editor.org/info/rfc7234>. | <https://www.rfc-editor.org/info/rfc7234>. | |||
| [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | |||
| Writing an IANA Considerations Section in RFCs", BCP 26, | Writing an IANA Considerations Section in RFCs", BCP 26, | |||
| RFC 8126, DOI 10.17487/RFC8126, June 2017, | RFC 8126, DOI 10.17487/RFC8126, June 2017, | |||
| <https://www.rfc-editor.org/info/rfc8126>. | <https://www.rfc-editor.org/info/rfc8126>. | |||
| Appendix A. Collected ABNF | Appendix A. Collected ABNF | |||
| In the collected ABNF below, list rules are expanded as per | In the collected ABNF below, list rules are expanded as per | |||
| Section 5.6.1.1 of [Semantics]. | Section 5.6.1.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 [Semantics], Section 5.6.7> | HTTP-date = <HTTP-date, see [HTTP], Section 5.6.7> | |||
| OWS = <OWS, see [Semantics], Section 5.6.3> | OWS = <OWS, see [HTTP], Section 5.6.3> | |||
| cache-directive = token [ "=" ( token / quoted-string ) ] | cache-directive = token [ "=" ( token / quoted-string ) ] | |||
| delta-seconds = 1*DIGIT | delta-seconds = 1*DIGIT | |||
| field-name = <field-name, see [Semantics], Section 5.1> | field-name = <field-name, see [HTTP], Section 5.1> | |||
| quoted-string = <quoted-string, see [Semantics], Section 5.6.4> | quoted-string = <quoted-string, see [HTTP], Section 5.6.4> | |||
| token = <token, see [Semantics], 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 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) | |||
| skipping to change at page 46, line 19 ¶ | skipping to change at page 46, line 22 ¶ | |||
| deployed caches (<https://github.com/httpwg/http-core/issues/778>) | deployed caches (<https://github.com/httpwg/http-core/issues/778>) | |||
| * In Section 5.3, mention parsing requirement relaxation | * In Section 5.3, mention parsing requirement relaxation | |||
| (<https://github.com/httpwg/http-core/issues/779>) | (<https://github.com/httpwg/http-core/issues/779>) | |||
| C.17. Since draft-ietf-httpbis-cache-15 | C.17. Since draft-ietf-httpbis-cache-15 | |||
| * In Section 4.3.1, tune description of relation between cache keys | * In Section 4.3.1, tune description of relation between cache keys | |||
| and validators (<https://github.com/httpwg/http-core/issues/832>) | and validators (<https://github.com/httpwg/http-core/issues/832>) | |||
| Acknowledgments | C.18. Since draft-ietf-httpbis-cache-16 | |||
| See Appendix "Acknowledgments" of [Semantics]. | 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: | ||||
| * Addressed Genart last call review comments | ||||
| (<https://github.com/httpwg/http-core/issues/847>) | ||||
| * In Section 4.3.4, clarify that only selectable responses are | ||||
| updated (<https://github.com/httpwg/http-core/issues/839>) | ||||
| Acknowledgements | ||||
| See Appendix "Acknowledgements" of [HTTP]. | ||||
| Index | Index | |||
| A C E F G H M N O P S V W | A C E F G H M N O P S V W | |||
| A | A | |||
| Age header field Section 5.1 | Age header field Section 5.1 | |||
| age Section 4.2 | age Section 4.2 | |||
| skipping to change at page 47, line 14 ¶ | skipping to change at page 47, line 31 ¶ | |||
| freshness lifetime Section 4.2 | freshness lifetime Section 4.2 | |||
| G | G | |||
| Grammar | Grammar | |||
| Age Section 5.1 | Age Section 5.1 | |||
| Cache-Control Section 5.2 | Cache-Control Section 5.2 | |||
| DIGIT Section 1.2 | DIGIT Section 1.2 | |||
| Expires Section 5.3 | Expires Section 5.3 | |||
| cache-directive Section 5.2 | cache-directive Section 5.2 | |||
| delta-seconds Section 1.3 | delta-seconds Section 1.2.2 | |||
| H | H | |||
| Header Fields | Header Fields | |||
| Age Section 5.1; Section 5.1 | Age Section 5.1; Section 5.1 | |||
| Cache-Control Section 5.2 | Cache-Control Section 5.2 | |||
| Expires Section 5.3; Section 5.3 | Expires Section 5.3; Section 5.3 | |||
| Pragma Section 5.4; Section 5.4 | Pragma Section 5.4; Section 5.4 | |||
| Warning Section 5.5 | Warning Section 5.5 | |||
| heuristic expiration time Section 4.2 | heuristic expiration time Section 4.2 | |||
| skipping to change at page 48, line 12 ¶ | skipping to change at page 48, line 30 ¶ | |||
| private cache Section 1 | private cache Section 1 | |||
| proxy-revalidate (cache directive) Section 5.2.2.8 | proxy-revalidate (cache directive) Section 5.2.2.8 | |||
| public (cache directive) Section 5.2.2.9 | public (cache directive) Section 5.2.2.9 | |||
| S | S | |||
| s-maxage (cache directive) Section 5.2.2.10 | s-maxage (cache directive) Section 5.2.2.10 | |||
| selected response Section 4.1 | selected response Section 4.1 | |||
| shared cache Section 1 | shared cache Section 1 | |||
| stale Section 4.2 | stale Section 4.2 | |||
| strong validator Section 4.3.4 | ||||
| V | V | |||
| validator Section 4.3.1 | validator Section 4.3.1 | |||
| W | W | |||
| Warning header field Section 5.5 | Warning header field Section 5.5 | |||
| Authors' Addresses | Authors' Addresses | |||
| End of changes. 108 change blocks. | ||||
| 231 lines changed or deleted | 257 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||