| draft-ietf-httpbis-no-vary-search-09.txt | draft-ietf-httpbis-no-vary-search-latest.txt | |||
|---|---|---|---|---|
| HyperText Transfer Protocol | HyperText Transfer Protocol | |||
| Internet-Draft | Internet-Draft | |||
| Intended status: Standards Track , Ed. | Intended status: Standards Track , Ed. | |||
| Expires: February 18, 2027 Google LLC | Expires: March 11, 2027 Google LLC | |||
| August 17, 2026 | September 07, 2026 | |||
| The No-Vary-Search HTTP Caching Extension | The No-Vary-Search HTTP Caching Extension | |||
| draft-ietf-httpbis-no-vary-search-09 | draft-ietf-httpbis-no-vary-search-latest | |||
| Abstract | Abstract | |||
| This specification defines an extension to HTTP Caching, changing how | This specification defines an extension to HTTP Caching, changing how | |||
| the URI query component impacts caching. It introduces the ""No- | the URI query component impacts caching. It introduces the ""No- | |||
| Vary-Search"" response header field, which allows origin servers to | Vary-Search"" response header field, which allows origin servers to | |||
| signal to caches that certain parts of the query component do not | signal to caches that certain parts of the query component do not | |||
| semantically affect the served response and can be ignored for cache | semantically affect the served response and can be ignored for cache | |||
| matching purposes. | matching purposes. | |||
| skipping to change at page 2, line 10 ¶ | skipping to change at page 2, line 10 ¶ | |||
| 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 February 18, 2027. | This Internet-Draft will expire on March 11, 2027. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2026 IETF Trust and the persons identified as the | Copyright (c) 2026 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| skipping to change at page 10, line 16 ¶ | skipping to change at page 10, line 16 ¶ | |||
| The following illustrates how various inputs are parsed, in terms of | The following illustrates how various inputs are parsed, in terms of | |||
| their impact on the resulting no-vary params and vary params: | their impact on the resulting no-vary params and vary params: | |||
| +--------------------+----------------------------------------------+ | +--------------------+----------------------------------------------+ | |||
| | Input | Result | | | Input | Result | | |||
| +--------------------+----------------------------------------------+ | +--------------------+----------------------------------------------+ | |||
| | "No-Vary-Search: | no-vary params: (empty list) vary params: | | | "No-Vary-Search: | no-vary params: (empty list) vary params: | | |||
| | key-order" | *wildcard* vary on key order: false | | | key-order" | *wildcard* vary on key order: false | | |||
| | | | | | | | | |||
| | "No-Vary-Search: | no-vary params: (empty list) vary params: | | ||||
| | key-order=?1" | *wildcard* vary on key order: false | | ||||
| | | | | ||||
| | "No-Vary-Search: | no-vary params: << ""a"" >> vary params: | | | "No-Vary-Search: | no-vary params: << ""a"" >> vary params: | | |||
| | params=("a")" | *wildcard* | | | params=("a")" | *wildcard* | | |||
| | | | | | | | | |||
| | "No-Vary-Search: | no-vary params: *wildcard* vary params: << | | | "No-Vary-Search: | no-vary params: *wildcard* vary params: << | | |||
| | except=("x")" | ""x"" >> | | | except=("x")" | ""x"" >> | | |||
| | | | | | | | | |||
| | "No-Vary-Search: | no-vary params: (empty list) vary params: | | | "No-Vary-Search: | no-vary params: (empty list) vary params: | | |||
| | params=()" | *wildcard* | | | params=()" | *wildcard* | | |||
| | | | | | | | | |||
| | "No-Vary-Search: | no-vary params: *wildcard* vary params: | | | "No-Vary-Search: | no-vary params: *wildcard* vary params: | | |||
| skipping to change at page 17, line 18 ¶ | skipping to change at page 17, line 18 ¶ | |||
| +------------+----------------+-------------------------------------+ | +------------+----------------+-------------------------------------+ | |||
| | null | "?" | A null query is parsed the same as | | | null | "?" | A null query is parsed the same as | | |||
| | | | an empty string | | | | | an empty string | | |||
| | | | | | | | | | | |||
| | "?a=x" | "?%61=%78" | Parsing performs percent-decoding | | | "?a=x" | "?%61=%78" | Parsing performs percent-decoding | | |||
| | | | | | | | | | | |||
| | "?a=e" | "?a=%C3%A9" | Parsing performs percent-decoding | | | "?a=e" | "?a=%C3%A9" | Parsing performs percent-decoding | | |||
| | | | | | | | | | | |||
| | "?a=%f6" | "?a=%ef%bf%bd" | An invalid UTF-8 sequence and the | | | "?a=%f6" | "?a=%ef%bf%bd" | An invalid UTF-8 sequence and the | | |||
| | | | literal U+FFFD character are both | | | | | literal U+FFFD character are both | | |||
| | | | parsed as U+FFFD ( ) | | | | | parsed as U+FFFD (�) | | |||
| | | | | | | | | | | |||
| | "?a=x&&&&" | "?a=x" | Parsing splits on "&" and discards | | | "?a=x&&&&" | "?a=x" | Parsing splits on "&" and discards | | |||
| | | | empty strings | | | | | empty strings | | |||
| | | | | | | | | | | |||
| | "?a=" | "?a" | Both parse as having an empty | | | "?a=" | "?a" | Both parse as having an empty | | |||
| | | | string value for "a" | | | | | string value for "a" | | |||
| | | | | | | | | | | |||
| | "?a=%20" | "?a= &" | "%20" is parsed as U+0020 SPACE | | | "?a=%20" | "?a= &" | "%20" is parsed as U+0020 SPACE | | |||
| | | | | | | | | | | |||
| | "?a=+" | "?a= &" | "+" is parsed as U+0020 SPACE | | | "?a=+" | "?a= &" | "+" is parsed as U+0020 SPACE | | |||
| skipping to change at page 17, line 45 ¶ | skipping to change at page 17, line 45 ¶ | |||
| 7. Caching | 7. Caching | |||
| To reuse a stored response, Section 4 of [HTTP-CACHING] requires that | To reuse a stored response, Section 4 of [HTTP-CACHING] requires that | |||
| the presented target URI and that of the stored response match. If a | the presented target URI and that of the stored response match. If a | |||
| cache implements the "No-Vary-Search" extension, this matching | cache implements the "No-Vary-Search" extension, this matching | |||
| requirement is also satisfied if the URIs are equivalent modulo URL | requirement is also satisfied if the URIs are equivalent modulo URL | |||
| variation config (Section 6) given the stored response's "No-Vary- | variation config (Section 6) given the stored response's "No-Vary- | |||
| Search" header. | Search" header. | |||
| Note that while Section 5.2.3 of [HTTP-CACHING] defines cache | ||||
| extensions as "Cache-Control" directives, the ""No-Vary-Search"" | ||||
| response header field is defined as a standalone header. This design | ||||
| choice leverages Structured Fields ([STRUCTURED-FIELDS]) to provide a | ||||
| robust parsing model without overloading the existing, complex | ||||
| "Cache-Control" parsing logic. | ||||
| The ""No-Vary-Search"" response header field operates in addition to | ||||
| content negotiation and the "Vary" header field (see Section 4.1 of | ||||
| [HTTP-CACHING]). | ||||
| This document does not alter the requirements for cache invalidation | This document does not alter the requirements for cache invalidation | |||
| (see Section 4.4 of [HTTP-CACHING]). A cache MAY invalidate stored | (see Section 4.4 of [HTTP-CACHING]). A cache MAY invalidate stored | |||
| responses for URIs that are equivalent modulo URL variation config, | responses for URIs that are equivalent modulo URL variation config, | |||
| but is not required to do so. Therefore, state-changing requests | but is not required to do so. Therefore, state-changing requests | |||
| might not invalidate all conceptually equivalent responses. | might not invalidate all conceptually equivalent responses. | |||
| Note that the ""No-Vary-Search"" response header field operates in | ||||
| addition to content negotiation and the "Vary" header field (see | ||||
| Section 4.1 of [HTTP-CACHING]). | ||||
| Cache implementations MAY fail to reuse a stored response whose | Cache implementations MAY fail to reuse a stored response whose | |||
| target URI matches _only_ modulo URL variation config, if the cache | target URI matches _only_ modulo URL variation config, if the cache | |||
| has a stored response with a more recent "Date" header field which: | has a stored response with a more recent "Date" header field which: | |||
| o has a target URI which is equal to the presented target URI, | o has a target URI which is equal to the presented target URI, | |||
| excluding the query, and | excluding the query, and | |||
| o has a non-empty value for the ""No-Vary-Search"" response header | o has a non-empty value for the ""No-Vary-Search"" response header | |||
| field, and | field, and | |||
| End of changes. 7 change blocks. | ||||
| 9 lines changed or deleted | 19 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||