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 (&#65533;) |
| | | | | | | |
| "?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/