draft-ietf-httpbis-variants-06.txt   draft-ietf-httpbis-variants-latest.txt 
HTTP Working Group M. Nottingham HTTP Working Group M. Nottingham
Internet-Draft Fastly Internet-Draft Fastly
Updates: 7234 (if approved) November 2, 2019 Updates: 7234 (if approved) May 2, 2022
Intended status: Standards Track Intended status: Standards Track
Expires: May 5, 2020 Expires: November 3, 2022
HTTP Representation Variants HTTP Representation Variants
draft-ietf-httpbis-variants-06 draft-ietf-httpbis-variants-latest
Abstract Abstract
This specification introduces an alternative way to select a HTTP This specification introduces an alternative way to select a HTTP
response from a cache based upon its request headers, using the HTTP response from a cache based upon its request headers, using the HTTP
"Variants" and "Variant-Key" response header fields. Its aim is to "Variants" and "Variant-Key" response header fields. Its aim is to
make HTTP proactive content negotiation more cache-friendly. make HTTP proactive content negotiation more cache-friendly.
Note to Readers
_RFC EDITOR: please remove this section before publication_
Discussion of this draft takes place on the HTTP working group
mailing list (ietf-http-wg@w3.org), which is archived at
https://lists.w3.org/Archives/Public/ietf-http-wg/ [1].
Working Group information can be found at https://httpwg.github.io/
[2]; source code and issues list for this draft can be found at
https://github.com/httpwg/http-extensions/labels/variants [3].
There is a prototype implementation of the algorithms herein at
https://github.com/mnot/variants-toy [4].
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 May 5, 2020. This Internet-Draft will expire on November 3, 2022.
Copyright Notice Copyright Notice
Copyright (c) 2019 IETF Trust and the persons identified as the Copyright (c) 2022 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
carefully, as they describe your rights and restrictions with respect carefully, as they describe your rights and restrictions with respect
to this document. Code Components extracted from this document must to this document. Code Components extracted from this document must
include Simplified BSD License text as described in Section 4.e of include Simplified BSD License text as described in Section 4.e of
the Trust Legal Provisions and are provided without warranty as the Trust Legal Provisions and are provided without warranty as
described in the Simplified BSD License. described in the Simplified BSD License.
Table of Contents Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1. Notational Conventions . . . . . . . . . . . . . . . . . 5 1.1. Notational Conventions . . . . . . . . . . . . . . . . . 4
2. The "Variants" HTTP Header Field . . . . . . . . . . . . . . 5 2. The "Variants" HTTP Header Field . . . . . . . . . . . . . . 5
2.1. Relationship to Vary . . . . . . . . . . . . . . . . . . 7 2.1. Relationship to Vary . . . . . . . . . . . . . . . . . . 6
3. The "Variant-Key" HTTP Header Field . . . . . . . . . . . . . 7 3. The "Variant-Key" HTTP Header Field . . . . . . . . . . . . . 7
4. Cache Behaviour . . . . . . . . . . . . . . . . . . . . . . . 9 4. Cache Behaviour . . . . . . . . . . . . . . . . . . . . . . . 8
4.1. Compute Possible Keys . . . . . . . . . . . . . . . . . . 10 4.1. Compute Possible Keys . . . . . . . . . . . . . . . . . . 10
4.2. Check Vary . . . . . . . . . . . . . . . . . . . . . . . 11 4.2. Check Vary . . . . . . . . . . . . . . . . . . . . . . . 10
4.3. Example of Cache Behaviour . . . . . . . . . . . . . . . 11 4.3. Example of Cache Behaviour . . . . . . . . . . . . . . . 11
4.3.1. A Variant Missing From the Cache . . . . . . . . . . 12 4.3.1. A Variant Missing From the Cache . . . . . . . . . . 12
4.3.2. Variants That Don't Overlap the Client's Request . . 13 4.3.2. Variants That Don't Overlap the Client's Request . . 12
5. Origin Server Behaviour . . . . . . . . . . . . . . . . . . . 13 5. Origin Server Behaviour . . . . . . . . . . . . . . . . . . . 13
5.1. Examples . . . . . . . . . . . . . . . . . . . . . . . . 14 5.1. Examples . . . . . . . . . . . . . . . . . . . . . . . . 13
5.1.1. Single Variant . . . . . . . . . . . . . . . . . . . 14 5.1.1. Single Variant . . . . . . . . . . . . . . . . . . . 13
5.1.2. Multiple Variants . . . . . . . . . . . . . . . . . . 15 5.1.2. Multiple Variants . . . . . . . . . . . . . . . . . . 14
5.1.3. Partial Coverage . . . . . . . . . . . . . . . . . . 15 5.1.3. Partial Coverage . . . . . . . . . . . . . . . . . . 15
6. Defining Content Negotiation Using Variants . . . . . . . . . 16 6. Defining Content Negotiation Using Variants . . . . . . . . . 16
7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 16 7. Implementations . . . . . . . . . . . . . . . . . . . . . . . 16
8. Security Considerations . . . . . . . . . . . . . . . . . . . 17 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 16
9. References . . . . . . . . . . . . . . . . . . . . . . . . . 17 9. Security Considerations . . . . . . . . . . . . . . . . . . . 17
9.1. Normative References . . . . . . . . . . . . . . . . . . 17 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 17
9.2. Informative References . . . . . . . . . . . . . . . . . 18 10.1. Normative References . . . . . . . . . . . . . . . . . . 17
9.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 18 10.2. Informative References . . . . . . . . . . . . . . . . . 18
Appendix A. Variants for Existing Content Negotiation Mechanisms 19 Appendix A. Variants for Existing Content Negotiation Mechanisms 18
A.1. Accept . . . . . . . . . . . . . . . . . . . . . . . . . 19 A.1. Accept . . . . . . . . . . . . . . . . . . . . . . . . . 19
A.2. Accept-Encoding . . . . . . . . . . . . . . . . . . . . . 20 A.2. Accept-Encoding . . . . . . . . . . . . . . . . . . . . . 19
A.3. Accept-Language . . . . . . . . . . . . . . . . . . . . . 20 A.3. Accept-Language . . . . . . . . . . . . . . . . . . . . . 20
A.4. Cookie . . . . . . . . . . . . . . . . . . . . . . . . . 21 A.4. Cookie . . . . . . . . . . . . . . . . . . . . . . . . . 21
Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 22 Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 22
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 23 Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 22
1. Introduction 1. Introduction
HTTP proactive content negotiation ([RFC7231], Section 3.4.1) is HTTP proactive content negotiation ([RFC7231], Section 3.4.1) is
seeing renewed interest, both for existing request headers like seeing renewed interest, both for existing request headers like
Accept-Language and for newer ones (for example, see Accept-Language and for newer ones (for example, see
[I-D.ietf-httpbis-client-hints]). [I-D.ietf-httpbis-client-hints]).
Successfully reusing negotiated responses that have been stored in a Successfully reusing negotiated responses that have been stored in a
HTTP cache requires establishment of a secondary cache key HTTP cache requires establishment of a secondary cache key
skipping to change at page 4, line 28 skipping to change at page 4, line 13
When this specification is in use, the example above might become: When this specification is in use, the example above might become:
GET /foo HTTP/1.1 GET /foo HTTP/1.1
Host: www.example.com Host: www.example.com
Accept-Language: en;q=0.5, fr;q=1.0 Accept-Language: en;q=0.5, fr;q=1.0
HTTP/1.1 200 OK HTTP/1.1 200 OK
Content-Type: text/html Content-Type: text/html
Content-Language: en Content-Language: en
Vary: Accept-Language Vary: Accept-Language
Variants: Accept-Language;de;en;jp Variants: accept-language;de;en;jp
Variant-Key: en Variant-Key: en
Transfer-Encoding: chunked Transfer-Encoding: chunked
[English content] [English content]
Proactive content negotiation mechanisms that wish to be used with Proactive content negotiation mechanisms that wish to be used with
Variants need to define how to do so explicitly; see Section 6. As a Variants need to define how to do so explicitly; see Section 6. As a
result, it is best suited for negotiation over request headers that result, it is best suited for negotiation over request headers that
are well-understood. are well-understood.
skipping to change at page 5, line 9 skipping to change at page 4, line 38
Variants can be seen as a simpler version of the Alternates header Variants can be seen as a simpler version of the Alternates header
field introduced by [RFC2295]; unlike that mechanism, Variants does field introduced by [RFC2295]; unlike that mechanism, Variants does
not require specification of each combination of attributes, and does not require specification of each combination of attributes, and does
not assume that each combination has a unique URL. not assume that each combination has a unique URL.
1.1. Notational Conventions 1.1. Notational Conventions
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
14 [RFC2119] [RFC8174] when, and only when, they appear in all BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
capitals, as shown here. capitals, as shown here.
This specification uses the Augmented Backus-Naur Form (ABNF) This specification uses the Augmented Backus-Naur Form (ABNF)
notation of [RFC5234] but relies on Structured Headers from notation of [RFC5234] but relies on Structured Headers from
[I-D.ietf-httpbis-header-structure] for parsing. [I-D.ietf-httpbis-header-structure] for parsing.
Additionally, it uses the "field-name" rule from [RFC7230], "type", Additionally, it uses the "field-name" rule from [RFC7230], "type",
"subtype", "content-coding" and "language-range" from [RFC7231], and "subtype", "content-coding" and "language-range" from [RFC7231], and
"cookie-name" from [RFC6265]. "cookie-name" from [RFC6265].
skipping to change at page 5, line 40 skipping to change at page 5, line 24
[I-D.ietf-httpbis-header-structure]). Its ABNF is: [I-D.ietf-httpbis-header-structure]). Its ABNF is:
Variants = sh-dict Variants = sh-dict
Each member-name represents the field-name of a request header that Each member-name represents the field-name of a request header that
is part of the secondary cache key; each member-value is an inner- is part of the secondary cache key; each member-value is an inner-
list of strings or tokens that convey representations of potential list of strings or tokens that convey representations of potential
values for that header field, hereafter referred to as "available- values for that header field, hereafter referred to as "available-
values". values".
If Structured Header parsing fails or a member's value does have the If Structured Header parsing fails or a member's value does not have
structure outlined above, the client MUST treat the representation as the structure outlined above, the client MUST treat the
having no Variants header field. representation as having no Variants header field.
Note that an available-value that is a token is interpreted as a Note that an available-value that is a token is interpreted as a
string containing the same characters, and vice versa. string containing the same characters, and vice versa.
So, given this example header field: So, given this example header field:
Variants: Accept-Encoding=(gzip) Variants: accept-encoding=(gzip)
a recipient can infer that the only content-coding available for that a recipient can infer that the only content-coding available for that
resource is "gzip" (along with the "identity" non-encoding; see resource is "gzip" (along with the "identity" non-encoding; see
Appendix A.2). Appendix A.2).
Given: Given:
Variants: accept-encoding=() Variants: accept-encoding=()
a recipient can infer that no content-codings (beyond identity) are a recipient can infer that no content-codings (beyond identity) are
supported. Note that as always, field-name is case-insensitive. supported. Note that as always, field-name is case-insensitive.
A more complex example: A more complex example:
Variants: Accept-Encoding=(gzip br), Accept-Language=(en fr) Variants: accept-encoding=(gzip br), accept-language=(en fr)
Here, recipients can infer that two content-codings in addition to Here, recipients can infer that two content-codings in addition to
"identity" are available, as well as two content languages. Note "identity" are available, as well as two content languages. Note
that, as with all Structured Header dictionaries, they might occur in that, as with all Structured Header dictionaries, they might occur in
the same header field or separately, like this: the same header field or separately, like this:
Variants: Accept-Encoding=(gzip brotli) Variants: accept-encoding=(gzip brotli)
Variants: Accept-Language=(en fr) Variants: accept-language=(en fr)
The ordering of available-values is significant, as it might be used The ordering of available-values is significant, as it might be used
by the header's algorithm for selecting a response (in this example, by the header's algorithm for selecting a response (in this example,
the first language is the default; see Appendix A.3). the first language is the default; see Appendix A.3).
The ordering of the request header fields themselves indicates The ordering of the request header fields themselves indicates
descending application of preferences; in the example above, a cache descending application of preferences; in the example above, a cache
that has all of the possible permutations stored will honour the that has all of the possible permutations stored will honour the
client's preferences for Accept-Encoding before honouring Accept- client's preferences for Accept-Encoding before honouring Accept-
Language. Language.
skipping to change at page 8, line 11 skipping to change at page 7, line 42
the Variants header field; they can be interpreted by the algorithm the Variants header field; they can be interpreted by the algorithm
specific to processing that field. For example, Accept-Encoding specific to processing that field. For example, Accept-Encoding
defines an implicit "identity" available-value (Appendix A.2). defines an implicit "identity" available-value (Appendix A.2).
Each inner-list member is treated as identifying an available-value Each inner-list member is treated as identifying an available-value
for the corresponding variant-axis' field-name. Any list-member that for the corresponding variant-axis' field-name. Any list-member that
is a token is interpreted as a string containing the same characters. is a token is interpreted as a string containing the same characters.
For example: For example:
Variants: Accept-Encoding=(gzip br), Accept-Language=(en fr) Variants: accept-encoding=(gzip br), accept-language=(en fr)
Variant-Key: (gzip fr) Variant-Key: (gzip fr)
This header pair indicates that the representation has a "gzip" This header pair indicates that the representation has a "gzip"
content-coding and "fr" content-language. content-coding and "fr" content-language.
If the response can be used to satisfy more than one request, they If the response can be used to satisfy more than one request, they
can be listed in additional members. For example: can be listed in additional members. For example:
Variants: Accept-Encoding=(gzip br), Accept-Language=(en fr) Variants: accept-encoding=(gzip br), accept-language=(en fr)
Variant-Key: (gzip fr), ("identity" fr) Variant-Key: (gzip fr), ("identity" fr)
indicates that this response can be used for requests whose Accept- indicates that this response can be used for requests whose Accept-
Encoding algorithm selects "gzip" or "identity", as long as the Encoding algorithm selects "gzip" or "identity", as long as the
Accept-Language algorithm selects "fr" - perhaps because there is no Accept-Language algorithm selects "fr" - perhaps because there is no
gzip-compressed French representation. gzip-compressed French representation.
When more than one Variant-Key value is in a response, the first one When more than one Variant-Key value is in a response, the first one
present MUST correspond to the request that caused that response to present MUST correspond to the request that caused that response to
be generated. For example: be generated. For example:
Variants: Accept-Encoding=(gzip br), Accept-Language=(en fr) Variants: accept-encoding=(gzip br), accept-language=(en fr)
Variant-Key: (gzip fr), (identity fr), (br fr oops) Variant-Key: (gzip fr), (identity fr), (br fr oops)
is treated as if the Variant-Key header were completely absent, which is treated as if the Variant-Key header were completely absent, which
will tend to disable caching for the representation that contains it. will tend to disable caching for the representation that contains it.
Note that in Note that in
Variant-Key: (gzip fr) Variant-Key: (gzip fr)
Variant-Key: ("gzip " fr) Variant-Key: ("gzip " fr)
skipping to change at page 16, line 4 skipping to change at page 15, line 33
5.1.3. Partial Coverage 5.1.3. Partial Coverage
Now, consider the previous example, but where only one of the Vary'd Now, consider the previous example, but where only one of the Vary'd
axes (encoding) is listed in Variants: axes (encoding) is listed in Variants:
GET /bar HTTP/1.1 GET /bar HTTP/1.1
Host: www.example.net Host: www.example.net
Accept-Language: en;q=1.0, fr;q=0.5 Accept-Language: en;q=1.0, fr;q=0.5
Accept-Encoding: gzip, br Accept-Encoding: gzip, br
HTTP/1.1 200 OK HTTP/1.1 200 OK
Content-Type: image/gif Content-Type: image/gif
Content-Language: en Content-Language: en
Content-Encoding: br Content-Encoding: br
Variants: Accept-Encoding=(br gzip) Variants: Accept-Encoding=(br gzip)
Variant-Key: (br) Variant-Key: (br)
Vary: Accept-Language, Accept-Encoding Vary: Accept-Language, Accept-Encoding
Transfer-Encoding: chunked Transfer-Encoding: chunked
Here, the cache will need to calculate a secondary cache key as per Here, the cache will need to calculate a secondary cache key as per
[RFC7234], Section 4.1 - but considering only Accept-Language to be [RFC7234], Section 4.1 - but considering only Accept-Language to be
in its field-value - and then continue processing Variants for the in its field-value - and then continue processing Variants for the
set of stored responses that the algorithm described there selects. set of stored responses that the algorithm described there selects.
6. Defining Content Negotiation Using Variants 6. Defining Content Negotiation Using Variants
To be usable with Variants, proactive content negotiation mechanisms To be usable with Variants, proactive content negotiation mechanisms
need to be specified to take advantage of it. Specifically, they: need to be specified to take advantage of it. Specifically, they:
o MUST define a request header field that advertises the clients o MUST define a request header field that advertises the clients
preferences or capabilities, whose field-name SHOULD begin with preferences or capabilities. Often, its field-name will begin
"Accept-". with "Accept-", but this is not required.
o MUST define the syntax of an available-value that will occur in o MUST define the syntax of an available-value that will occur in
Variants and Variant-Key. Variants and Variant-Key.
o MUST define an algorithm for selecting a result. It MUST return a o MUST define an algorithm for selecting a result. It MUST return a
list of available-values that are suitable for the request, in list of available-values that are suitable for the request, in
order of preference, given the value of the request header order of preference, given the value of the request header
nominated above (or null if the request header is absent) and an nominated above (or null if the request header is absent) and an
available-values list from the Variants header. If the result is available-values list from the Variants header. If the result is
an empty list, it implies that the cache cannot satisfy the an empty list, it implies that the cache cannot satisfy the
request. request.
Appendix A fulfils these requirements for some existing proactive Appendix A fulfils these requirements for some existing proactive
content negotiation mechanisms in HTTP. content negotiation mechanisms in HTTP.
7. IANA Considerations 7. Implementations
This section is to be removed before publishing as an RFC.
There is a prototype implementation of the algorithms in this
document at <https://github.com/mnot/variants-toy>.
8. IANA Considerations
This specification registers the following entry in the Permanent This specification registers the following entry in the Permanent
Message Header Field Names registry established by [RFC3864]: Message Header Field Names registry established by [RFC3864]:
o Header field name: Variants o Header field name: Variants
o Applicable protocol: http o Applicable protocol: http
o Status: standard o Status: standard
o Author/Change Controller: IETF o Author/Change Controller: IETF
o Specification document(s): [this document] o Specification document(s): [this document]
o Related information: o Related information:
This specification registers the following entry in the Permanent This specification registers the following entry in the Permanent
Message Header Field Names registry established by [RFC3864]: Message Header Field Names registry established by [RFC3864]:
o Header field name: Variant-Key o Header field name: Variant-Key
skipping to change at page 17, line 25 skipping to change at page 17, line 20
o Applicable protocol: http o Applicable protocol: http
o Status: standard o Status: standard
o Author/Change Controller: IETF o Author/Change Controller: IETF
o Specification document(s): [this document] o Specification document(s): [this document]
o Related information: o Related information:
8. Security Considerations 9. Security Considerations
If the number or advertised characteristics of the representations If the number or advertised characteristics of the representations
available for a resource are considered sensitive, the Variants available for a resource are considered sensitive, the Variants
header by its nature will leak them. header by its nature will leak them.
Note that the Variants header is not a commitment to make Note that the Variants header is not a commitment to make
representations of a certain nature available; the runtime behaviour representations of a certain nature available; the runtime behaviour
of the server always overrides hints like Variants. of the server always overrides hints like Variants.
9. References 10. References
9.1. Normative References 10.1. Normative References
[I-D.ietf-httpbis-header-structure] [I-D.ietf-httpbis-header-structure]
Nottingham, M. and P. Kamp, "Structured Headers for HTTP", Nottingham, M. and P. Kamp, "Structured Field Values for
draft-ietf-httpbis-header-structure-13 (work in progress), HTTP", draft-ietf-httpbis-header-structure-19 (work in
August 2019. progress), June 2020.
[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>.
[RFC4647] Phillips, A. and M. Davis, "Matching of Language Tags", [RFC4647] Phillips, A., Ed. and M. Davis, Ed., "Matching of Language
BCP 47, RFC 4647, DOI 10.17487/RFC4647, September 2006, Tags", BCP 47, RFC 4647, DOI 10.17487/RFC4647, September
<https://www.rfc-editor.org/info/rfc4647>. 2006, <https://www.rfc-editor.org/info/rfc4647>.
[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>.
[RFC6265] Barth, A., "HTTP State Management Mechanism", RFC 6265, [RFC6265] Barth, A., "HTTP State Management Mechanism", RFC 6265,
DOI 10.17487/RFC6265, April 2011, DOI 10.17487/RFC6265, April 2011,
<https://www.rfc-editor.org/info/rfc6265>. <https://www.rfc-editor.org/info/rfc6265>.
skipping to change at page 18, line 33 skipping to change at page 18, line 28
[RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, [RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke,
Ed., "Hypertext Transfer Protocol (HTTP/1.1): Caching", Ed., "Hypertext Transfer Protocol (HTTP/1.1): Caching",
RFC 7234, DOI 10.17487/RFC7234, June 2014, RFC 7234, DOI 10.17487/RFC7234, June 2014,
<https://www.rfc-editor.org/info/rfc7234>. <https://www.rfc-editor.org/info/rfc7234>.
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
May 2017, <https://www.rfc-editor.org/info/rfc8174>. May 2017, <https://www.rfc-editor.org/info/rfc8174>.
9.2. Informative References 10.2. Informative References
[I-D.ietf-httpbis-client-hints] [I-D.ietf-httpbis-client-hints]
Grigorik, I., "HTTP Client Hints", draft-ietf-httpbis- Grigorik, I. and Y. Weiss, "HTTP Client Hints", draft-
client-hints-07 (work in progress), March 2019. ietf-httpbis-client-hints-15 (work in progress), July
2020.
[RFC2295] Holtman, K. and A. Mutz, "Transparent Content Negotiation [RFC2295] Holtman, K. and A. Mutz, "Transparent Content Negotiation
in HTTP", RFC 2295, DOI 10.17487/RFC2295, March 1998, in HTTP", RFC 2295, DOI 10.17487/RFC2295, March 1998,
<https://www.rfc-editor.org/info/rfc2295>. <https://www.rfc-editor.org/info/rfc2295>.
[RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration
Procedures for Message Header Fields", BCP 90, RFC 3864, Procedures for Message Header Fields", BCP 90, RFC 3864,
DOI 10.17487/RFC3864, September 2004, DOI 10.17487/RFC3864, September 2004,
<https://www.rfc-editor.org/info/rfc3864>. <https://www.rfc-editor.org/info/rfc3864>.
9.3. URIs
[1] https://lists.w3.org/Archives/Public/ietf-http-wg/
[2] https://httpwg.github.io/
[3] https://github.com/httpwg/http-extensions/labels/variants
[4] https://github.com/mnot/variants-toy
Appendix A. Variants for Existing Content Negotiation Mechanisms Appendix A. Variants for Existing Content Negotiation Mechanisms
This appendix defines the required information to use existing This appendix defines the required information to use existing
proactive content negotiation mechanisms (as defined in [RFC7231], proactive content negotiation mechanisms (as defined in [RFC7231],
Section 5.3) with the Variants header field. Section 5.3) with the Variants header field.
A.1. Accept A.1. Accept
This section defines variant handling for the Accept request header This section defines variant handling for the Accept request header
(section 5.3.2 of [RFC7231]). (section 5.3.2 of [RFC7231]).
skipping to change at page 23, line 6 skipping to change at page 23, line 4
Transparent Content Negotiation [RFC2295]. Thanks to its authors for Transparent Content Negotiation [RFC2295]. Thanks to its authors for
their inspiration. their inspiration.
It is also a generalisation of a Fastly VCL feature designed by It is also a generalisation of a Fastly VCL feature designed by
Rogier 'DocWilco' Mulhuijzen. Rogier 'DocWilco' Mulhuijzen.
Thanks to Hooman Beheshti, Ilya Grigorik, Leif Hedstrom, and Jeffrey Thanks to Hooman Beheshti, Ilya Grigorik, Leif Hedstrom, and Jeffrey
Yasskin for their review and input. Yasskin for their review and input.
Author's Address Author's Address
Mark Nottingham Mark Nottingham
Fastly Fastly
Prahran
Australia
Email: mnot@mnot.net Email: mnot@mnot.net
URI: https://www.mnot.net/ URI: https://www.mnot.net/
 End of changes. 39 change blocks. 
78 lines changed or deleted 64 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/