| draft-ietf-httpbis-semantics-11.txt | draft-ietf-httpbis-semantics-12.txt | |||
|---|---|---|---|---|
| HTTP Working Group R. Fielding, Ed. | HTTP Working Group R. Fielding, Ed. | |||
| Internet-Draft Adobe | Internet-Draft Adobe | |||
| Obsoletes: 2818, 7230, 7231, 7232, 7233, 7235, M. Nottingham, Ed. | Obsoletes: 2818, 7230, 7231, 7232, 7233, 7235, M. Nottingham, Ed. | |||
| 7538, 7615, 7694 (if approved) Fastly | 7538, 7615, 7694 (if approved) Fastly | |||
| Intended status: Standards Track J. F. Reschke, Ed. | Intended status: Standards Track J. Reschke, Ed. | |||
| Expires: February 28, 2021 greenbytes | Expires: April 5, 2021 greenbytes | |||
| August 27, 2020 | October 2, 2020 | |||
| HTTP Semantics | HTTP Semantics | |||
| draft-ietf-httpbis-semantics-11 | draft-ietf-httpbis-semantics-12 | |||
| 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 the semantics of HTTP: its | systems. This document defines the semantics of HTTP: its | |||
| architecture, terminology, the "http" and "https" Uniform Resource | architecture, terminology, the "http" and "https" Uniform Resource | |||
| Identifier (URI) schemes, core request methods, request header | Identifier (URI) schemes, core request methods, request header | |||
| fields, response status codes, response header fields, and content | fields, response status codes, response header fields, and content | |||
| negotiation. | negotiation. | |||
| skipping to change at page 1, line 39 ¶ | skipping to change at page 1, line 39 ¶ | |||
| 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.12. | The changes in this draft are summarized in Appendix C.13. | |||
| 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 February 28, 2021. | This Internet-Draft will expire on April 5, 2021. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2020 IETF Trust and the persons identified as the | Copyright (c) 2020 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 40 ¶ | skipping to change at page 2, line 40 ¶ | |||
| modifications of such material outside the IETF Standards Process. | modifications of such material outside the IETF Standards Process. | |||
| Without obtaining an adequate license from the person(s) controlling | Without obtaining an adequate license from the person(s) controlling | |||
| the copyright in such materials, this document may not be modified | the copyright in such materials, this document may not be modified | |||
| 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 . . . . . . . . . . . . . . . . . . . . . . . . 8 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 1.1. Purpose . . . . . . . . . . . . . . . . . . . . . . . . . 8 | 1.1. Purpose . . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 1.2. Evolution . . . . . . . . . . . . . . . . . . . . . . . . 9 | 1.2. Evolution . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 1.3. Semantics . . . . . . . . . . . . . . . . . . . . . . . . 9 | 1.3. Semantics . . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 1.4. Obsoletes . . . . . . . . . . . . . . . . . . . . . . . . 10 | 1.4. Obsoletes . . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 1.5. Requirements Notation . . . . . . . . . . . . . . . . . . 11 | 2. Conformance . . . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 1.6. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 11 | 2.1. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 1.6.1. Whitespace . . . . . . . . . . . . . . . . . . . . . 12 | 2.2. Requirements Notation . . . . . . . . . . . . . . . . . . 12 | |||
| 2. Architecture . . . . . . . . . . . . . . . . . . . . . . . . 12 | 2.3. Length Requirements . . . . . . . . . . . . . . . . . . . 13 | |||
| 2.1. Client/Server Messaging . . . . . . . . . . . . . . . . . 13 | 2.4. Error Handling . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 2.2. Intermediaries . . . . . . . . . . . . . . . . . . . . . 15 | 3. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 2.3. Caches . . . . . . . . . . . . . . . . . . . . . . . . . 17 | 3.1. Resources . . . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| 2.4. Uniform Resource Identifiers . . . . . . . . . . . . . . 18 | 3.2. Connections . . . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 2.5. Resources . . . . . . . . . . . . . . . . . . . . . . . . 19 | 3.3. Messages . . . . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 2.5.1. http URI Scheme . . . . . . . . . . . . . . . . . . . 19 | 3.4. User Agent . . . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 2.5.2. https URI Scheme . . . . . . . . . . . . . . . . . . 20 | 3.5. Origin Server . . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 2.5.3. http and https URI Normalization and Comparison . . . 21 | 3.6. Example Request and Response . . . . . . . . . . . . . . 16 | |||
| 2.5.4. Deprecated userinfo . . . . . . . . . . . . . . . . . 21 | 3.7. Intermediaries . . . . . . . . . . . . . . . . . . . . . 17 | |||
| 2.5.5. Fragment Identifiers on http(s) URI References . . . 22 | 3.8. Caches . . . . . . . . . . . . . . . . . . . . . . . . . 19 | |||
| 3. Conformance . . . . . . . . . . . . . . . . . . . . . . . . . 22 | 4. Identifiers . . . . . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 3.1. Implementation Diversity . . . . . . . . . . . . . . . . 22 | 4.1. URI References . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 3.2. Role-based Requirements . . . . . . . . . . . . . . . . . 23 | 4.2. URI Schemes . . . . . . . . . . . . . . . . . . . . . . . 21 | |||
| 3.3. Parsing Elements . . . . . . . . . . . . . . . . . . . . 24 | 4.2.1. http URI Scheme . . . . . . . . . . . . . . . . . . . 22 | |||
| 3.4. Error Handling . . . . . . . . . . . . . . . . . . . . . 24 | 4.2.2. https URI Scheme . . . . . . . . . . . . . . . . . . 22 | |||
| 4. Extending and Versioning HTTP . . . . . . . . . . . . . . . . 25 | 4.2.3. http(s) Normalization and Comparison . . . . . . . . 23 | |||
| 4.1. Extending HTTP . . . . . . . . . . . . . . . . . . . . . 25 | 4.2.4. http(s) Deprecated userinfo . . . . . . . . . . . . . 24 | |||
| 4.2. Protocol Versioning . . . . . . . . . . . . . . . . . . . 26 | 4.2.5. http(s) References with Fragment Identifiers . . . . 24 | |||
| 5. Header and Trailer Fields . . . . . . . . . . . . . . . . . . 27 | 4.3. Authoritative Access . . . . . . . . . . . . . . . . . . 24 | |||
| 5.1. Field Ordering and Combination . . . . . . . . . . . . . 28 | 4.3.1. URI Origin . . . . . . . . . . . . . . . . . . . . . 24 | |||
| 5.2. Field Limits . . . . . . . . . . . . . . . . . . . . . . 29 | 4.3.2. http origins . . . . . . . . . . . . . . . . . . . . 25 | |||
| 5.3. Field Names . . . . . . . . . . . . . . . . . . . . . . . 30 | 4.3.3. https origins . . . . . . . . . . . . . . . . . . . . 26 | |||
| 5.3.1. Field Extensibility . . . . . . . . . . . . . . . . . 30 | 4.3.4. https certificate verification . . . . . . . . . . . 27 | |||
| 5.3.2. Field Name Registry . . . . . . . . . . . . . . . . . 31 | 5. Message Abstraction . . . . . . . . . . . . . . . . . . . . . 28 | |||
| 5.4. Field Values . . . . . . . . . . . . . . . . . . . . . . 32 | 5.1. Protocol Version . . . . . . . . . . . . . . . . . . . . 28 | |||
| 5.4.1. Common Field Value Components . . . . . . . . . . . . 34 | 5.2. Framing . . . . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 5.5. ABNF List Extension: #rule . . . . . . . . . . . . . . . 37 | 5.3. Control Data . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 5.5.1. Sender Requirements . . . . . . . . . . . . . . . . . 38 | 5.3.1. Request . . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 5.5.2. Recipient Requirements . . . . . . . . . . . . . . . 38 | 5.3.2. Response . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 5.6. Trailer Fields . . . . . . . . . . . . . . . . . . . . . 39 | 5.4. Header Fields . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 5.6.1. Purpose . . . . . . . . . . . . . . . . . . . . . . . 39 | 5.4.1. Field Ordering and Combination . . . . . . . . . . . 32 | |||
| 5.6.2. Limitations . . . . . . . . . . . . . . . . . . . . . 39 | 5.4.2. Field Limits . . . . . . . . . . . . . . . . . . . . 33 | |||
| 5.6.3. Processing . . . . . . . . . . . . . . . . . . . . . 40 | 5.4.3. Field Names . . . . . . . . . . . . . . . . . . . . . 33 | |||
| 5.6.4. Trailer . . . . . . . . . . . . . . . . . . . . . . . 41 | 5.4.4. Field Values . . . . . . . . . . . . . . . . . . . . 33 | |||
| 5.6.5. TE . . . . . . . . . . . . . . . . . . . . . . . . . 41 | 5.5. Payload . . . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 5.7. Considerations for New HTTP Fields . . . . . . . . . . . 41 | 5.5.1. Purpose . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 5.8. Fields Defined In This Document . . . . . . . . . . . . . 43 | 5.5.2. Identification . . . . . . . . . . . . . . . . . . . 36 | |||
| 6. Message Routing . . . . . . . . . . . . . . . . . . . . . . . 44 | 5.5.3. Payload Metadata . . . . . . . . . . . . . . . . . . 37 | |||
| 6.1. Identifying a Target Resource . . . . . . . . . . . . . . 44 | 5.5.4. Payload Body . . . . . . . . . . . . . . . . . . . . 37 | |||
| 6.2. Determining Origin . . . . . . . . . . . . . . . . . . . 45 | 5.6. Trailer Fields . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 6.3. Routing Inbound . . . . . . . . . . . . . . . . . . . . . 45 | 5.6.1. Purpose . . . . . . . . . . . . . . . . . . . . . . . 38 | |||
| 6.3.1. To a Cache . . . . . . . . . . . . . . . . . . . . . 46 | 5.6.2. Limitations . . . . . . . . . . . . . . . . . . . . . 38 | |||
| 6.3.2. To a Proxy . . . . . . . . . . . . . . . . . . . . . 46 | 5.6.3. Processing . . . . . . . . . . . . . . . . . . . . . 39 | |||
| 6.3.3. To the Origin . . . . . . . . . . . . . . . . . . . . 46 | 5.7. Common Rules for Defining Field Values . . . . . . . . . 39 | |||
| 6.4. Reconstructing the Target URI . . . . . . . . . . . . . . 49 | 5.7.1. Lists (#rule ABNF Extension) . . . . . . . . . . . . 39 | |||
| 6.5. Host . . . . . . . . . . . . . . . . . . . . . . . . . . 50 | 5.7.2. Tokens . . . . . . . . . . . . . . . . . . . . . . . 41 | |||
| 6.6. Message Forwarding . . . . . . . . . . . . . . . . . . . 50 | 5.7.3. Whitespace . . . . . . . . . . . . . . . . . . . . . 41 | |||
| 6.6.1. Via . . . . . . . . . . . . . . . . . . . . . . . . . 51 | 5.7.4. Quoted Strings . . . . . . . . . . . . . . . . . . . 42 | |||
| 6.6.2. Transformations . . . . . . . . . . . . . . . . . . . 53 | 5.7.5. Comments . . . . . . . . . . . . . . . . . . . . . . 42 | |||
| 6.7. Upgrading HTTP . . . . . . . . . . . . . . . . . . . . . 54 | 5.7.6. Parameters . . . . . . . . . . . . . . . . . . . . . 43 | |||
| 6.7.1. Upgrade Protocol Names . . . . . . . . . . . . . . . 56 | 5.7.7. Date/Time Formats . . . . . . . . . . . . . . . . . . 43 | |||
| 6.7.2. Upgrade Token Registry . . . . . . . . . . . . . . . 56 | 6. Routing . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 | |||
| 6.1. Target Resource . . . . . . . . . . . . . . . . . . . . . 45 | ||||
| 6.8. Connection-Specific Fields . . . . . . . . . . . . . . . 57 | 6.1.1. Request Target . . . . . . . . . . . . . . . . . . . 45 | |||
| 7. Representations . . . . . . . . . . . . . . . . . . . . . . . 59 | 6.1.2. Host . . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
| 7.1. Representation Data . . . . . . . . . . . . . . . . . . . 59 | 6.1.3. Reconstructing the Target URI . . . . . . . . . . . . 47 | |||
| 7.1.1. Media Type . . . . . . . . . . . . . . . . . . . . . 60 | 6.2. Routing Inbound . . . . . . . . . . . . . . . . . . . . . 47 | |||
| 7.1.2. Content Codings . . . . . . . . . . . . . . . . . . . 62 | 6.2.1. To a Cache . . . . . . . . . . . . . . . . . . . . . 47 | |||
| 7.1.3. Language Tags . . . . . . . . . . . . . . . . . . . . 64 | 6.2.2. To a Proxy . . . . . . . . . . . . . . . . . . . . . 48 | |||
| 7.1.4. Range Units . . . . . . . . . . . . . . . . . . . . . 64 | 6.2.3. To the Origin . . . . . . . . . . . . . . . . . . . . 48 | |||
| 7.2. Representation Metadata . . . . . . . . . . . . . . . . . 68 | 6.3. Response Correlation . . . . . . . . . . . . . . . . . . 48 | |||
| 7.2.1. Content-Type . . . . . . . . . . . . . . . . . . . . 69 | 6.4. Message Forwarding . . . . . . . . . . . . . . . . . . . 48 | |||
| 7.2.2. Content-Encoding . . . . . . . . . . . . . . . . . . 70 | 6.4.1. Connection . . . . . . . . . . . . . . . . . . . . . 49 | |||
| 7.2.3. Content-Language . . . . . . . . . . . . . . . . . . 71 | 6.4.2. Max-Forwards . . . . . . . . . . . . . . . . . . . . 50 | |||
| 7.2.4. Content-Length . . . . . . . . . . . . . . . . . . . 72 | 6.4.3. Via . . . . . . . . . . . . . . . . . . . . . . . . . 51 | |||
| 7.2.5. Content-Location . . . . . . . . . . . . . . . . . . 73 | 6.5. Transformations . . . . . . . . . . . . . . . . . . . . . 53 | |||
| 7.3. Payload . . . . . . . . . . . . . . . . . . . . . . . . . 75 | 6.6. Upgrade . . . . . . . . . . . . . . . . . . . . . . . . . 54 | |||
| 7.3.1. Purpose . . . . . . . . . . . . . . . . . . . . . . . 75 | 7. Representations . . . . . . . . . . . . . . . . . . . . . . . 56 | |||
| 7.3.2. Identification . . . . . . . . . . . . . . . . . . . 76 | 7.1. Selected Representation . . . . . . . . . . . . . . . . . 57 | |||
| 7.3.3. Payload Body . . . . . . . . . . . . . . . . . . . . 77 | 7.2. Data . . . . . . . . . . . . . . . . . . . . . . . . . . 57 | |||
| 7.3.4. Content-Range . . . . . . . . . . . . . . . . . . . . 78 | 7.3. Metadata . . . . . . . . . . . . . . . . . . . . . . . . 57 | |||
| 7.3.5. Media Type multipart/byteranges . . . . . . . . . . . 79 | 7.4. Content-Type . . . . . . . . . . . . . . . . . . . . . . 58 | |||
| 7.4. Content Negotiation . . . . . . . . . . . . . . . . . . . 81 | 7.4.1. Media Type . . . . . . . . . . . . . . . . . . . . . 59 | |||
| 7.4.1. Proactive Negotiation . . . . . . . . . . . . . . . . 82 | 7.4.2. Charset . . . . . . . . . . . . . . . . . . . . . . . 59 | |||
| 7.4.2. Reactive Negotiation . . . . . . . . . . . . . . . . 83 | 7.4.3. Canonicalization and Text Defaults . . . . . . . . . 60 | |||
| 7.4.3. Request Payload Negotiation . . . . . . . . . . . . . 84 | 7.4.4. Multipart Types . . . . . . . . . . . . . . . . . . . 61 | |||
| 7.4.4. Quality Values . . . . . . . . . . . . . . . . . . . 84 | 7.5. Content-Encoding . . . . . . . . . . . . . . . . . . . . 61 | |||
| 8. Request Methods . . . . . . . . . . . . . . . . . . . . . . . 85 | 7.5.1. Content Codings . . . . . . . . . . . . . . . . . . . 62 | |||
| 8.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . 85 | 7.6. Content-Language . . . . . . . . . . . . . . . . . . . . 63 | |||
| 8.2. Common Method Properties . . . . . . . . . . . . . . . . 86 | 7.6.1. Language Tags . . . . . . . . . . . . . . . . . . . . 64 | |||
| 8.2.1. Safe Methods . . . . . . . . . . . . . . . . . . . . 87 | 7.7. Content-Length . . . . . . . . . . . . . . . . . . . . . 65 | |||
| 8.2.2. Idempotent Methods . . . . . . . . . . . . . . . . . 88 | 7.8. Content-Location . . . . . . . . . . . . . . . . . . . . 66 | |||
| 8.2.3. Methods and Caching . . . . . . . . . . . . . . . . . 89 | 7.9. Validators . . . . . . . . . . . . . . . . . . . . . . . 68 | |||
| 8.3. Method Definitions . . . . . . . . . . . . . . . . . . . 89 | 7.9.1. Weak versus Strong . . . . . . . . . . . . . . . . . 69 | |||
| 8.3.1. GET . . . . . . . . . . . . . . . . . . . . . . . . . 89 | 7.9.2. Last-Modified . . . . . . . . . . . . . . . . . . . . 71 | |||
| 8.3.2. HEAD . . . . . . . . . . . . . . . . . . . . . . . . 90 | 7.9.3. ETag . . . . . . . . . . . . . . . . . . . . . . . . 73 | |||
| 8.3.3. POST . . . . . . . . . . . . . . . . . . . . . . . . 91 | 7.9.4. When to Use Entity-Tags and Last-Modified Dates . . . 76 | |||
| 8.3.4. PUT . . . . . . . . . . . . . . . . . . . . . . . . . 92 | 8. Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 | |||
| 8.3.5. DELETE . . . . . . . . . . . . . . . . . . . . . . . 95 | 8.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . 77 | |||
| 8.3.6. CONNECT . . . . . . . . . . . . . . . . . . . . . . . 96 | 8.2. Common Method Properties . . . . . . . . . . . . . . . . 78 | |||
| 8.3.7. OPTIONS . . . . . . . . . . . . . . . . . . . . . . . 97 | 8.2.1. Safe Methods . . . . . . . . . . . . . . . . . . . . 79 | |||
| 8.3.8. TRACE . . . . . . . . . . . . . . . . . . . . . . . . 98 | 8.2.2. Idempotent Methods . . . . . . . . . . . . . . . . . 80 | |||
| 8.4. Method Extensibility . . . . . . . . . . . . . . . . . . 99 | 8.2.3. Methods and Caching . . . . . . . . . . . . . . . . . 81 | |||
| 8.4.1. Method Registry . . . . . . . . . . . . . . . . . . . 99 | 8.3. Method Definitions . . . . . . . . . . . . . . . . . . . 81 | |||
| 8.4.2. Considerations for New Methods . . . . . . . . . . . 100 | 8.3.1. GET . . . . . . . . . . . . . . . . . . . . . . . . . 81 | |||
| 9. Request Header Fields . . . . . . . . . . . . . . . . . . . . 100 | 8.3.2. HEAD . . . . . . . . . . . . . . . . . . . . . . . . 82 | |||
| 9.1. Controls . . . . . . . . . . . . . . . . . . . . . . . . 100 | 8.3.3. POST . . . . . . . . . . . . . . . . . . . . . . . . 83 | |||
| 9.1.1. Expect . . . . . . . . . . . . . . . . . . . . . . . 101 | 8.3.4. PUT . . . . . . . . . . . . . . . . . . . . . . . . . 84 | |||
| 9.1.2. Max-Forwards . . . . . . . . . . . . . . . . . . . . 103 | 8.3.5. DELETE . . . . . . . . . . . . . . . . . . . . . . . 87 | |||
| 9.2. Preconditions . . . . . . . . . . . . . . . . . . . . . . 104 | 8.3.6. CONNECT . . . . . . . . . . . . . . . . . . . . . . . 88 | |||
| 9.2.1. Evaluation . . . . . . . . . . . . . . . . . . . . . 105 | 8.3.7. OPTIONS . . . . . . . . . . . . . . . . . . . . . . . 89 | |||
| 9.2.2. Precedence . . . . . . . . . . . . . . . . . . . . . 106 | 8.3.8. TRACE . . . . . . . . . . . . . . . . . . . . . . . . 90 | |||
| 9.2.3. If-Match . . . . . . . . . . . . . . . . . . . . . . 107 | 9. Context . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 | |||
| 9.2.4. If-None-Match . . . . . . . . . . . . . . . . . . . . 109 | 9.1. Request Context . . . . . . . . . . . . . . . . . . . . . 91 | |||
| 9.2.5. If-Modified-Since . . . . . . . . . . . . . . . . . . 110 | 9.1.1. Expect . . . . . . . . . . . . . . . . . . . . . . . 92 | |||
| 9.2.6. If-Unmodified-Since . . . . . . . . . . . . . . . . . 112 | 9.1.2. From . . . . . . . . . . . . . . . . . . . . . . . . 94 | |||
| 9.2.7. If-Range . . . . . . . . . . . . . . . . . . . . . . 113 | 9.1.3. Referer . . . . . . . . . . . . . . . . . . . . . . . 95 | |||
| 9.3. Range . . . . . . . . . . . . . . . . . . . . . . . . . . 114 | 9.1.4. TE . . . . . . . . . . . . . . . . . . . . . . . . . 96 | |||
| 9.4. Negotiation . . . . . . . . . . . . . . . . . . . . . . . 116 | 9.1.5. Trailer . . . . . . . . . . . . . . . . . . . . . . . 96 | |||
| 9.4.1. Accept . . . . . . . . . . . . . . . . . . . . . . . 117 | 9.1.6. User-Agent . . . . . . . . . . . . . . . . . . . . . 97 | |||
| 9.4.2. Accept-Charset . . . . . . . . . . . . . . . . . . . 119 | 9.2. Response Context . . . . . . . . . . . . . . . . . . . . 98 | |||
| 9.4.3. Accept-Encoding . . . . . . . . . . . . . . . . . . . 120 | 9.2.1. Allow . . . . . . . . . . . . . . . . . . . . . . . . 98 | |||
| 9.4.4. Accept-Language . . . . . . . . . . . . . . . . . . . 122 | 9.2.2. Date . . . . . . . . . . . . . . . . . . . . . . . . 99 | |||
| 9.5. Authentication Credentials . . . . . . . . . . . . . . . 123 | 9.2.3. Location . . . . . . . . . . . . . . . . . . . . . . 100 | |||
| 9.5.1. Challenge and Response . . . . . . . . . . . . . . . 123 | 9.2.4. Retry-After . . . . . . . . . . . . . . . . . . . . . 101 | |||
| 9.5.2. Protection Space (Realm) . . . . . . . . . . . . . . 125 | 9.2.5. Server . . . . . . . . . . . . . . . . . . . . . . . 102 | |||
| 9.5.3. Authorization . . . . . . . . . . . . . . . . . . . . 126 | 10. Authentication . . . . . . . . . . . . . . . . . . . . . . . 102 | |||
| 9.5.4. Proxy-Authorization . . . . . . . . . . . . . . . . . 126 | 10.1. Authentication Scheme . . . . . . . . . . . . . . . . . 102 | |||
| 9.5.5. Authentication Scheme Extensibility . . . . . . . . . 127 | 10.2. Authentication Parameters . . . . . . . . . . . . . . . 103 | |||
| 9.6. Request Context . . . . . . . . . . . . . . . . . . . . . 129 | 10.3. Challenge and Response . . . . . . . . . . . . . . . . . 103 | |||
| 9.6.1. From . . . . . . . . . . . . . . . . . . . . . . . . 129 | 10.4. Credentials . . . . . . . . . . . . . . . . . . . . . . 104 | |||
| 9.6.2. Referer . . . . . . . . . . . . . . . . . . . . . . . 130 | 10.5. Protection Space (Realm) . . . . . . . . . . . . . . . . 105 | |||
| 9.6.3. User-Agent . . . . . . . . . . . . . . . . . . . . . 131 | 10.6. Authenticating User to Origin Server . . . . . . . . . . 106 | |||
| 10. Response Status Codes . . . . . . . . . . . . . . . . . . . . 132 | 10.6.1. WWW-Authenticate . . . . . . . . . . . . . . . . . . 106 | |||
| 10.1. Overview of Status Codes . . . . . . . . . . . . . . . . 133 | 10.6.2. Authorization . . . . . . . . . . . . . . . . . . . 107 | |||
| 10.2. Informational 1xx . . . . . . . . . . . . . . . . . . . 134 | 10.6.3. Authentication-Info . . . . . . . . . . . . . . . . 107 | |||
| 10.2.1. 100 Continue . . . . . . . . . . . . . . . . . . . . 134 | 10.7. Authenticating Client to Proxy . . . . . . . . . . . . . 108 | |||
| 10.2.2. 101 Switching Protocols . . . . . . . . . . . . . . 135 | 10.7.1. Proxy-Authenticate . . . . . . . . . . . . . . . . . 108 | |||
| 10.3. Successful 2xx . . . . . . . . . . . . . . . . . . . . . 135 | 10.7.2. Proxy-Authorization . . . . . . . . . . . . . . . . 108 | |||
| 10.3.1. 200 OK . . . . . . . . . . . . . . . . . . . . . . . 135 | 10.7.3. Proxy-Authentication-Info . . . . . . . . . . . . . 109 | |||
| 10.3.2. 201 Created . . . . . . . . . . . . . . . . . . . . 136 | 11. Content Negotiation . . . . . . . . . . . . . . . . . . . . . 109 | |||
| 10.3.3. 202 Accepted . . . . . . . . . . . . . . . . . . . . 136 | 11.1. Proactive Negotiation . . . . . . . . . . . . . . . . . 110 | |||
| 10.3.4. 203 Non-Authoritative Information . . . . . . . . . 137 | 11.1.1. Shared Negotiation Features . . . . . . . . . . . . 111 | |||
| 10.3.5. 204 No Content . . . . . . . . . . . . . . . . . . . 137 | 11.1.2. Accept . . . . . . . . . . . . . . . . . . . . . . . 113 | |||
| 10.3.6. 205 Reset Content . . . . . . . . . . . . . . . . . 138 | 11.1.3. Accept-Charset . . . . . . . . . . . . . . . . . . . 115 | |||
| 10.3.7. 206 Partial Content . . . . . . . . . . . . . . . . 138 | 11.1.4. Accept-Encoding . . . . . . . . . . . . . . . . . . 116 | |||
| 10.4. Redirection 3xx . . . . . . . . . . . . . . . . . . . . 141 | 11.1.5. Accept-Language . . . . . . . . . . . . . . . . . . 117 | |||
| 10.4.1. 300 Multiple Choices . . . . . . . . . . . . . . . . 144 | 11.2. Reactive Negotiation . . . . . . . . . . . . . . . . . . 119 | |||
| 10.4.2. 301 Moved Permanently . . . . . . . . . . . . . . . 145 | 11.2.1. Vary . . . . . . . . . . . . . . . . . . . . . . . . 120 | |||
| 10.4.3. 302 Found . . . . . . . . . . . . . . . . . . . . . 145 | 11.3. Request Payload Negotiation . . . . . . . . . . . . . . 121 | |||
| 10.4.4. 303 See Other . . . . . . . . . . . . . . . . . . . 146 | 12. Conditional Requests . . . . . . . . . . . . . . . . . . . . 121 | |||
| 10.4.5. 304 Not Modified . . . . . . . . . . . . . . . . . . 146 | 12.1. Preconditions . . . . . . . . . . . . . . . . . . . . . 122 | |||
| 10.4.6. 305 Use Proxy . . . . . . . . . . . . . . . . . . . 147 | 12.1.1. If-Match . . . . . . . . . . . . . . . . . . . . . . 122 | |||
| 10.4.7. 306 (Unused) . . . . . . . . . . . . . . . . . . . . 147 | 12.1.2. If-None-Match . . . . . . . . . . . . . . . . . . . 124 | |||
| 10.4.8. 307 Temporary Redirect . . . . . . . . . . . . . . . 147 | 12.1.3. If-Modified-Since . . . . . . . . . . . . . . . . . 125 | |||
| 10.4.9. 308 Permanent Redirect . . . . . . . . . . . . . . . 148 | 12.1.4. If-Unmodified-Since . . . . . . . . . . . . . . . . 127 | |||
| 10.5. Client Error 4xx . . . . . . . . . . . . . . . . . . . . 148 | 12.1.5. If-Range . . . . . . . . . . . . . . . . . . . . . . 128 | |||
| 10.5.1. 400 Bad Request . . . . . . . . . . . . . . . . . . 148 | 12.2. Evaluation . . . . . . . . . . . . . . . . . . . . . . . 129 | |||
| 10.5.2. 401 Unauthorized . . . . . . . . . . . . . . . . . . 148 | 12.3. Precedence . . . . . . . . . . . . . . . . . . . . . . . 130 | |||
| 10.5.3. 402 Payment Required . . . . . . . . . . . . . . . . 149 | 13. Range Requests . . . . . . . . . . . . . . . . . . . . . . . 131 | |||
| 10.5.4. 403 Forbidden . . . . . . . . . . . . . . . . . . . 149 | 13.1. Range Units . . . . . . . . . . . . . . . . . . . . . . 132 | |||
| 10.5.5. 404 Not Found . . . . . . . . . . . . . . . . . . . 149 | 13.1.1. Range Specifiers . . . . . . . . . . . . . . . . . . 133 | |||
| 10.5.6. 405 Method Not Allowed . . . . . . . . . . . . . . . 150 | 13.1.2. Byte Ranges . . . . . . . . . . . . . . . . . . . . 134 | |||
| 10.5.7. 406 Not Acceptable . . . . . . . . . . . . . . . . . 150 | 13.2. Range . . . . . . . . . . . . . . . . . . . . . . . . . 135 | |||
| 10.5.8. 407 Proxy Authentication Required . . . . . . . . . 150 | 13.3. Accept-Ranges . . . . . . . . . . . . . . . . . . . . . 137 | |||
| 10.5.9. 408 Request Timeout . . . . . . . . . . . . . . . . 150 | 13.4. Content-Range . . . . . . . . . . . . . . . . . . . . . 137 | |||
| 10.5.10. 409 Conflict . . . . . . . . . . . . . . . . . . . . 151 | 13.5. Media Type multipart/byteranges . . . . . . . . . . . . 139 | |||
| 10.5.11. 410 Gone . . . . . . . . . . . . . . . . . . . . . . 151 | 14. Status Codes . . . . . . . . . . . . . . . . . . . . . . . . 141 | |||
| 10.5.12. 411 Length Required . . . . . . . . . . . . . . . . 151 | 14.1. Overview of Status Codes . . . . . . . . . . . . . . . . 142 | |||
| 10.5.13. 412 Precondition Failed . . . . . . . . . . . . . . 152 | 14.2. Informational 1xx . . . . . . . . . . . . . . . . . . . 142 | |||
| 10.5.14. 413 Payload Too Large . . . . . . . . . . . . . . . 152 | 14.2.1. 100 Continue . . . . . . . . . . . . . . . . . . . . 142 | |||
| 10.5.15. 414 URI Too Long . . . . . . . . . . . . . . . . . . 152 | 14.2.2. 101 Switching Protocols . . . . . . . . . . . . . . 143 | |||
| 10.5.16. 415 Unsupported Media Type . . . . . . . . . . . . . 152 | 14.3. Successful 2xx . . . . . . . . . . . . . . . . . . . . . 143 | |||
| 10.5.17. 416 Range Not Satisfiable . . . . . . . . . . . . . 153 | 14.3.1. 200 OK . . . . . . . . . . . . . . . . . . . . . . . 143 | |||
| 10.5.18. 417 Expectation Failed . . . . . . . . . . . . . . . 153 | 14.3.2. 201 Created . . . . . . . . . . . . . . . . . . . . 144 | |||
| 10.5.19. 418 (Unused) . . . . . . . . . . . . . . . . . . . . 154 | 14.3.3. 202 Accepted . . . . . . . . . . . . . . . . . . . . 144 | |||
| 10.5.20. 422 Unprocessable Payload . . . . . . . . . . . . . 154 | 14.3.4. 203 Non-Authoritative Information . . . . . . . . . 145 | |||
| 10.5.21. 426 Upgrade Required . . . . . . . . . . . . . . . . 154 | 14.3.5. 204 No Content . . . . . . . . . . . . . . . . . . . 145 | |||
| 10.6. Server Error 5xx . . . . . . . . . . . . . . . . . . . . 155 | 14.3.6. 205 Reset Content . . . . . . . . . . . . . . . . . 146 | |||
| 10.6.1. 500 Internal Server Error . . . . . . . . . . . . . 155 | 14.3.7. 206 Partial Content . . . . . . . . . . . . . . . . 146 | |||
| 10.6.2. 501 Not Implemented . . . . . . . . . . . . . . . . 155 | 14.4. Redirection 3xx . . . . . . . . . . . . . . . . . . . . 149 | |||
| 10.6.3. 502 Bad Gateway . . . . . . . . . . . . . . . . . . 155 | 14.4.1. 300 Multiple Choices . . . . . . . . . . . . . . . . 152 | |||
| 10.6.4. 503 Service Unavailable . . . . . . . . . . . . . . 155 | 14.4.2. 301 Moved Permanently . . . . . . . . . . . . . . . 153 | |||
| 10.6.5. 504 Gateway Timeout . . . . . . . . . . . . . . . . 156 | 14.4.3. 302 Found . . . . . . . . . . . . . . . . . . . . . 153 | |||
| 10.6.6. 505 HTTP Version Not Supported . . . . . . . . . . . 156 | 14.4.4. 303 See Other . . . . . . . . . . . . . . . . . . . 154 | |||
| 10.7. Status Code Extensibility . . . . . . . . . . . . . . . 156 | 14.4.5. 304 Not Modified . . . . . . . . . . . . . . . . . . 154 | |||
| 10.7.1. Status Code Registry . . . . . . . . . . . . . . . . 156 | 14.4.6. 305 Use Proxy . . . . . . . . . . . . . . . . . . . 155 | |||
| 10.7.2. Considerations for New Status Codes . . . . . . . . 157 | 14.4.7. 306 (Unused) . . . . . . . . . . . . . . . . . . . . 155 | |||
| 11. Response Header Fields . . . . . . . . . . . . . . . . . . . 158 | 14.4.8. 307 Temporary Redirect . . . . . . . . . . . . . . . 155 | |||
| 11.1. Control Data . . . . . . . . . . . . . . . . . . . . . . 158 | 14.4.9. 308 Permanent Redirect . . . . . . . . . . . . . . . 156 | |||
| 11.1.1. Date . . . . . . . . . . . . . . . . . . . . . . . . 158 | 14.5. Client Error 4xx . . . . . . . . . . . . . . . . . . . . 156 | |||
| 11.1.2. Location . . . . . . . . . . . . . . . . . . . . . . 159 | 14.5.1. 400 Bad Request . . . . . . . . . . . . . . . . . . 156 | |||
| 11.1.3. Retry-After . . . . . . . . . . . . . . . . . . . . 161 | 14.5.2. 401 Unauthorized . . . . . . . . . . . . . . . . . . 156 | |||
| 11.1.4. Vary . . . . . . . . . . . . . . . . . . . . . . . . 161 | 14.5.3. 402 Payment Required . . . . . . . . . . . . . . . . 157 | |||
| 11.2. Validators . . . . . . . . . . . . . . . . . . . . . . . 162 | 14.5.4. 403 Forbidden . . . . . . . . . . . . . . . . . . . 157 | |||
| 11.2.1. Weak versus Strong . . . . . . . . . . . . . . . . . 163 | 14.5.5. 404 Not Found . . . . . . . . . . . . . . . . . . . 157 | |||
| 11.2.2. Last-Modified . . . . . . . . . . . . . . . . . . . 165 | 14.5.6. 405 Method Not Allowed . . . . . . . . . . . . . . . 158 | |||
| 11.2.3. ETag . . . . . . . . . . . . . . . . . . . . . . . . 167 | 14.5.7. 406 Not Acceptable . . . . . . . . . . . . . . . . . 158 | |||
| 11.2.4. When to Use Entity-Tags and Last-Modified Dates . . 170 | 14.5.8. 407 Proxy Authentication Required . . . . . . . . . 158 | |||
| 11.3. Authentication Challenges . . . . . . . . . . . . . . . 171 | 14.5.9. 408 Request Timeout . . . . . . . . . . . . . . . . 158 | |||
| 11.3.1. WWW-Authenticate . . . . . . . . . . . . . . . . . . 172 | 14.5.10. 409 Conflict . . . . . . . . . . . . . . . . . . . . 159 | |||
| 11.3.2. Proxy-Authenticate . . . . . . . . . . . . . . . . . 173 | 14.5.11. 410 Gone . . . . . . . . . . . . . . . . . . . . . . 159 | |||
| 11.3.3. Authentication-Info . . . . . . . . . . . . . . . . 173 | 14.5.12. 411 Length Required . . . . . . . . . . . . . . . . 159 | |||
| 11.3.4. Proxy-Authentication-Info . . . . . . . . . . . . . 174 | 14.5.13. 412 Precondition Failed . . . . . . . . . . . . . . 160 | |||
| 11.4. Response Context . . . . . . . . . . . . . . . . . . . . 175 | 14.5.14. 413 Payload Too Large . . . . . . . . . . . . . . . 160 | |||
| 11.4.1. Accept-Ranges . . . . . . . . . . . . . . . . . . . 175 | 14.5.15. 414 URI Too Long . . . . . . . . . . . . . . . . . . 160 | |||
| 11.4.2. Allow . . . . . . . . . . . . . . . . . . . . . . . 175 | 14.5.16. 415 Unsupported Media Type . . . . . . . . . . . . . 160 | |||
| 11.4.3. Server . . . . . . . . . . . . . . . . . . . . . . . 176 | 14.5.17. 416 Range Not Satisfiable . . . . . . . . . . . . . 161 | |||
| 12. Security Considerations . . . . . . . . . . . . . . . . . . . 177 | 14.5.18. 417 Expectation Failed . . . . . . . . . . . . . . . 161 | |||
| 12.1. Establishing Authority . . . . . . . . . . . . . . . . . 177 | 14.5.19. 418 (Unused) . . . . . . . . . . . . . . . . . . . . 162 | |||
| 12.2. Risks of Intermediaries . . . . . . . . . . . . . . . . 178 | 14.5.20. 422 Unprocessable Payload . . . . . . . . . . . . . 162 | |||
| 12.3. Attacks Based on File and Path Names . . . . . . . . . . 179 | 14.5.21. 426 Upgrade Required . . . . . . . . . . . . . . . . 162 | |||
| 12.4. Attacks Based on Command, Code, or Query Injection . . . 179 | 14.6. Server Error 5xx . . . . . . . . . . . . . . . . . . . . 163 | |||
| 12.5. Attacks via Protocol Element Length . . . . . . . . . . 180 | 14.6.1. 500 Internal Server Error . . . . . . . . . . . . . 163 | |||
| 12.6. Attacks using Shared-dictionary Compression . . . . . . 180 | 14.6.2. 501 Not Implemented . . . . . . . . . . . . . . . . 163 | |||
| 12.7. Disclosure of Personal Information . . . . . . . . . . . 181 | 14.6.3. 502 Bad Gateway . . . . . . . . . . . . . . . . . . 163 | |||
| 12.8. Privacy of Server Log Information . . . . . . . . . . . 181 | 14.6.4. 503 Service Unavailable . . . . . . . . . . . . . . 163 | |||
| 12.9. Disclosure of Sensitive Information in URIs . . . . . . 182 | 14.6.5. 504 Gateway Timeout . . . . . . . . . . . . . . . . 164 | |||
| 12.10. Disclosure of Fragment after Redirects . . . . . . . . . 182 | 14.6.6. 505 HTTP Version Not Supported . . . . . . . . . . . 164 | |||
| 12.11. Disclosure of Product Information . . . . . . . . . . . 183 | 15. Extending HTTP . . . . . . . . . . . . . . . . . . . . . . . 164 | |||
| 12.12. Browser Fingerprinting . . . . . . . . . . . . . . . . . 183 | 15.1. Method Extensibility . . . . . . . . . . . . . . . . . . 165 | |||
| 12.13. Validator Retention . . . . . . . . . . . . . . . . . . 184 | 15.1.1. Method Registry . . . . . . . . . . . . . . . . . . 165 | |||
| 12.14. Denial-of-Service Attacks Using Range . . . . . . . . . 184 | 15.1.2. Considerations for New Methods . . . . . . . . . . . 165 | |||
| 12.15. Authentication Considerations . . . . . . . . . . . . . 185 | 15.2. Status Code Extensibility . . . . . . . . . . . . . . . 166 | |||
| 12.15.1. Confidentiality of Credentials . . . . . . . . . . 185 | 15.2.1. Status Code Registry . . . . . . . . . . . . . . . . 166 | |||
| 12.15.2. Credentials and Idle Clients . . . . . . . . . . . 186 | 15.2.2. Considerations for New Status Codes . . . . . . . . 166 | |||
| 12.15.3. Protection Spaces . . . . . . . . . . . . . . . . . 186 | 15.3. Field Name Extensibility . . . . . . . . . . . . . . . . 167 | |||
| 12.15.4. Additional Response Fields . . . . . . . . . . . . 187 | 15.3.1. Field Name Registry . . . . . . . . . . . . . . . . 167 | |||
| 13. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 187 | 15.3.2. Considerations for New Field Names . . . . . . . . . 168 | |||
| 13.1. URI Scheme Registration . . . . . . . . . . . . . . . . 187 | 15.3.3. Considerations for New Field Values . . . . . . . . 169 | |||
| 13.2. Method Registration . . . . . . . . . . . . . . . . . . 187 | 15.4. Authentication Scheme Extensibility . . . . . . . . . . 171 | |||
| 13.3. Status Code Registration . . . . . . . . . . . . . . . . 187 | 15.4.1. Authentication Scheme Registry . . . . . . . . . . . 171 | |||
| 13.4. HTTP Field Name Registration . . . . . . . . . . . . . . 188 | 15.4.2. Considerations for New Authentication Schemes . . . 171 | |||
| 13.5. Authentication Scheme Registration . . . . . . . . . . . 189 | 15.5. Range Unit Extensibility . . . . . . . . . . . . . . . . 172 | |||
| 13.6. Content Coding Registration . . . . . . . . . . . . . . 189 | 15.5.1. Range Unit Registry . . . . . . . . . . . . . . . . 172 | |||
| 13.7. Range Unit Registration . . . . . . . . . . . . . . . . 189 | 15.5.2. Considerations for New Range Units . . . . . . . . . 173 | |||
| 13.8. Media Type Registration . . . . . . . . . . . . . . . . 189 | 15.6. Content Coding Extensibility . . . . . . . . . . . . . . 173 | |||
| 13.9. Port Registration . . . . . . . . . . . . . . . . . . . 189 | 15.6.1. Content Coding Registry . . . . . . . . . . . . . . 173 | |||
| 14. References . . . . . . . . . . . . . . . . . . . . . . . . . 189 | 15.6.2. Considerations for New Content Codings . . . . . . . 173 | |||
| 14.1. Normative References . . . . . . . . . . . . . . . . . . 189 | 15.7. Upgrade Token Registry . . . . . . . . . . . . . . . . . 174 | |||
| 14.2. Informative References . . . . . . . . . . . . . . . . . 191 | 16. Security Considerations . . . . . . . . . . . . . . . . . . . 174 | |||
| Appendix A. Collected ABNF . . . . . . . . . . . . . . . . . . . 197 | 16.1. Establishing Authority . . . . . . . . . . . . . . . . . 175 | |||
| Appendix B. Changes from previous RFCs . . . . . . . . . . . . . 202 | 16.2. Risks of Intermediaries . . . . . . . . . . . . . . . . 176 | |||
| B.1. Changes from RFC 2818 . . . . . . . . . . . . . . . . . . 202 | 16.3. Attacks Based on File and Path Names . . . . . . . . . . 176 | |||
| B.2. Changes from RFC 7230 . . . . . . . . . . . . . . . . . . 202 | 16.4. Attacks Based on Command, Code, or Query Injection . . . 177 | |||
| B.3. Changes from RFC 7231 . . . . . . . . . . . . . . . . . . 203 | 16.5. Attacks via Protocol Element Length . . . . . . . . . . 177 | |||
| B.4. Changes from RFC 7232 . . . . . . . . . . . . . . . . . . 204 | 16.6. Attacks using Shared-dictionary Compression . . . . . . 178 | |||
| 16.7. Disclosure of Personal Information . . . . . . . . . . . 178 | ||||
| 16.8. Privacy of Server Log Information . . . . . . . . . . . 179 | ||||
| 16.9. Disclosure of Sensitive Information in URIs . . . . . . 179 | ||||
| 16.10. Disclosure of Fragment after Redirects . . . . . . . . . 180 | ||||
| 16.11. Disclosure of Product Information . . . . . . . . . . . 180 | ||||
| 16.12. Browser Fingerprinting . . . . . . . . . . . . . . . . . 181 | ||||
| 16.13. Validator Retention . . . . . . . . . . . . . . . . . . 182 | ||||
| 16.14. Denial-of-Service Attacks Using Range . . . . . . . . . 182 | ||||
| 16.15. Authentication Considerations . . . . . . . . . . . . . 183 | ||||
| 16.15.1. Confidentiality of Credentials . . . . . . . . . . 183 | ||||
| 16.15.2. Credentials and Idle Clients . . . . . . . . . . . 183 | ||||
| 16.15.3. Protection Spaces . . . . . . . . . . . . . . . . . 184 | ||||
| 16.15.4. Additional Response Fields . . . . . . . . . . . . 184 | ||||
| 17. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 184 | ||||
| 17.1. URI Scheme Registration . . . . . . . . . . . . . . . . 185 | ||||
| 17.2. Method Registration . . . . . . . . . . . . . . . . . . 185 | ||||
| 17.3. Status Code Registration . . . . . . . . . . . . . . . . 185 | ||||
| 17.4. HTTP Field Name Registration . . . . . . . . . . . . . . 187 | ||||
| 17.5. Authentication Scheme Registration . . . . . . . . . . . 189 | ||||
| 17.6. Content Coding Registration . . . . . . . . . . . . . . 189 | ||||
| 17.7. Range Unit Registration . . . . . . . . . . . . . . . . 189 | ||||
| 17.8. Media Type Registration . . . . . . . . . . . . . . . . 189 | ||||
| 17.9. Port Registration . . . . . . . . . . . . . . . . . . . 189 | ||||
| 17.10. Upgrade Token Registration . . . . . . . . . . . . . . . 190 | ||||
| 18. References . . . . . . . . . . . . . . . . . . . . . . . . . 190 | ||||
| 18.1. Normative References . . . . . . . . . . . . . . . . . . 190 | ||||
| 18.2. Informative References . . . . . . . . . . . . . . . . . 192 | ||||
| Appendix A. Collected ABNF . . . . . . . . . . . . . . . . . . . 198 | ||||
| Appendix B. Changes from previous RFCs . . . . . . . . . . . . . 203 | ||||
| B.1. Changes from RFC 2818 . . . . . . . . . . . . . . . . . . 203 | ||||
| B.2. Changes from RFC 7230 . . . . . . . . . . . . . . . . . . 203 | ||||
| B.3. Changes from RFC 7231 . . . . . . . . . . . . . . . . . . 204 | ||||
| B.4. Changes from RFC 7232 . . . . . . . . . . . . . . . . . . 205 | ||||
| B.5. Changes from RFC 7233 . . . . . . . . . . . . . . . . . . 205 | B.5. Changes from RFC 7233 . . . . . . . . . . . . . . . . . . 205 | |||
| B.6. Changes from RFC 7235 . . . . . . . . . . . . . . . . . . 205 | B.6. Changes from RFC 7235 . . . . . . . . . . . . . . . . . . 205 | |||
| B.7. Changes from RFC 7538 . . . . . . . . . . . . . . . . . . 205 | B.7. Changes from RFC 7538 . . . . . . . . . . . . . . . . . . 205 | |||
| B.8. Changes from RFC 7615 . . . . . . . . . . . . . . . . . . 205 | B.8. Changes from RFC 7615 . . . . . . . . . . . . . . . . . . 205 | |||
| B.9. Changes from RFC 7694 . . . . . . . . . . . . . . . . . . 205 | B.9. Changes from RFC 7694 . . . . . . . . . . . . . . . . . . 206 | |||
| Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 205 | Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 206 | |||
| C.1. Between RFC723x and draft 00 . . . . . . . . . . . . . . 205 | C.1. Between RFC723x and draft 00 . . . . . . . . . . . . . . 206 | |||
| C.2. Since draft-ietf-httpbis-semantics-00 . . . . . . . . . . 206 | C.2. Since draft-ietf-httpbis-semantics-00 . . . . . . . . . . 206 | |||
| C.3. Since draft-ietf-httpbis-semantics-01 . . . . . . . . . . 206 | C.3. Since draft-ietf-httpbis-semantics-01 . . . . . . . . . . 207 | |||
| C.4. Since draft-ietf-httpbis-semantics-02 . . . . . . . . . . 208 | C.4. Since draft-ietf-httpbis-semantics-02 . . . . . . . . . . 208 | |||
| C.5. Since draft-ietf-httpbis-semantics-03 . . . . . . . . . . 208 | C.5. Since draft-ietf-httpbis-semantics-03 . . . . . . . . . . 209 | |||
| C.6. Since draft-ietf-httpbis-semantics-04 . . . . . . . . . . 209 | C.6. Since draft-ietf-httpbis-semantics-04 . . . . . . . . . . 210 | |||
| C.7. Since draft-ietf-httpbis-semantics-05 . . . . . . . . . . 210 | C.7. Since draft-ietf-httpbis-semantics-05 . . . . . . . . . . 210 | |||
| C.8. Since draft-ietf-httpbis-semantics-06 . . . . . . . . . . 211 | C.8. Since draft-ietf-httpbis-semantics-06 . . . . . . . . . . 212 | |||
| C.9. Since draft-ietf-httpbis-semantics-07 . . . . . . . . . . 212 | C.9. Since draft-ietf-httpbis-semantics-07 . . . . . . . . . . 213 | |||
| C.10. Since draft-ietf-httpbis-semantics-08 . . . . . . . . . . 214 | C.10. Since draft-ietf-httpbis-semantics-08 . . . . . . . . . . 214 | |||
| C.11. Since draft-ietf-httpbis-semantics-09 . . . . . . . . . . 215 | C.11. Since draft-ietf-httpbis-semantics-09 . . . . . . . . . . 216 | |||
| C.12. Since draft-ietf-httpbis-semantics-10 . . . . . . . . . . 215 | C.12. Since draft-ietf-httpbis-semantics-10 . . . . . . . . . . 216 | |||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 217 | C.13. Since draft-ietf-httpbis-semantics-11 . . . . . . . . . . 217 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 217 | Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 218 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 218 | ||||
| 1. Introduction | 1. Introduction | |||
| 1.1. Purpose | 1.1. Purpose | |||
| The Hypertext Transfer Protocol (HTTP) is a family of stateless, | The Hypertext Transfer Protocol (HTTP) is a family of stateless, | |||
| application-level, request/response protocols that share a generic | application-level, request/response protocols that share a generic | |||
| interface, extensible semantics, and self-descriptive messages to | interface, extensible semantics, and self-descriptive messages to | |||
| enable flexible interaction with network-based hypertext information | enable flexible interaction with network-based hypertext information | |||
| systems. | systems. | |||
| skipping to change at page 9, line 11 ¶ | skipping to change at page 9, line 45 ¶ | |||
| interface provided by servers. However, since multiple clients might | interface provided by servers. However, since multiple clients might | |||
| act in parallel and perhaps at cross-purposes, we cannot require that | act in parallel and perhaps at cross-purposes, we cannot require that | |||
| such changes be observable beyond the scope of a single response. | such changes be observable beyond the scope of a single response. | |||
| 1.2. Evolution | 1.2. Evolution | |||
| HTTP has been the primary information transfer protocol for the World | HTTP has been the primary information transfer protocol for the World | |||
| Wide Web since its introduction in 1990. It began as a trivial | Wide Web since its introduction in 1990. It began as a trivial | |||
| mechanism for low-latency requests, with a single method (GET) to | mechanism for low-latency requests, with a single method (GET) to | |||
| request transfer of a presumed hypertext document identified by a | request transfer of a presumed hypertext document identified by a | |||
| given pathname (HTTP/0.9). As the Web grew, HTTP was extended to | given pathname. This original protocol is now referred to as | |||
| enclose requests and responses within messages, transfer arbitrary | HTTP/0.9. | |||
| data formats using MIME-like media types, and route requests through | ||||
| intermediaries, eventually being defined as HTTP/1.0 [RFC1945]. | HTTP's version number consists of two decimal digits separated by a | |||
| "." (period or decimal point). The first digit ("major version") | ||||
| indicates the messaging syntax, whereas the second digit ("minor | ||||
| version") indicates the highest minor version within that major | ||||
| version to which the sender is conformant (able to understand for | ||||
| future communication). | ||||
| As the Web grew, HTTP was extended to enclose requests and responses | ||||
| within messages, transfer arbitrary data formats using MIME-like | ||||
| media types, and route requests through intermediaries, eventually | ||||
| being defined as HTTP/1.0 [RFC1945]. | ||||
| HTTP/1.1 was designed to refine the protocol's features while | HTTP/1.1 was designed to refine the protocol's features while | |||
| retaining compatibility with the existing text-based messaging | retaining compatibility with the existing text-based messaging | |||
| syntax, improving its interoperability, scalability, and robustness | syntax, improving its interoperability, scalability, and robustness | |||
| across the Internet. This included length-based payload delimiters | across the Internet. This included length-based payload delimiters | |||
| for both fixed and dynamic (chunked) content, a consistent framework | for both fixed and dynamic (chunked) content, a consistent framework | |||
| for content negotiation, opaque validators for conditional requests, | for content negotiation, opaque validators for conditional requests, | |||
| cache controls for better cache consistency, range requests for | cache controls for better cache consistency, range requests for | |||
| partial updates, and default persistent connections. HTTP/1.1 was | partial updates, and default persistent connections. HTTP/1.1 was | |||
| introduced in 1995 and published on the standards track in 1997 | introduced in 1995 and published on the standards track in 1997 | |||
| skipping to change at page 9, line 48 ¶ | skipping to change at page 10, line 49 ¶ | |||
| transport and messaging syntax for their particular context. | transport and messaging syntax for their particular context. | |||
| This revision of HTTP separates the definition of semantics (this | This revision of HTTP separates the definition of semantics (this | |||
| document) and caching ([Caching]) from the current HTTP/1.1 messaging | document) and caching ([Caching]) from the current HTTP/1.1 messaging | |||
| syntax ([Messaging]) to allow each major protocol version to progress | syntax ([Messaging]) to allow each major protocol version to progress | |||
| independently while referring to the same core semantics. | independently while referring to the same core semantics. | |||
| 1.3. Semantics | 1.3. Semantics | |||
| HTTP provides a uniform interface for interacting with a resource | HTTP provides a uniform interface for interacting with a resource | |||
| (Section 2.5), regardless of its type, nature, or implementation, by | (Section 3.1), regardless of its type, nature, or implementation, by | |||
| sending messages that manipulate or transfer representations | sending messages that manipulate or transfer representations | |||
| (Section 7). | (Section 7). | |||
| Each message is either a request or a response. A client constructs | Each message is either a request or a response. A client constructs | |||
| request messages that communicate its intentions and routes those | request messages that communicate its intentions and routes those | |||
| messages toward an identified origin server. A server listens for | messages toward an identified origin server. A server listens for | |||
| requests, parses each message received, interprets the message | requests, parses each message received, interprets the message | |||
| semantics in relation to the identified target resource, and responds | semantics in relation to the identified target resource, and responds | |||
| to that request with one or more response messages. The client | to that request with one or more response messages. The client | |||
| examines received responses to see if its intentions were carried | examines received responses to see if its intentions were carried | |||
| out, determining what to do next based on the received status and | out, determining what to do next based on the received status and | |||
| payloads. | payloads. | |||
| HTTP semantics include the intentions defined by each request method | HTTP semantics include the intentions defined by each request method | |||
| (Section 8), extensions to those semantics that might be described in | (Section 8), extensions to those semantics that might be described in | |||
| request header fields (Section 9), status codes that describe the | request header fields, status codes that describe the response | |||
| response (Section 10), and other control data and resource metadata | (Section 14), and other control data and resource metadata that might | |||
| that might be given in response fields (Section 11). | be given in response fields. | |||
| Semantics also include representation metadata that describe how a | Semantics also include representation metadata that describe how a | |||
| payload is intended to be interpreted by a recipient, request header | payload is intended to be interpreted by a recipient, request header | |||
| fields that might influence content selection, and the various | fields that might influence content selection, and the various | |||
| selection algorithms that are collectively referred to as "content | selection algorithms that are collectively referred to as "content | |||
| negotiation" (Section 7.4). | negotiation" (Section 11). | |||
| 1.4. Obsoletes | 1.4. Obsoletes | |||
| This document obsoletes the following specifications: | This document obsoletes the following specifications: | |||
| -------------------------------------------- ----------- --------- | -------------------------------------------- ----------- --------- | |||
| Title Reference Changes | Title Reference Changes | |||
| -------------------------------------------- ----------- --------- | -------------------------------------------- ----------- --------- | |||
| HTTP Over TLS [RFC2818] B.1 | HTTP Over TLS [RFC2818] B.1 | |||
| HTTP/1.1 Message Syntax and Routing [*] [RFC7230] B.2 | HTTP/1.1 Message Syntax and Routing [*] [RFC7230] B.2 | |||
| skipping to change at page 11, line 5 ¶ | skipping to change at page 12, line 5 ¶ | |||
| HTTP Client-Initiated Content-Encoding [RFC7694] B.9 | HTTP Client-Initiated Content-Encoding [RFC7694] B.9 | |||
| -------------------------------------------- ----------- --------- | -------------------------------------------- ----------- --------- | |||
| Table 1 | Table 1 | |||
| [*] This document only obsoletes the portions of RFC 7230 that are | [*] This document only obsoletes the portions of RFC 7230 that are | |||
| independent of the HTTP/1.1 messaging syntax and connection | independent of the HTTP/1.1 messaging syntax and connection | |||
| management; the remaining bits of RFC 7230 are obsoleted by "HTTP/1.1 | management; the remaining bits of RFC 7230 are obsoleted by "HTTP/1.1 | |||
| Messaging" [Messaging]. | Messaging" [Messaging]. | |||
| 1.5. Requirements Notation | 2. Conformance | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | ||||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | ||||
| "OPTIONAL" in this document are to be interpreted as described in BCP | ||||
| 14 [RFC2119] [RFC8174] when, and only when, they appear in all | ||||
| capitals, as shown here. | ||||
| Conformance criteria and considerations regarding error handling are | ||||
| defined in Section 3. | ||||
| 1.6. Syntax Notation | 2.1. 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.5, that allows | It also uses a list extension, defined in Section 5.7.1, that allows | |||
| for compact definition of comma-separated lists using a '#' operator | for compact definition of comma-separated lists using a '#' operator | |||
| (similar to how the '*' operator indicates repetition). Appendix A | (similar to how the '*' operator indicates repetition). Appendix A | |||
| shows the collected grammar with all list operators expanded to | shows the collected grammar with all list operators expanded to | |||
| standard ABNF notation. | standard ABNF notation. | |||
| As a convention, ABNF rule names prefixed with "obs-" denote | As a convention, ABNF rule names prefixed with "obs-" denote | |||
| "obsolete" grammar rules that appear for historical reasons. | "obsolete" grammar rules that appear for historical reasons. | |||
| The following core rules are included by reference, as defined in | The following core rules are included by reference, as defined in | |||
| Appendix B.1 of [RFC5234]: ALPHA (letters), CR (carriage return), | Appendix B.1 of [RFC5234]: ALPHA (letters), CR (carriage return), | |||
| CRLF (CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double | CRLF (CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double | |||
| quote), HEXDIG (hexadecimal 0-9/A-F/a-f), HTAB (horizontal tab), LF | quote), HEXDIG (hexadecimal 0-9/A-F/a-f), HTAB (horizontal tab), LF | |||
| (line feed), OCTET (any 8-bit sequence of data), SP (space), and | (line feed), OCTET (any 8-bit sequence of data), SP (space), and | |||
| VCHAR (any visible US-ASCII character). | VCHAR (any visible US-ASCII character). | |||
| Section 5.4.1 defines some generic syntactic components for field | Section 5.7 defines some generic syntactic components for field | |||
| values. | values. | |||
| The rule below is defined in [Messaging]; | The rule below is defined in [Messaging]; | |||
| transfer-coding = <transfer-coding, see [Messaging], Section 7> | transfer-coding = <transfer-coding, see [Messaging], Section 7> | |||
| This specification uses the terms "character", "character encoding | This specification uses the terms "character", "character encoding | |||
| scheme", "charset", and "protocol element" as they are defined in | scheme", "charset", and "protocol element" as they are defined in | |||
| [RFC6365]. | [RFC6365]. | |||
| 1.6.1. Whitespace | 2.2. Requirements Notation | |||
| This specification uses three rules to denote the use of linear | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| whitespace: OWS (optional whitespace), RWS (required whitespace), and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| BWS ("bad" whitespace). | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
| 14 [RFC2119] [RFC8174] when, and only when, they appear in all | ||||
| capitals, as shown here. | ||||
| The OWS rule is used where zero or more linear whitespace octets | This specification targets conformance criteria according to the role | |||
| might appear. For protocol elements where optional whitespace is | of a participant in HTTP communication. Hence, requirements are | |||
| preferred to improve readability, a sender SHOULD generate the | placed on senders, recipients, clients, servers, user agents, | |||
| optional whitespace as a single SP; otherwise, a sender SHOULD NOT | intermediaries, origin servers, proxies, gateways, or caches, | |||
| generate optional whitespace except as needed to white out invalid or | depending on what behavior is being constrained by the requirement. | |||
| unwanted protocol elements during in-place message filtering. | ||||
| The RWS rule is used when at least one linear whitespace octet is | Additional (social) requirements are placed on implementations, | |||
| required to separate field tokens. A sender SHOULD generate RWS as a | resource owners, and protocol element registrations when they apply | |||
| single SP. | beyond the scope of a single communication. | |||
| OWS and RWS have the same semantics as a single SP. Any content | The verb "generate" is used instead of "send" where a requirement | |||
| known to be defined as OWS or RWS MAY be replaced with a single SP | applies only to implementations that create the protocol element, | |||
| before interpreting it or forwarding the message downstream. | rather than an implementation that forwards a received element | |||
| downstream. | ||||
| The BWS rule is used where the grammar allows optional whitespace | An implementation is considered conformant if it complies with all of | |||
| only for historical reasons. A sender MUST NOT generate BWS in | the requirements associated with the roles it partakes in HTTP. | |||
| messages. A recipient MUST parse for such bad whitespace and remove | ||||
| it before interpreting the protocol element. | ||||
| BWS has no semantics. Any content known to be defined as BWS MAY be | Conformance includes both the syntax and semantics of protocol | |||
| removed before interpreting it or forwarding the message downstream. | elements. A sender MUST NOT generate protocol elements that convey a | |||
| meaning that is known by that sender to be false. A sender MUST NOT | ||||
| generate protocol elements that do not match the grammar defined by | ||||
| the corresponding ABNF rules. Within a given message, a sender MUST | ||||
| NOT generate protocol elements or syntax alternatives that are only | ||||
| allowed to be generated by participants in other roles (i.e., a role | ||||
| that the sender does not have for that message). | ||||
| OWS = *( SP / HTAB ) | 2.3. Length Requirements | |||
| ; optional whitespace | ||||
| RWS = 1*( SP / HTAB ) | ||||
| ; required whitespace | ||||
| BWS = OWS | ||||
| ; "bad" whitespace | ||||
| 2. Architecture | When a received protocol element is parsed, the recipient MUST be | |||
| able to parse any value of reasonable length that is applicable to | ||||
| the recipient's role and that matches the grammar defined by the | ||||
| corresponding ABNF rules. Note, however, that some received protocol | ||||
| elements might not be parsed. For example, an intermediary | ||||
| forwarding a message might parse a field into generic field name and | ||||
| field value components, but then forward the field without further | ||||
| parsing inside the field value. | ||||
| HTTP does not have specific length limitations for many of its | ||||
| protocol elements because the lengths that might be appropriate will | ||||
| vary widely, depending on the deployment context and purpose of the | ||||
| implementation. Hence, interoperability between senders and | ||||
| recipients depends on shared expectations regarding what is a | ||||
| reasonable length for each protocol element. Furthermore, what is | ||||
| commonly understood to be a reasonable length for some protocol | ||||
| elements has changed over the course of the past two decades of HTTP | ||||
| use and is expected to continue changing in the future. | ||||
| At a minimum, a recipient MUST be able to parse and process protocol | ||||
| element lengths that are at least as long as the values that it | ||||
| generates for those same protocol elements in other messages. For | ||||
| example, an origin server that publishes very long URI references to | ||||
| its own resources needs to be able to parse and process those same | ||||
| references when received as a target URI. | ||||
| 2.4. Error Handling | ||||
| A recipient MUST interpret a received protocol element according to | ||||
| the semantics defined for it by this specification, including | ||||
| extensions to this specification, unless the recipient has determined | ||||
| (through experience or configuration) that the sender incorrectly | ||||
| implements what is implied by those semantics. For example, an | ||||
| origin server might disregard the contents of a received | ||||
| Accept-Encoding header field if inspection of the User-Agent header | ||||
| field indicates a specific implementation version that is known to | ||||
| fail on receipt of certain content codings. | ||||
| Unless noted otherwise, a recipient MAY attempt to recover a usable | ||||
| protocol element from an invalid construct. HTTP does not define | ||||
| specific error handling mechanisms except when they have a direct | ||||
| impact on security, since different applications of the protocol | ||||
| require different error handling strategies. For example, a Web | ||||
| browser might wish to transparently recover from a response where the | ||||
| Location header field doesn't parse according to the ABNF, whereas a | ||||
| systems control client might consider any form of error recovery to | ||||
| be dangerous. | ||||
| Some requests can be automatically retried by a client in the event | ||||
| of an underlying connection failure, as described in Section 8.2.2. | ||||
| 3. Terminology | ||||
| HTTP was created for the World Wide Web (WWW) architecture and has | HTTP was created for the World Wide Web (WWW) architecture and has | |||
| evolved over time to support the scalability needs of a worldwide | evolved over time to support the scalability needs of a worldwide | |||
| hypertext system. Much of that architecture is reflected in the | hypertext system. Much of that architecture is reflected in the | |||
| terminology and syntax productions used to define HTTP. | terminology and syntax productions used to define HTTP. | |||
| 2.1. Client/Server Messaging | 3.1. Resources | |||
| HTTP is a stateless request/response protocol that operates by | The target of an HTTP request is called a "resource". HTTP does not | |||
| exchanging messages across a reliable transport- or session-layer | limit the nature of a resource; it merely defines an interface that | |||
| "connection". An HTTP "client" is a program that establishes a | might be used to interact with resources. Most resources are | |||
| connection to a server for the purpose of sending one or more HTTP | identified by a Uniform Resource Identifier (URI), as described in | |||
| requests. An HTTP "server" is a program that accepts connections in | Section 4. | |||
| order to service HTTP requests by sending HTTP responses. | ||||
| The terms "client" and "server" refer only to the roles that these | One design goal of HTTP is to separate resource identification from | |||
| programs perform for a particular connection. The same program might | request semantics, which is made possible by vesting the request | |||
| act as a client on some connections and a server on others. The term | semantics in the request method (Section 8) and a few request- | |||
| "user agent" refers to any of the various client programs that | modifying header fields. If there is a conflict between the method | |||
| initiate a request, including (but not limited to) browsers, spiders | semantics and any semantic implied by the URI itself, as described in | |||
| (web-based robots), command-line tools, custom applications, and | Section 8.2.1, the method semantics take precedence. | |||
| mobile apps. The term "origin server" refers to the program that can | ||||
| originate authoritative responses for a given target resource. The | ||||
| terms "sender" and "recipient" refer to any implementation that sends | ||||
| or receives a given message, respectively. | ||||
| HTTP relies upon the Uniform Resource Identifier (URI) standard | HTTP relies upon the Uniform Resource Identifier (URI) standard | |||
| [RFC3986] to indicate the target resource (Section 6.1) and | [RFC3986] to indicate the target resource (Section 6.1) and | |||
| relationships between resources. | relationships between resources. | |||
| Most HTTP communication consists of a retrieval request (GET) for a | 3.2. Connections | |||
| representation of some resource identified by a URI. In the simplest | ||||
| case, this might be accomplished via a single bidirectional | ||||
| connection (===) between the user agent (UA) and the origin server | ||||
| (O). | ||||
| request > | HTTP is a client/server protocol that operates over a reliable | |||
| UA ======================================= O | transport- or session-layer "connection". | |||
| < response | ||||
| Figure 1 | An HTTP "client" is a program that establishes a connection to a | |||
| server for the purpose of sending one or more HTTP requests. An HTTP | ||||
| "server" is a program that accepts connections in order to service | ||||
| HTTP requests by sending HTTP responses. | ||||
| Each major version of HTTP defines its own syntax for the | The terms "client" and "server" refer only to the roles that these | |||
| communication of messages. Nevertheless, a common abstraction is | programs perform for a particular connection. The same program might | |||
| that each message contains some form of envelope/framing with self- | act as a client on some connections and a server on others. | |||
| descriptive control data that indicates its semantics and routing, a | ||||
| potential set of named fields up front (a header section), a | 3.3. Messages | |||
| potential body, and potential fields sent after the body begins | ||||
| (trailer sections). | HTTP is a stateless request/response protocol for exchanging | |||
| "messages" across a connection. The terms "sender" and "recipient" | ||||
| refer to any implementation that sends or receives a given message, | ||||
| respectively. | ||||
| A client sends requests to a server in the form of a request message | A client sends requests to a server in the form of a request message | |||
| with a method (Section 8) and request target. The request might also | with a method (Section 8) and request target (Section 6.1.1). The | |||
| contain header fields for request modifiers, client information, and | request might also contain header fields (Section 5.4) for request | |||
| representation metadata (Section 5), a payload body (Section 7.3.3) | modifiers, client information, and representation metadata, a payload | |||
| to be processed in accordance with the method, and trailer fields for | body (Section 5.5.4) to be processed in accordance with the method, | |||
| metadata collected while sending the payload. | and trailer fields (Section 5.6) for metadata collected while sending | |||
| the payload. | ||||
| A server responds to a client's request by sending one or more | A server responds to a client's request by sending one or more | |||
| response messages, each including a status code (Section 10). The | response messages, each including a status code (Section 14). The | |||
| response might also contain header fields for server information, | response might also contain header fields for server information, | |||
| resource metadata, and representation metadata (Section 5), a payload | resource metadata, and representation metadata, a payload body to be | |||
| body (Section 7.3.3) to be interpreted in accordance with the status | interpreted in accordance with the status code, and trailer fields | |||
| code, and trailer fields for metadata collected while sending the | for metadata collected while sending the payload. | |||
| payload. | ||||
| One of the functions of message framing is to assure that messages | 3.4. User Agent | |||
| are complete. A message is considered complete when all of the | ||||
| octets indicated by its framing are available. Note that, when no | ||||
| explicit framing is used, a response message that is ended by the | ||||
| transport connection's close is considered complete even though it | ||||
| might be indistinguishable from an incomplete response, unless a | ||||
| transport-level error indicates that it is not complete. | ||||
| A connection might be used for multiple request/response exchanges. | The term "user agent" refers to any of the various client programs | |||
| The mechanism used to correlate between request and response messages | that initiate a request. | |||
| is version dependent; some versions of HTTP use implicit ordering of | ||||
| messages, while others use an explicit identifier. | ||||
| Responses (both final and interim) can be sent at any time after a | The most familiar form of user agent is the general-purpose Web | |||
| request is received, even if it is not yet complete. However, | browser, but that's only a small percentage of implementations. | |||
| clients (including intermediaries) might abandon a request if the | Other common user agents include spiders (web-traversing robots), | |||
| response is not forthcoming within a reasonable period of time. | command-line tools, billboard screens, household appliances, scales, | |||
| light bulbs, firmware update scripts, mobile apps, and communication | ||||
| devices in a multitude of shapes and sizes. | ||||
| Being a user agent does not imply that there is a human user directly | ||||
| interacting with the software agent at the time of a request. In | ||||
| many cases, a user agent is installed or configured to run in the | ||||
| background and save its results for later inspection (or save only a | ||||
| subset of those results that might be interesting or erroneous). | ||||
| Spiders, for example, are typically given a start URI and configured | ||||
| to follow certain behavior while crawling the Web as a hypertext | ||||
| graph. | ||||
| Many user agents cannot, or choose not to, make interactive | ||||
| suggestions to their user or provide adequate warning for security or | ||||
| privacy concerns. In the few cases where this specification requires | ||||
| reporting of errors to the user, it is acceptable for such reporting | ||||
| to only be observable in an error console or log file. Likewise, | ||||
| requirements that an automated action be confirmed by the user before | ||||
| proceeding might be met via advance configuration choices, run-time | ||||
| options, or simple avoidance of the unsafe action; confirmation does | ||||
| not imply any specific user interface or interruption of normal | ||||
| processing if the user has already made that choice. | ||||
| 3.5. Origin Server | ||||
| The term "origin server" refers to a program that can originate | ||||
| authoritative responses for a given target resource. | ||||
| The most familiar form of origin server are large public websites. | ||||
| However, like user agents being equated with browsers, it is easy to | ||||
| be misled into thinking that all origin servers are alike. Common | ||||
| origin servers also include home automation units, configurable | ||||
| networking components, office machines, autonomous robots, news | ||||
| feeds, traffic cameras, real-time ad selectors, and video-on-demand | ||||
| platforms. | ||||
| 3.6. Example Request and Response | ||||
| Most HTTP communication consists of a retrieval request (GET) for a | ||||
| representation of some resource identified by a URI. In the simplest | ||||
| case, this might be accomplished via a single bidirectional | ||||
| connection (===) between the user agent (UA) and the origin server | ||||
| (O). | ||||
| request > | ||||
| UA ======================================= O | ||||
| < response | ||||
| Figure 1 | ||||
| The following example illustrates a typical message exchange for a | The following example illustrates a typical message exchange for a | |||
| GET request (Section 8.3.1) on the URI "http://www.example.com/ | GET request (Section 8.3.1) on the URI "http://www.example.com/ | |||
| hello.txt": | hello.txt": | |||
| Client request: | Client request: | |||
| GET /hello.txt HTTP/1.1 | GET /hello.txt HTTP/1.1 | |||
| User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3 | User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3 | |||
| Host: www.example.com | Host: www.example.com | |||
| skipping to change at page 15, line 17 ¶ | skipping to change at page 17, line 32 ¶ | |||
| Server: Apache | Server: Apache | |||
| Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT | Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT | |||
| ETag: "34aa387-d-1568eb00" | ETag: "34aa387-d-1568eb00" | |||
| Accept-Ranges: bytes | Accept-Ranges: bytes | |||
| Content-Length: 51 | Content-Length: 51 | |||
| Vary: Accept-Encoding | Vary: Accept-Encoding | |||
| Content-Type: text/plain | Content-Type: text/plain | |||
| Hello World! My payload includes a trailing CRLF. | Hello World! My payload includes a trailing CRLF. | |||
| 2.2. Intermediaries | 3.7. Intermediaries | |||
| HTTP enables the use of intermediaries to satisfy requests through a | HTTP enables the use of intermediaries to satisfy requests through a | |||
| chain of connections. There are three common forms of HTTP | chain of connections. There are three common forms of HTTP | |||
| intermediary: proxy, gateway, and tunnel. In some cases, a single | intermediary: proxy, gateway, and tunnel. In some cases, a single | |||
| intermediary might act as an origin server, proxy, gateway, or | intermediary might act as an origin server, proxy, gateway, or | |||
| tunnel, switching behavior based on the nature of each request. | tunnel, switching behavior based on the nature of each request. | |||
| > > > > | > > > > | |||
| UA =========== A =========== B =========== C =========== O | UA =========== A =========== B =========== C =========== O | |||
| < < < < | < < < < | |||
| skipping to change at page 16, line 5 ¶ | skipping to change at page 18, line 19 ¶ | |||
| path of connections, often based on dynamic configuration for load | path of connections, often based on dynamic configuration for load | |||
| balancing. | balancing. | |||
| The terms "upstream" and "downstream" are used to describe | The terms "upstream" and "downstream" are used to describe | |||
| directional requirements in relation to the message flow: all | directional requirements in relation to the message flow: all | |||
| messages flow from upstream to downstream. The terms "inbound" and | messages flow from upstream to downstream. The terms "inbound" and | |||
| "outbound" are used to describe directional requirements in relation | "outbound" are used to describe directional requirements in relation | |||
| to the request route: "inbound" means toward the origin server and | to the request route: "inbound" means toward the origin server and | |||
| "outbound" means toward the user agent. | "outbound" means toward the user agent. | |||
| A "proxy" is a message-forwarding agent that is selected by the | A "proxy" is a message-forwarding agent that is chosen by the client, | |||
| client, usually via local configuration rules, to receive requests | usually via local configuration rules, to receive requests for some | |||
| for some type(s) of absolute URI and attempt to satisfy those | type(s) of absolute URI and attempt to satisfy those requests via | |||
| requests via translation through the HTTP interface. Some | translation through the HTTP interface. Some translations are | |||
| translations are minimal, such as for proxy requests for "http" URIs, | minimal, such as for proxy requests for "http" URIs, whereas other | |||
| whereas other requests might require translation to and from entirely | requests might require translation to and from entirely different | |||
| different application-level protocols. Proxies are often used to | application-level protocols. Proxies are often used to group an | |||
| group an organization's HTTP requests through a common intermediary | organization's HTTP requests through a common intermediary for the | |||
| for the sake of security, annotation services, or shared caching. | sake of security, annotation services, or shared caching. Some | |||
| Some proxies are designed to apply transformations to selected | proxies are designed to apply transformations to selected messages or | |||
| messages or payloads while they are being forwarded, as described in | payloads while they are being forwarded, as described in Section 6.5. | |||
| Section 6.6.2. | ||||
| A "gateway" (a.k.a. "reverse proxy") is an intermediary that acts as | A "gateway" (a.k.a. "reverse proxy") is an intermediary that acts as | |||
| an origin server for the outbound connection but translates received | an origin server for the outbound connection but translates received | |||
| requests and forwards them inbound to another server or servers. | requests and forwards them inbound to another server or servers. | |||
| Gateways are often used to encapsulate legacy or untrusted | Gateways are often used to encapsulate legacy or untrusted | |||
| information services, to improve server performance through | information services, to improve server performance through | |||
| "accelerator" caching, and to enable partitioning or load balancing | "accelerator" caching, and to enable partitioning or load balancing | |||
| of HTTP services across multiple machines. | of HTTP services across multiple machines. | |||
| All HTTP requirements applicable to an origin server also apply to | All HTTP requirements applicable to an origin server also apply to | |||
| skipping to change at page 17, line 7 ¶ | skipping to change at page 19, line 19 ¶ | |||
| participants in the HTTP communication. There are also | participants in the HTTP communication. There are also | |||
| intermediaries that can act on lower layers of the network protocol | intermediaries that can act on lower layers of the network protocol | |||
| stack, filtering or redirecting HTTP traffic without the knowledge or | stack, filtering or redirecting HTTP traffic without the knowledge or | |||
| permission of message senders. Network intermediaries are | permission of message senders. Network intermediaries are | |||
| indistinguishable (at a protocol level) from an on-path attacker, | indistinguishable (at a protocol level) from an on-path attacker, | |||
| often introducing security flaws or interoperability problems due to | often introducing security flaws or interoperability problems due to | |||
| mistakenly violating HTTP semantics. | mistakenly violating HTTP semantics. | |||
| For example, an "interception proxy" [RFC3040] (also commonly known | For example, an "interception proxy" [RFC3040] (also commonly known | |||
| as a "transparent proxy" [RFC1919] or "captive portal") differs from | as a "transparent proxy" [RFC1919] or "captive portal") differs from | |||
| an HTTP proxy because it is not selected by the client. Instead, an | an HTTP proxy because it is not chosen by the client. Instead, an | |||
| interception proxy filters or redirects outgoing TCP port 80 packets | interception proxy filters or redirects outgoing TCP port 80 packets | |||
| (and occasionally other common port traffic). Interception proxies | (and occasionally other common port traffic). Interception proxies | |||
| are commonly found on public network access points, as a means of | are commonly found on public network access points, as a means of | |||
| enforcing account subscription prior to allowing use of non-local | enforcing account subscription prior to allowing use of non-local | |||
| Internet services, and within corporate firewalls to enforce network | Internet services, and within corporate firewalls to enforce network | |||
| usage policies. | usage policies. | |||
| HTTP is defined as a stateless protocol, meaning that each request | HTTP is defined as a stateless protocol, meaning that each request | |||
| message can be understood in isolation. Many implementations depend | message can be understood in isolation. Many implementations depend | |||
| on HTTP's stateless design in order to reuse proxied connections or | on HTTP's stateless design in order to reuse proxied connections or | |||
| dynamically load balance requests across multiple servers. Hence, a | dynamically load balance requests across multiple servers. Hence, a | |||
| server MUST NOT assume that two requests on the same connection are | server MUST NOT assume that two requests on the same connection are | |||
| from the same user agent unless the connection is secured and | from the same user agent unless the connection is secured and | |||
| specific to that agent. Some non-standard HTTP extensions (e.g., | specific to that agent. Some non-standard HTTP extensions (e.g., | |||
| [RFC4559]) have been known to violate this requirement, resulting in | [RFC4559]) have been known to violate this requirement, resulting in | |||
| security and interoperability problems. | security and interoperability problems. | |||
| 2.3. Caches | 3.8. Caches | |||
| A "cache" is a local store of previous response messages and the | A "cache" is a local store of previous response messages and the | |||
| subsystem that controls its message storage, retrieval, and deletion. | subsystem that controls its message storage, retrieval, and deletion. | |||
| A cache stores cacheable responses in order to reduce the response | A cache stores cacheable responses in order to reduce the response | |||
| time and network bandwidth consumption on future, equivalent | time and network bandwidth consumption on future, equivalent | |||
| requests. Any client or server MAY employ a cache, though a cache | requests. Any client or server MAY employ a cache, though a cache | |||
| cannot be used by a server while it is acting as a tunnel. | cannot be used by a server while it is acting as a tunnel. | |||
| The effect of a cache is that the request/response chain is shortened | The effect of a cache is that the request/response chain is shortened | |||
| if one of the participants along the chain has a cached response | if one of the participants along the chain has a cached response | |||
| skipping to change at page 18, line 12 ¶ | skipping to change at page 20, line 26 ¶ | |||
| cache behavior and cacheable responses are defined in Section 2 of | cache behavior and cacheable responses are defined in Section 2 of | |||
| [Caching]. | [Caching]. | |||
| There is a wide variety of architectures and configurations of caches | There is a wide variety of architectures and configurations of caches | |||
| deployed across the World Wide Web and inside large organizations. | deployed across the World Wide Web and inside large organizations. | |||
| These include national hierarchies of proxy caches to save | These include national hierarchies of proxy caches to save | |||
| transoceanic bandwidth, collaborative systems that broadcast or | transoceanic bandwidth, collaborative systems that broadcast or | |||
| multicast cache entries, archives of pre-fetched cache entries for | multicast cache entries, archives of pre-fetched cache entries for | |||
| use in off-line or high-latency environments, and so on. | use in off-line or high-latency environments, and so on. | |||
| 2.4. Uniform Resource Identifiers | 4. Identifiers | |||
| Uniform Resource Identifiers (URIs) [RFC3986] are used throughout | Uniform Resource Identifiers (URIs) [RFC3986] are used throughout | |||
| HTTP as the means for identifying resources (Section 2.5). URI | HTTP as the means for identifying resources (Section 3.1). | |||
| references are used to target requests, indicate redirects, and | ||||
| 4.1. URI References | ||||
| URI references are used to target requests, indicate redirects, and | ||||
| define relationships. | define relationships. | |||
| The definitions of "URI-reference", "absolute-URI", "relative-part", | The definitions of "URI-reference", "absolute-URI", "relative-part", | |||
| "authority", "port", "host", "path-abempty", "segment", and "query" | "authority", "port", "host", "path-abempty", "segment", and "query" | |||
| are adopted from the URI generic syntax. An "absolute-path" rule is | are adopted from the URI generic syntax. An "absolute-path" rule is | |||
| defined for protocol elements that can contain a non-empty path | defined for protocol elements that can contain a non-empty path | |||
| component. (This rule differs slightly from the path-abempty rule of | component. (This rule differs slightly from the path-abempty rule of | |||
| RFC 3986, which allows for an empty path to be used in references, | RFC 3986, which allows for an empty path to be used in references, | |||
| and path-absolute rule, which does not allow paths that begin with | and path-absolute rule, which does not allow paths that begin with | |||
| "//".) A "partial-URI" rule is defined for protocol elements that | "//".) A "partial-URI" rule is defined for protocol elements that | |||
| skipping to change at page 19, line 11 ¶ | skipping to change at page 21, line 31 ¶ | |||
| URI), only the path and optional query components, or some | URI), only the path and optional query components, or some | |||
| combination of the above. Unless otherwise indicated, URI references | combination of the above. Unless otherwise indicated, URI references | |||
| are parsed relative to the target URI (Section 6.1). | are parsed relative to the target URI (Section 6.1). | |||
| It is RECOMMENDED that all senders and recipients support, at a | It is RECOMMENDED that all senders and recipients support, at a | |||
| minimum, URIs with lengths of 8000 octets in protocol elements. Note | minimum, URIs with lengths of 8000 octets in protocol elements. Note | |||
| that this implies some structures and on-wire representations (for | that this implies some structures and on-wire representations (for | |||
| example, the request line in HTTP/1.1) will necessarily be larger in | example, the request line in HTTP/1.1) will necessarily be larger in | |||
| some cases. | some cases. | |||
| 2.5. Resources | 4.2. URI Schemes | |||
| The target of an HTTP request is called a "resource". HTTP does not | ||||
| limit the nature of a resource; it merely defines an interface that | ||||
| might be used to interact with resources. Most resources are | ||||
| identified by a Uniform Resource Identifier (URI), as described in | ||||
| Section 2.4. | ||||
| One design goal of HTTP is to separate resource identification from | ||||
| request semantics, which is made possible by vesting the request | ||||
| semantics in the request method (Section 8) and a few request- | ||||
| modifying header fields (Section 9). If there is a conflict between | ||||
| the method semantics and any semantic implied by the URI itself, as | ||||
| described in Section 8.2.1, the method semantics take precedence. | ||||
| IANA maintains the registry of URI Schemes [BCP35] at | IANA maintains the registry of URI Schemes [BCP35] at | |||
| <https://www.iana.org/assignments/uri-schemes/>. Although requests | <https://www.iana.org/assignments/uri-schemes/>. Although requests | |||
| might target any URI scheme, the following schemes are inherent to | might target any URI scheme, the following schemes are inherent to | |||
| HTTP servers: | HTTP servers: | |||
| ------------ ------------------------------------ ------- | ------------ ------------------------------------ ------- | |||
| URI Scheme Description Ref. | URI Scheme Description Ref. | |||
| ------------ ------------------------------------ ------- | ------------ ------------------------------------ ------- | |||
| http Hypertext Transfer Protocol 2.5.1 | http Hypertext Transfer Protocol 4.2.1 | |||
| https Hypertext Transfer Protocol Secure 2.5.2 | https Hypertext Transfer Protocol Secure 4.2.2 | |||
| ------------ ------------------------------------ ------- | ------------ ------------------------------------ ------- | |||
| Table 2 | Table 2 | |||
| Note that the presence of an "http" or "https" URI does not imply | Note that the presence of an "http" or "https" URI does not imply | |||
| that there is always an HTTP server at the identified origin | that there is always an HTTP server at the identified origin | |||
| listening for connections. Anyone can mint a URI, whether or not a | listening for connections. Anyone can mint a URI, whether or not a | |||
| server exists and whether or not that server currently maps that | server exists and whether or not that server currently maps that | |||
| identifier to a resource. The delegated nature of registered names | identifier to a resource. The delegated nature of registered names | |||
| and IP addresses creates a federated namespace whether or not an HTTP | and IP addresses creates a federated namespace whether or not an HTTP | |||
| server is present. | server is present. | |||
| 2.5.1. http URI Scheme | 4.2.1. http URI Scheme | |||
| The "http" URI scheme is hereby defined for minting identifiers | The "http" URI scheme is hereby defined for minting identifiers | |||
| within the hierarchical namespace governed by a potential HTTP origin | within the hierarchical namespace governed by a potential HTTP origin | |||
| server listening for TCP ([RFC0793]) connections on a given port. | server listening for TCP ([RFC0793]) connections on a given port. | |||
| http-URI = "http" "://" authority path-abempty [ "?" query ] | http-URI = "http" "://" authority path-abempty [ "?" query ] | |||
| The origin server for an "http" URI is identified by the authority | The origin server for an "http" URI is identified by the authority | |||
| component, which includes a host identifier and optional port number | component, which includes a host identifier and optional port number | |||
| ([RFC3986], Section 3.2.2). If the port subcomponent is empty or not | ([RFC3986], Section 3.2.2). If the port subcomponent is empty or not | |||
| given, TCP port 80 (the reserved port for WWW services) is the | given, TCP port 80 (the reserved port for WWW services) is the | |||
| default. The origin determines who has the right to respond | default. The origin determines who has the right to respond | |||
| authoritatively to requests that target the identified resource, as | authoritatively to requests that target the identified resource, as | |||
| defined in Section 6.3.3.1. | defined in Section 4.3.2. | |||
| A sender MUST NOT generate an "http" URI with an empty host | A sender MUST NOT generate an "http" URI with an empty host | |||
| identifier. A recipient that processes such a URI reference MUST | identifier. A recipient that processes such a URI reference MUST | |||
| reject it as invalid. | reject it as invalid. | |||
| The hierarchical path component and optional query component identify | The hierarchical path component and optional query component identify | |||
| the target resource within that origin server's name space. | the target resource within that origin server's name space. | |||
| 2.5.2. https URI Scheme | 4.2.2. https URI Scheme | |||
| The "https" URI scheme is hereby defined for minting identifiers | The "https" URI scheme is hereby defined for minting identifiers | |||
| within the hierarchical namespace governed by a potential origin | within the hierarchical namespace governed by a potential origin | |||
| server listening for TCP connections on a given port and capable of | server listening for TCP connections on a given port and capable of | |||
| establishing a TLS ([RFC8446]) connection that has been secured for | establishing a TLS ([RFC8446]) connection that has been secured for | |||
| HTTP communication. In this context, "secured" specifically means | HTTP communication. In this context, "secured" specifically means | |||
| that the server has been authenticated as acting on behalf of the | that the server has been authenticated as acting on behalf of the | |||
| identified authority and all HTTP communication with that server has | identified authority and all HTTP communication with that server has | |||
| been protected for confidentiality and integrity through the use of | been protected for confidentiality and integrity through the use of | |||
| strong encryption. | strong encryption. | |||
| https-URI = "https" "://" authority path-abempty [ "?" query ] | https-URI = "https" "://" authority path-abempty [ "?" query ] | |||
| The origin server for an "https" URI is identified by the authority | The origin server for an "https" URI is identified by the authority | |||
| component, which includes a host identifier and optional port number | component, which includes a host identifier and optional port number | |||
| ([RFC3986], Section 3.2.2). If the port subcomponent is empty or not | ([RFC3986], Section 3.2.2). If the port subcomponent is empty or not | |||
| given, TCP port 443 (the reserved port for HTTP over TLS) is the | given, TCP port 443 (the reserved port for HTTP over TLS) is the | |||
| default. The origin determines who has the right to respond | default. The origin determines who has the right to respond | |||
| authoritatively to requests that target the identified resource, as | authoritatively to requests that target the identified resource, as | |||
| defined in Section 6.3.3.2. | defined in Section 4.3.3. | |||
| A sender MUST NOT generate an "https" URI with an empty host | A sender MUST NOT generate an "https" URI with an empty host | |||
| identifier. A recipient that processes such a URI reference MUST | identifier. A recipient that processes such a URI reference MUST | |||
| reject it as invalid. | reject it as invalid. | |||
| The hierarchical path component and optional query component identify | The hierarchical path component and optional query component identify | |||
| the target resource within that origin server's name space. | the target resource within that origin server's name space. | |||
| A client MUST ensure that its HTTP requests for an "https" resource | A client MUST ensure that its HTTP requests for an "https" resource | |||
| are secured, prior to being communicated, and that it only accepts | are secured, prior to being communicated, and that it only accepts | |||
| secured responses to those requests. | secured responses to those requests. | |||
| Resources made available via the "https" scheme have no shared | Resources made available via the "https" scheme have no shared | |||
| identity with the "http" scheme. They are distinct origins with | identity with the "http" scheme. They are distinct origins with | |||
| separate namespaces. However, an extension to HTTP that is defined | separate namespaces. However, an extension to HTTP that is defined | |||
| to apply to all origins with the same host, such as the Cookie | to apply to all origins with the same host, such as the Cookie | |||
| protocol [RFC6265], can allow information set by one service to | protocol [RFC6265], can allow information set by one service to | |||
| impact communication with other services within a matching group of | impact communication with other services within a matching group of | |||
| host domains. | host domains. | |||
| 2.5.3. http and https URI Normalization and Comparison | 4.2.3. http(s) Normalization and Comparison | |||
| Since the "http" and "https" schemes conform to the URI generic | Since the "http" and "https" schemes conform to the URI generic | |||
| syntax, such URIs are normalized and compared according to the | syntax, such URIs are normalized and compared according to the | |||
| algorithm defined in Section 6 of [RFC3986], using the defaults | algorithm defined in Section 6 of [RFC3986], using the defaults | |||
| described above for each scheme. | described above for each scheme. | |||
| If the port is equal to the default port for a scheme, the normal | If the port is equal to the default port for a scheme, the normal | |||
| form is to omit the port subcomponent. When not being used as the | form is to omit the port subcomponent. When not being used as the | |||
| target of an OPTIONS request, an empty path component is equivalent | target of an OPTIONS request, an empty path component is equivalent | |||
| to an absolute path of "/", so the normal form is to provide a path | to an absolute path of "/", so the normal form is to provide a path | |||
| skipping to change at page 21, line 41 ¶ | skipping to change at page 24, line 5 ¶ | |||
| "reserved" set are equivalent to their percent-encoded octets: the | "reserved" set are equivalent to their percent-encoded octets: the | |||
| normal form is to not encode them (see Sections 2.1 and 2.2 of | normal form is to not encode them (see Sections 2.1 and 2.2 of | |||
| [RFC3986]). | [RFC3986]). | |||
| For example, the following three URIs are equivalent: | For example, the following three URIs are equivalent: | |||
| http://example.com:80/~smith/home.html | http://example.com:80/~smith/home.html | |||
| http://EXAMPLE.com/%7Esmith/home.html | http://EXAMPLE.com/%7Esmith/home.html | |||
| http://EXAMPLE.com:/%7esmith/home.html | http://EXAMPLE.com:/%7esmith/home.html | |||
| 2.5.4. Deprecated userinfo | 4.2.4. http(s) Deprecated userinfo | |||
| The URI generic syntax for authority also includes a userinfo | The URI generic syntax for authority also includes a userinfo | |||
| subcomponent ([RFC3986], Section 3.2.1) for including user | subcomponent ([RFC3986], Section 3.2.1) for including user | |||
| authentication information in the URI. In that subcomponent, the use | authentication information in the URI. In that subcomponent, the use | |||
| of the format "user:password" is deprecated. | of the format "user:password" is deprecated. | |||
| Some implementations make use of the userinfo component for internal | Some implementations make use of the userinfo component for internal | |||
| configuration of authentication information, such as within command | configuration of authentication information, such as within command | |||
| invocation options, configuration files, or bookmark lists, even | invocation options, configuration files, or bookmark lists, even | |||
| though such usage might expose a user identifier or password. | though such usage might expose a user identifier or password. | |||
| A sender MUST NOT generate the userinfo subcomponent (and its "@" | A sender MUST NOT generate the userinfo subcomponent (and its "@" | |||
| delimiter) when an "http" or "https" URI reference is generated | delimiter) when an "http" or "https" URI reference is generated | |||
| within a message as a target URI or field value. | within a message as a target URI or field value. | |||
| Before making use of an "http" or "https" URI reference received from | Before making use of an "http" or "https" URI reference received from | |||
| an untrusted source, a recipient SHOULD parse for userinfo and treat | an untrusted source, a recipient SHOULD parse for userinfo and treat | |||
| its presence as an error; it is likely being used to obscure the | its presence as an error; it is likely being used to obscure the | |||
| authority for the sake of phishing attacks. | authority for the sake of phishing attacks. | |||
| 2.5.5. Fragment Identifiers on http(s) URI References | 4.2.5. http(s) References with Fragment Identifiers | |||
| Fragment identifiers allow for indirect identification of a secondary | Fragment identifiers allow for indirect identification of a secondary | |||
| resource, independent of the URI scheme, as defined in Section 3.5 of | resource, independent of the URI scheme, as defined in Section 3.5 of | |||
| [RFC3986]. Some protocol elements that refer to a URI allow | [RFC3986]. Some protocol elements that refer to a URI allow | |||
| inclusion of a fragment, while others do not. They are distinguished | inclusion of a fragment, while others do not. They are distinguished | |||
| by use of the ABNF rule for elements where fragment is allowed; | by use of the ABNF rule for elements where fragment is allowed; | |||
| otherwise, a specific rule that excludes fragments is used (see | otherwise, a specific rule that excludes fragments is used (see | |||
| Section 6.1). | Section 6.1). | |||
| | *Note:* the fragment identifier component is not part of the | | *Note:* the fragment identifier component is not part of the | |||
| | actual scheme definition for a URI scheme (see Section 4.3 of | | actual scheme definition for a URI scheme (see Section 4.3 of | |||
| | [RFC3986]), thus does not appear in the ABNF definitions for | | [RFC3986]), thus does not appear in the ABNF definitions for | |||
| | the "http" and "https" URI schemes above. | | the "http" and "https" URI schemes above. | |||
| 3. Conformance | 4.3. Authoritative Access | |||
| 3.1. Implementation Diversity | See Section 16.1 for security considerations related to establishing | |||
| authority. | ||||
| When considering the design of HTTP, it is easy to fall into a trap | 4.3.1. URI Origin | |||
| of thinking that all user agents are general-purpose browsers and all | ||||
| origin servers are large public websites. That is not the case in | ||||
| practice. Common HTTP user agents include household appliances, | ||||
| stereos, scales, firmware update scripts, command-line programs, | ||||
| mobile apps, and communication devices in a multitude of shapes and | ||||
| sizes. Likewise, common HTTP origin servers include home automation | ||||
| units, configurable networking components, office machines, | ||||
| autonomous robots, news feeds, traffic cameras, ad selectors, and | ||||
| video-delivery platforms. | ||||
| The term "user agent" does not imply that there is a human user | The "origin" for a given URI is the triple of scheme, host, and port | |||
| directly interacting with the software agent at the time of a | after normalizing the scheme and host to lowercase and normalizing | |||
| request. In many cases, a user agent is installed or configured to | the port to remove any leading zeros. If port is elided from the | |||
| run in the background and save its results for later inspection (or | URI, the default port for that scheme is used. For example, the URI | |||
| save only a subset of those results that might be interesting or | https://Example.Com/happy.js | |||
| erroneous). Spiders, for example, are typically given a start URI | ||||
| and configured to follow certain behavior while crawling the Web as a | ||||
| hypertext graph. | ||||
| The implementation diversity of HTTP means that not all user agents | would have the origin | |||
| can make interactive suggestions to their user or provide adequate | ||||
| warning for security or privacy concerns. In the few cases where | ||||
| this specification requires reporting of errors to the user, it is | ||||
| acceptable for such reporting to only be observable in an error | ||||
| console or log file. Likewise, requirements that an automated action | ||||
| be confirmed by the user before proceeding might be met via advance | ||||
| configuration choices, run-time options, or simple avoidance of the | ||||
| unsafe action; confirmation does not imply any specific user | ||||
| interface or interruption of normal processing if the user has | ||||
| already made that choice. | ||||
| 3.2. Role-based Requirements | { "https", "example.com", "443" } | |||
| This specification targets conformance criteria according to the role | which can also be described as the normalized URI prefix with port | |||
| of a participant in HTTP communication. Hence, HTTP requirements are | always present: | |||
| placed on senders, recipients, clients, servers, user agents, | ||||
| intermediaries, origin servers, proxies, gateways, or caches, | ||||
| depending on what behavior is being constrained by the requirement. | ||||
| Additional (social) requirements are placed on implementations, | ||||
| resource owners, and protocol element registrations when they apply | ||||
| beyond the scope of a single communication. | ||||
| The verb "generate" is used instead of "send" where a requirement | https://example.com:443 | |||
| differentiates between creating a protocol element and merely | ||||
| forwarding a received element downstream. | ||||
| An implementation is considered conformant if it complies with all of | Each origin defines its own namespace and controls how identifiers | |||
| the requirements associated with the roles it partakes in HTTP. | within that namespace are mapped to resources. In turn, how the | |||
| origin responds to valid requests, consistently over time, determines | ||||
| the semantics that users will associate with a URI, and the | ||||
| usefulness of those semantics is what ultimately transforms these | ||||
| mechanisms into a "resource" for users to reference and access in the | ||||
| future. | ||||
| Conformance includes both the syntax and semantics of protocol | Two origins are distinct if they differ in scheme, host, or port. | |||
| elements. A sender MUST NOT generate protocol elements that convey a | Even when it can be verified that the same entity controls two | |||
| meaning that is known by that sender to be false. A sender MUST NOT | distinct origins, the two namespaces under those origins are distinct | |||
| generate protocol elements that do not match the grammar defined by | unless explicitly aliased by a server authoritative for that origin. | |||
| the corresponding ABNF rules. Within a given message, a sender MUST | ||||
| NOT generate protocol elements or syntax alternatives that are only | ||||
| allowed to be generated by participants in other roles (i.e., a role | ||||
| that the sender does not have for that message). | ||||
| 3.3. Parsing Elements | Origin is also used within HTML and related Web protocols, beyond the | |||
| scope of this document, as described in [RFC6454]. | ||||
| When a received protocol element is parsed, the recipient MUST be | 4.3.2. http origins | |||
| able to parse any value of reasonable length that is applicable to | ||||
| the recipient's role and that matches the grammar defined by the | ||||
| corresponding ABNF rules. Note, however, that some received protocol | ||||
| elements might not be parsed. For example, an intermediary | ||||
| forwarding a message might parse a field into generic field name and | ||||
| field value components, but then forward the field without further | ||||
| parsing inside the field value. | ||||
| HTTP does not have specific length limitations for many of its | Although HTTP is independent of the transport protocol, the "http" | |||
| protocol elements because the lengths that might be appropriate will | scheme (Section 4.2.1) is specific to associating authority with | |||
| vary widely, depending on the deployment context and purpose of the | whomever controls the origin server listening for TCP connections on | |||
| implementation. Hence, interoperability between senders and | the indicated port of whatever host is identified within the | |||
| recipients depends on shared expectations regarding what is a | authority component. This is a very weak sense of authority because | |||
| reasonable length for each protocol element. Furthermore, what is | it depends on both client-specific name resolution mechanisms and | |||
| commonly understood to be a reasonable length for some protocol | communication that might not be secured from an on-path attacker. | |||
| elements has changed over the course of the past two decades of HTTP | Nevertheless, it is a sufficient minimum for binding "http" | |||
| use and is expected to continue changing in the future. | identifiers to an origin server for consistent resolution within a | |||
| trusted environment. | ||||
| At a minimum, a recipient MUST be able to parse and process protocol | If the host identifier is provided as an IP address, the origin | |||
| element lengths that are at least as long as the values that it | server is the listener (if any) on the indicated TCP port at that IP | |||
| generates for those same protocol elements in other messages. For | address. If host is a registered name, the registered name is an | |||
| example, an origin server that publishes very long URI references to | indirect identifier for use with a name resolution service, such as | |||
| its own resources needs to be able to parse and process those same | DNS, to find an address for an appropriate origin server. | |||
| references when received as a target URI. | ||||
| 3.4. Error Handling | When an "http" URI is used within a context that calls for access to | |||
| the indicated resource, a client MAY attempt access by resolving the | ||||
| host identifier to an IP address, establishing a TCP connection to | ||||
| that address on the indicated port, and sending an HTTP request | ||||
| message to the server containing the URI's identifying data. | ||||
| A recipient MUST interpret a received protocol element according to | If the server responds to such a request with a non-interim HTTP | |||
| the semantics defined for it by this specification, including | response message, as described in Section 14, then that response is | |||
| extensions to this specification, unless the recipient has determined | considered an authoritative answer to the client's request. | |||
| (through experience or configuration) that the sender incorrectly | ||||
| implements what is implied by those semantics. For example, an | ||||
| origin server might disregard the contents of a received | ||||
| Accept-Encoding header field if inspection of the User-Agent header | ||||
| field indicates a specific implementation version that is known to | ||||
| fail on receipt of certain content codings. | ||||
| Unless noted otherwise, a recipient MAY attempt to recover a usable | Note, however, that the above is not the only means for obtaining an | |||
| protocol element from an invalid construct. HTTP does not define | authoritative response, nor does it imply that an authoritative | |||
| specific error handling mechanisms except when they have a direct | response is always necessary (see [Caching]). For example, the Alt- | |||
| impact on security, since different applications of the protocol | Svc header field [RFC7838] allows an origin server to identify other | |||
| require different error handling strategies. For example, a Web | services that are also authoritative for that origin. Access to | |||
| browser might wish to transparently recover from a response where the | "http" identified resources might also be provided by protocols | |||
| Location header field doesn't parse according to the ABNF, whereas a | outside the scope of this document. | |||
| systems control client might consider any form of error recovery to | ||||
| be dangerous. | ||||
| Some requests can be automatically retried by a client in the event | 4.3.3. https origins | |||
| of an underlying connection failure, as described in Section 8.2.2. | ||||
| 4. Extending and Versioning HTTP | The "https" scheme (Section 4.2.2) associates authority based on the | |||
| ability of a server to use the private key corresponding to a | ||||
| certificate that the client considers to be trustworthy for the | ||||
| identified origin server. The client usually relies upon a chain of | ||||
| trust, conveyed from some prearranged or configured trust anchor, to | ||||
| deem a certificate trustworthy (Section 4.3.4). | ||||
| While HTTP's core semantics don't change between protocol versions, | In HTTP/1.1 and earlier, a client will only attribute authority to a | |||
| the expression of them "on the wire" can change, and so the HTTP | server when they are communicating over a successfully established | |||
| version number changes when incompatible changes are made to the wire | and secured connection specifically to that URI origin's host. The | |||
| format. Additionally, HTTP allows incremental, backwards-compatible | connection establishment and certificate verification are used as | |||
| changes to be made to the protocol without changing its version | proof of authority. | |||
| through the use of defined extension points. | ||||
| 4.1. Extending HTTP | In HTTP/2 and HTTP/3, a client will attribute authority to a server | |||
| when they are communicating over a successfully established and | ||||
| secured connection if the URI origin's host matches any of the hosts | ||||
| present in the server's certificate and the client believes that it | ||||
| could open a connection to that host for that URI. In practice, a | ||||
| client will make a DNS query to check that the origin's host contains | ||||
| the same server IP address as the established connection. This | ||||
| restriction can be removed by the origin server sending an equivalent | ||||
| ORIGIN frame [RFC8336]. | ||||
| HTTP defines a number of generic extension points that can be used to | The request target's host and port value are passed within each HTTP | |||
| introduce capabilities to the protocol without introducing a new | request, identifying the origin and distinguishing it from other | |||
| version, including methods (Section 8.4), status codes | namespaces that might be controlled by the same server. It is the | |||
| (Section 10.7), header and trailer fields (Section 5.7), and further | origin's responsibility to ensure that any services provided with | |||
| extensibility points within defined fields (such as Cache-Control in | control over its certificate's private key are equally responsible | |||
| Section 5.2.3 of [Caching]). Because the semantics of HTTP are not | for managing the corresponding "https" namespaces, or at least | |||
| versioned, these extension points are persistent; the version of the | prepared to reject requests that appear to have been misdirected. A | |||
| protocol in use does not affect their semantics. | server might be unwilling to serve as the origin for some hosts even | |||
| when they have the authority to do so. | ||||
| Version-independent extensions are discouraged from depending on or | For example, if a network attacker causes connections for port N to | |||
| interacting with the specific version of the protocol in use. When | be received at port Q, checking the target URI is necessary to ensure | |||
| this is unavoidable, careful consideration needs to be given to how | that the attacker can't cause "https://example.com:N/foo" to be | |||
| the extension can interoperate across versions. | replaced by "https://example.com:Q/foo" without consent. | |||
| Additionally, specific versions of HTTP might have their own | Note that the "https" scheme does not rely on TCP and the connected | |||
| extensibility points, such as transfer-codings in HTTP/1.1 | port number for associating authority, since both are outside the | |||
| (Section 6.1 of [Messaging]) and HTTP/2 ([RFC7540]) SETTINGS or frame | secured communication and thus cannot be trusted as definitive. | |||
| types. These extension points are specific to the version of the | Hence, the HTTP communication might take place over any channel that | |||
| protocol they occur within. | has been secured, as defined in Section 4.2.2, including protocols | |||
| that don't use TCP. | ||||
| Version-specific extensions cannot override or modify the semantics | When an "https" URI is used within a context that calls for access to | |||
| of a version-independent mechanism or extension point (like a method | the indicated resource, a client MAY attempt access by resolving the | |||
| or header field) without explicitly being allowed by that protocol | host identifier to an IP address, establishing a TCP connection to | |||
| element. For example, the CONNECT method (Section 8.3.6) allows | that address on the indicated port, securing the connection end-to- | |||
| this. | end by successfully initiating TLS over TCP with confidentiality and | |||
| integrity protection, and sending an HTTP request message over that | ||||
| connection containing the URI's identifying data. | ||||
| These guidelines assure that the protocol operates correctly and | If the server responds to such a request with a non-interim HTTP | |||
| predictably, even when parts of the path implement different versions | response message, as described in Section 14, then that response is | |||
| of HTTP. | considered an authoritative answer to the client's request. | |||
| 4.2. Protocol Versioning | Note, however, that the above is not the only means for obtaining an | |||
| authoritative response, nor does it imply that an authoritative | ||||
| response is always necessary (see [Caching]). | ||||
| The HTTP version number consists of two decimal digits separated by a | 4.3.4. https certificate verification | |||
| "." (period or decimal point). The first digit ("major version") | ||||
| indicates the HTTP messaging syntax, whereas the second digit ("minor | To establish a secured connection to dereference a URI, a client MUST | |||
| version") indicates the highest minor version within that major | verify that the service's identity is an acceptable match for the | |||
| version to which the sender is conformant and able to understand for | URI's origin server. Certificate verification is used to prevent | |||
| future communication. | server impersonation by an on-path attacker or by an attacker that | |||
| controls name resolution. This process requires that a client be | ||||
| configured with a set of trust anchors. | ||||
| In general, a client MUST verify the service identity using the | ||||
| verification process defined in Section 6 of [RFC6125] (for a | ||||
| reference identifier of type URI-ID) unless the client has been | ||||
| specifically configured to accept some other form of verification. | ||||
| For example, a client might be connecting to a server whose address | ||||
| and hostname are dynamic, with an expectation that the service will | ||||
| present a specific certificate (or a certificate matching some | ||||
| externally defined reference identity) rather than one matching the | ||||
| dynamic URI's origin server identifier. | ||||
| In special cases, it might be appropriate for a client to simply | ||||
| ignore the server's identity, but it must be understood that this | ||||
| leaves a connection open to active attack. | ||||
| If the certificate is not valid for the URI's origin server, a user | ||||
| agent MUST either notify the user (user agents MAY give the user an | ||||
| option to continue with the connection in any case) or terminate the | ||||
| connection with a bad certificate error. Automated clients MUST log | ||||
| the error to an appropriate audit log (if available) and SHOULD | ||||
| terminate the connection (with a bad certificate error). Automated | ||||
| clients MAY provide a configuration setting that disables this check, | ||||
| but MUST provide a setting which enables it. | ||||
| 5. Message Abstraction | ||||
| Each major version of HTTP defines its own syntax for the | ||||
| communication of messages. However, they share a common data | ||||
| abstraction. | ||||
| A message consists of control data to describe and route the message, | ||||
| optional header fields that modify or extend the message semantics, | ||||
| describe the sender, the payload, or provide additional context, a | ||||
| potentially unbounded stream of payload data, and optional trailer | ||||
| fields for metadata collected while sending the payload. | ||||
| Messages are intended to be self-descriptive. This means that | ||||
| everything a recipient needs to know about the message can be | ||||
| determined by looking at the message itself, after decoding or | ||||
| reconstituting parts that have been compressed or elided in transit, | ||||
| without requiring an understanding of the sender's current | ||||
| application state (established via prior messages). | ||||
| 5.1. Protocol Version | ||||
| While HTTP's core semantics don't change between protocol versions, | ||||
| the expression of them "on the wire" can change, and so the HTTP | ||||
| version number changes when incompatible changes are made to the wire | ||||
| format. Additionally, HTTP allows incremental, backwards-compatible | ||||
| changes to be made to the protocol without changing its version | ||||
| through the use of defined extension points (Section 15). | ||||
| The protocol version as a whole indicates the sender's conformance | The protocol version as a whole indicates the sender's conformance | |||
| with the set of requirements laid out in that version's corresponding | with the set of requirements laid out in that version's corresponding | |||
| specification of HTTP. For example, the version "HTTP/1.1" is | specification of HTTP. For example, the version "HTTP/1.1" is | |||
| defined by the combined specifications of this document, "HTTP | defined by the combined specifications of this document, "HTTP | |||
| Caching" [Caching], and "HTTP/1.1 Messaging" [Messaging]. | Caching" [Caching], and "HTTP/1.1 Messaging" [Messaging]. | |||
| HTTP's major version number is incremented when an incompatible | ||||
| message syntax is introduced. The minor number is incremented when | ||||
| changes made to the protocol have the effect of adding to the message | ||||
| semantics or implying additional capabilities of the sender. | ||||
| The minor version advertises the sender's communication capabilities | The minor version advertises the sender's communication capabilities | |||
| even when the sender is only using a backwards-compatible subset of | even when the sender is only using a backwards-compatible subset of | |||
| the protocol, thereby letting the recipient know that more advanced | the protocol, thereby letting the recipient know that more advanced | |||
| features can be used in response (by servers) or in future requests | features can be used in response (by servers) or in future requests | |||
| (by clients). | (by clients). | |||
| A client SHOULD send a request version equal to the highest version | A client SHOULD send a request version equal to the highest version | |||
| to which the client is conformant and whose major version is no | to which the client is conformant and whose major version is no | |||
| higher than the highest version supported by the server, if this is | higher than the highest version supported by the server, if this is | |||
| known. A client MUST NOT send a version to which it is not | known. A client MUST NOT send a version to which it is not | |||
| skipping to change at page 27, line 12 ¶ | skipping to change at page 29, line 41 ¶ | |||
| from the response status code or header fields (e.g., Server) that | from the response status code or header fields (e.g., Server) that | |||
| the server improperly handles higher request versions. | the server improperly handles higher request versions. | |||
| A server SHOULD send a response version equal to the highest version | A server SHOULD send a response version equal to the highest version | |||
| to which the server is conformant that has a major version less than | to which the server is conformant that has a major version less than | |||
| or equal to the one received in the request. A server MUST NOT send | or equal to the one received in the request. A server MUST NOT send | |||
| a version to which it is not conformant. A server can send a 505 | a version to which it is not conformant. A server can send a 505 | |||
| (HTTP Version Not Supported) response if it wishes, for any reason, | (HTTP Version Not Supported) response if it wishes, for any reason, | |||
| to refuse service of the client's major protocol version. | to refuse service of the client's major protocol version. | |||
| HTTP's major version number is incremented when an incompatible | ||||
| message syntax is introduced. The minor number is incremented when | ||||
| changes made to the protocol have the effect of adding to the message | ||||
| semantics or implying additional capabilities of the sender. | ||||
| When an HTTP message is received with a major version number that the | When an HTTP message is received with a major version number that the | |||
| recipient implements, but a higher minor version number than what the | recipient implements, but a higher minor version number than what the | |||
| recipient implements, the recipient SHOULD process the message as if | recipient implements, the recipient SHOULD process the message as if | |||
| it were in the highest minor version within that major version to | it were in the highest minor version within that major version to | |||
| which the recipient is conformant. A recipient can assume that a | which the recipient is conformant. A recipient can assume that a | |||
| message with a higher minor version, when sent to a recipient that | message with a higher minor version, when sent to a recipient that | |||
| has not yet indicated support for that higher version, is | has not yet indicated support for that higher version, is | |||
| sufficiently backwards-compatible to be safely processed by any | sufficiently backwards-compatible to be safely processed by any | |||
| implementation of the same major version. | implementation of the same major version. | |||
| When a major version of HTTP does not define any minor versions, the | When a major version of HTTP does not define any minor versions, the | |||
| minor version "0" is implied and is used when referring to that | minor version "0" is implied and is used when referring to that | |||
| protocol within a protocol element that requires sending a minor | protocol within a protocol element that requires sending a minor | |||
| version. | version. | |||
| 5. Header and Trailer Fields | 5.2. Framing | |||
| // Message framing defines how each message begins and ends, such | ||||
| // that the message can be distinguished from other message (or | ||||
| // noise) on the same connection. Framing is specific to each major | ||||
| // version of HTTP. | ||||
| One of the functions of message framing is to assure that messages | ||||
| are complete. A message is considered complete when all of the | ||||
| octets indicated by its framing are available. Note that, when no | ||||
| explicit framing is used, a response message that is ended by the | ||||
| transport connection's close is considered complete even though it | ||||
| might be indistinguishable from an incomplete response, unless a | ||||
| transport-level error indicates that it is not complete. | ||||
| 5.3. Control Data | ||||
| 5.3.1. Request | ||||
| HTTP communication is initiated by a user agent for some purpose. | ||||
| The purpose is a combination of request semantics and a target | ||||
| resource upon which to apply those semantics. | ||||
| 5.3.2. Response | ||||
| 5.4. Header Fields | ||||
| HTTP messages use key/value pairs to convey data about the message, | HTTP messages use key/value pairs to convey data about the message, | |||
| its payload, the target resource, or the connection. They are called | its payload, the target resource, or the connection. They are called | |||
| "HTTP fields" or just "fields". | "HTTP fields" or just "fields". | |||
| Fields that are sent/received before the message body are referred to | Fields that are sent/received before the message body are referred to | |||
| as "header fields" (or just "headers", colloquially) and are located | as "header fields" (or just "headers", colloquially) and are located | |||
| within the "header section" of a message. We refer to some named | within the "header section" of a message. We refer to some named | |||
| fields specifically as a "header field" when they are only allowed to | fields specifically as a "header field" when they are only allowed to | |||
| be sent in the header section. | be sent in the header section. | |||
| Fields that are sent/received after the header section has ended | Fields that are sent/received after the header section has ended | |||
| (usually after the message body begins to stream) are referred to as | (usually after the message body begins to stream) are referred to as | |||
| "trailer fields" (or just "trailers", colloquially) and located | "trailer fields" (or just "trailers", colloquially) and located | |||
| within a "trailer section". One or more trailer sections are only | within a "trailer section". One or more trailer sections are only | |||
| possible when supported by the version of HTTP in use and enabled by | possible when supported by the version of HTTP in use and enabled by | |||
| an extensible mechanism for framing message sections. | an extensible mechanism for framing message sections. | |||
| Both sections are composed of any number of "field lines", each with | Both sections are composed of any number of "field lines", each with | |||
| a "field name" (see Section 5.3) identifying the field, and a "field | a "field name" (see Section 5.4.3) identifying the field, and a | |||
| line value" that conveys data for the field. | "field line value" that conveys data for the field. | |||
| Each field name present in a section has a corresponding "field | Each field name present in a section has a corresponding "field | |||
| value" for that section, composed from all field line values with | value" for that section, composed from all field line values with | |||
| that given field name in that section, concatenated together and | that given field name in that section, concatenated together and | |||
| separated with commas. See Section 5.1 for further discussion of the | separated with commas. See Section 5.4.1 for further discussion of | |||
| semantics of field ordering and combination in messages, and | the semantics of field ordering and combination in messages, and | |||
| Section 5.4 for more discussion of field values. | Section 5.4.4 for more discussion of field values. | |||
| For example, this section: | For example, this section: | |||
| Example-Field: Foo, Bar | Example-Field: Foo, Bar | |||
| Example-Field: Baz | Example-Field: Baz | |||
| contains two field lines, both with the field name "Example-Field". | contains two field lines, both with the field name "Example-Field". | |||
| The first field line has a field line value of "Foo, Bar", while the | The first field line has a field line value of "Foo, Bar", while the | |||
| second field line value is "Baz". The field value for "Example- | second field line value is "Baz". The field value for "Example- | |||
| Field" is a list with three members: "Foo", "Bar", and "Baz". | Field" is a list with three members: "Foo", "Bar", and "Baz". | |||
| skipping to change at page 28, line 36 ¶ | skipping to change at page 31, line 43 ¶ | |||
| The interpretation of a field does not change between minor versions | The interpretation of a field does not change between minor versions | |||
| of the same major HTTP version, though the default behavior of a | of the same major HTTP version, though the default behavior of a | |||
| recipient in the absence of such a field can change. Unless | recipient in the absence of such a field can change. Unless | |||
| specified otherwise, fields are defined for all versions of HTTP. In | specified otherwise, fields are defined for all versions of HTTP. In | |||
| particular, the Host and Connection fields ought to be implemented by | particular, the Host and Connection fields ought to be implemented by | |||
| all HTTP/1.x implementations whether or not they advertise | all HTTP/1.x implementations whether or not they advertise | |||
| conformance with HTTP/1.1. | conformance with HTTP/1.1. | |||
| New fields can be introduced without changing the protocol version if | New fields can be introduced without changing the protocol version if | |||
| their defined semantics allow them to be safely ignored by recipients | their defined semantics allow them to be safely ignored by recipients | |||
| that do not recognize them; see Section 5.3.1. | that do not recognize them; see Section 15.3. | |||
| 5.1. Field Ordering and Combination | A proxy MUST forward unrecognized header fields unless the field name | |||
| is listed in the Connection header field (Section 6.4.1) or the proxy | ||||
| is specifically configured to block, or otherwise transform, such | ||||
| fields. Other recipients SHOULD ignore unrecognized header and | ||||
| trailer fields. These requirements allow HTTP's functionality to be | ||||
| enhanced without requiring prior update of deployed intermediaries. | ||||
| 5.4.1. Field Ordering and Combination | ||||
| The order in which field lines with differing names are received in a | The order in which field lines with differing names are received in a | |||
| message is not significant. However, it is good practice to send | message is not significant. However, it is good practice to send | |||
| header fields that contain control data first, such as Host on | header fields that contain control data first, such as Host on | |||
| requests and Date on responses, so that implementations can decide | requests and Date on responses, so that implementations can decide | |||
| when not to handle a message as early as possible. A server MUST NOT | when not to handle a message as early as possible. A server MUST NOT | |||
| apply a request to the target resource until the entire request | apply a request to the target resource until the entire request | |||
| header section is received, since later header field lines might | header section is received, since later header field lines might | |||
| include conditionals, authentication credentials, or deliberately | include conditionals, authentication credentials, or deliberately | |||
| misleading duplicate header fields that would impact request | misleading duplicate header fields that would impact request | |||
| skipping to change at page 29, line 23 ¶ | skipping to change at page 32, line 36 ¶ | |||
| proxy MUST NOT change the order of these field line values when | proxy MUST NOT change the order of these field line values when | |||
| forwarding a message. | forwarding a message. | |||
| This means that, aside from the well-known exception noted below, a | This means that, aside from the well-known exception noted below, a | |||
| sender MUST NOT generate multiple field lines with the same name in a | sender MUST NOT generate multiple field lines with the same name in a | |||
| message (whether in the headers or trailers), or append a field line | message (whether in the headers or trailers), or append a field line | |||
| when a field line of the same name already exists in the message, | when a field line of the same name already exists in the message, | |||
| unless that field's definition allows multiple field line values to | unless that field's definition allows multiple field line values to | |||
| be recombined as a comma-separated list [i.e., at least one | be recombined as a comma-separated list [i.e., at least one | |||
| alternative of the field's definition allows a comma-separated list, | alternative of the field's definition allows a comma-separated list, | |||
| such as an ABNF rule of #(values) defined in Section 5.5]. | such as an ABNF rule of #(values) defined in Section 5.7.1]. | |||
| | *Note:* In practice, the "Set-Cookie" header field ([RFC6265]) | | *Note:* In practice, the "Set-Cookie" header field ([RFC6265]) | |||
| | often appears in a response message across multiple field lines | | often appears in a response message across multiple field lines | |||
| | and does not use the list syntax, violating the above | | and does not use the list syntax, violating the above | |||
| | requirements on multiple field lines with the same field name. | | requirements on multiple field lines with the same field name. | |||
| | Since it cannot be combined into a single field value, | | Since it cannot be combined into a single field value, | |||
| | recipients ought to handle "Set-Cookie" as a special case while | | recipients ought to handle "Set-Cookie" as a special case while | |||
| | processing fields. (See Appendix A.2.3 of [Kri2001] for | | processing fields. (See Appendix A.2.3 of [Kri2001] for | |||
| | details.) | | details.) | |||
| 5.2. Field Limits | 5.4.2. Field Limits | |||
| HTTP does not place a predefined limit on the length of each field | HTTP does not place a predefined limit on the length of each field | |||
| line, field value, or on the length of a header or trailer section as | line, field value, or on the length of a header or trailer section as | |||
| a whole, as described in Section 3. Various ad hoc limitations on | a whole, as described in Section 2. Various ad hoc limitations on | |||
| individual lengths are found in practice, often depending on the | individual lengths are found in practice, often depending on the | |||
| specific field's semantics. | specific field's semantics. | |||
| A server that receives a request header field line, field value, or | A server that receives a request header field line, field value, or | |||
| set of fields larger than it wishes to process MUST respond with an | set of fields larger than it wishes to process MUST respond with an | |||
| appropriate 4xx (Client Error) status code. Ignoring such header | appropriate 4xx (Client Error) status code. Ignoring such header | |||
| fields would increase the server's vulnerability to request smuggling | fields would increase the server's vulnerability to request smuggling | |||
| attacks (Section 11.2 of [Messaging]). | attacks (Section 11.2 of [Messaging]). | |||
| A client MAY discard or truncate received field lines that are larger | A client MAY discard or truncate received field lines that are larger | |||
| than the client wishes to process if the field semantics are such | than the client wishes to process if the field semantics are such | |||
| that the dropped value(s) can be safely ignored without changing the | that the dropped value(s) can be safely ignored without changing the | |||
| message framing or response semantics. | message framing or response semantics. | |||
| 5.3. Field Names | 5.4.3. Field Names | |||
| The field-name token labels the corresponding field value as having | The field-name token labels the corresponding field value as having | |||
| the semantics defined by that field. For example, the Date header | the semantics defined by that field. For example, the Date header | |||
| field is defined in Section 11.1.1 as containing the origination | field is defined in Section 9.2.2 as containing the origination | |||
| timestamp for the message in which it appears. | timestamp for the message in which it appears. | |||
| field-name = token | field-name = token | |||
| Field names are case-insensitive and ought to be registered within | Field names are case-insensitive and ought to be registered within | |||
| the "Hypertext Transfer Protocol (HTTP) Field Name Registry"; see | the "Hypertext Transfer Protocol (HTTP) Field Name Registry"; see | |||
| Section 5.3.2. | Section 15.3.1. | |||
| Authors of specifications defining new fields are advised to choose a | ||||
| short but descriptive field name. Short names avoid needless data | ||||
| transmission; descriptive names avoid confusion and "squatting" on | ||||
| names that might have broader uses. | ||||
| To that end, limited-use fields (such as a header confined to a | ||||
| single application or use case) are encouraged to use a name that | ||||
| includes its name (or an abbreviation) as a prefix; for example, if | ||||
| the Foo Application needs a Description field, it might use "Foo- | ||||
| Desc"; "Description" is too generic, and "Foo-Description" is | ||||
| needlessly long. | ||||
| While the field-name syntax is defined to allow any token character, | ||||
| in practice some implementations place limits on the characters they | ||||
| accept in field-names. To be interoperable, new field names SHOULD | ||||
| constrain themselves to alphanumeric characters, "-", and ".", and | ||||
| SHOULD begin with an alphanumeric character. | ||||
| Field names ought not be prefixed with "X-"; see [BCP178] for further | ||||
| information. | ||||
| Other prefixes are sometimes used in HTTP field names; for example, | ||||
| "Accept-" is used in many content negotiation headers. These | ||||
| prefixes are only an aid to recognizing the purpose of a field, and | ||||
| do not trigger automatic processing. | ||||
| 5.3.1. Field Extensibility | ||||
| There is no limit on the introduction of new field names, each | ||||
| presumably defining new semantics. | ||||
| New fields can be defined such that, when they are understood by a | ||||
| recipient, they might override or enhance the interpretation of | ||||
| previously defined fields, define preconditions on request | ||||
| evaluation, or refine the meaning of responses. | ||||
| A proxy MUST forward unrecognized header fields unless the field name | ||||
| is listed in the Connection header field (Section 6.8) or the proxy | ||||
| is specifically configured to block, or otherwise transform, such | ||||
| fields. Other recipients SHOULD ignore unrecognized header and | ||||
| trailer fields. These requirements allow HTTP's functionality to be | ||||
| enhanced without requiring prior update of deployed intermediaries. | ||||
| 5.3.2. Field Name Registry | ||||
| The "Hypertext Transfer Protocol (HTTP) Field Name Registry" defines | ||||
| the namespace for HTTP field names. | ||||
| Any party can request registration of a HTTP field. See Section 5.7 | ||||
| for considerations to take into account when creating a new HTTP | ||||
| field. | ||||
| The "Hypertext Transfer Protocol (HTTP) Field Name Registry" is | ||||
| located at <https://www.iana.org/assignments/http-fields/>. | ||||
| Registration requests can be made by following the instructions | ||||
| located there or by sending an email to the "ietf-http-wg@ietf.org" | ||||
| mailing list. | ||||
| Field names are registered on the advice of a Designated Expert | ||||
| (appointed by the IESG or their delegate). Fields with the status | ||||
| 'permanent' are Specification Required ([RFC8126], Section 4.6). | ||||
| Registration requests consist of at least the following information: | ||||
| Field name: | ||||
| The requested field name. It MUST conform to the field-name | ||||
| syntax defined in Section 5.3, and SHOULD be restricted to just | ||||
| letters, digits, hyphen ('-') and underscore ('_') characters, | ||||
| with the first character being a letter. | ||||
| Status: | ||||
| "permanent" or "provisional". | ||||
| Specification document(s): | ||||
| Reference to the document that specifies the field, preferably | ||||
| including a URI that can be used to retrieve a copy of the | ||||
| document. An indication of the relevant section(s) can also be | ||||
| included, but is not required. | ||||
| And, optionally: | ||||
| Comments: Additional information, such as about reserved entries. | ||||
| The Expert(s) can define additional fields to be collected in the | ||||
| registry, in consultation with the community. | ||||
| Standards-defined names have a status of "permanent". Other names | ||||
| can also be registered as permanent, if the Expert(s) find that they | ||||
| are in use, in consultation with the community. Other names should | ||||
| be registered as "provisional". | ||||
| Provisional entries can be removed by the Expert(s) if - in | ||||
| consultation with the community - the Expert(s) find that they are | ||||
| not in use. The Experts can change a provisional entry's status to | ||||
| permanent at any time. | ||||
| Note that names can be registered by third parties (including the | ||||
| Expert(s)), if the Expert(s) determines that an unregistered name is | ||||
| widely deployed and not likely to be registered in a timely manner | ||||
| otherwise. | ||||
| 5.4. Field Values | 5.4.4. Field Values | |||
| HTTP field values typically have their syntax defined using ABNF | HTTP field values typically have their syntax defined using ABNF | |||
| ([RFC5234]), using the extension defined in Section 5.5 as necessary, | ([RFC5234]), using the extension defined in Section 5.7.1 as | |||
| and are usually constrained to the range of US-ASCII characters. | necessary, and are usually constrained to the range of US-ASCII | |||
| Fields needing a greater range of characters can use an encoding such | characters. Fields needing a greater range of characters can use an | |||
| as the one defined in [RFC8187]. | encoding such as the one defined in [RFC8187]. | |||
| field-value = *field-content | field-value = *field-content | |||
| field-content = field-vchar | field-content = field-vchar | |||
| [ 1*( SP / HTAB / field-vchar ) field-vchar ] | [ 1*( SP / HTAB / field-vchar ) field-vchar ] | |||
| field-vchar = VCHAR / obs-text | field-vchar = VCHAR / obs-text | |||
| Historically, HTTP allowed field content with text in the ISO-8859-1 | Historically, HTTP allowed field content with text in the ISO-8859-1 | |||
| charset [ISO-8859-1], supporting other charsets only through use of | charset [ISO-8859-1], supporting other charsets only through use of | |||
| [RFC2047] encoding. In practice, most HTTP field values use only a | [RFC2047] encoding. In practice, most HTTP field values use only a | |||
| subset of the US-ASCII charset [USASCII]. Newly defined fields | subset of the US-ASCII charset [USASCII]. Newly defined fields | |||
| skipping to change at page 32, line 51 ¶ | skipping to change at page 34, line 16 ¶ | |||
| treat other octets in field content (obs-text) as opaque data. | treat other octets in field content (obs-text) as opaque data. | |||
| Field values containing control (CTL) characters such as CR or LF are | Field values containing control (CTL) characters such as CR or LF are | |||
| invalid; recipients MUST either reject a field value containing | invalid; recipients MUST either reject a field value containing | |||
| control characters, or convert them to SP before processing or | control characters, or convert them to SP before processing or | |||
| forwarding the message. | forwarding the message. | |||
| Leading and trailing whitespace in raw field values is removed upon | Leading and trailing whitespace in raw field values is removed upon | |||
| field parsing (e.g., Section 5.1 of [Messaging]). Field definitions | field parsing (e.g., Section 5.1 of [Messaging]). Field definitions | |||
| where leading or trailing whitespace in values is significant will | where leading or trailing whitespace in values is significant will | |||
| have to use a container syntax such as quoted-string | have to use a container syntax such as quoted-string (Section 5.7.4). | |||
| (Section 5.4.1.2). | ||||
| Commas (",") often are used to separate members in field values. | Commas (",") often are used to separate members in field values. | |||
| Fields that allow multiple members are referred to as list-based | Fields that allow multiple members are referred to as list-based | |||
| fields. Fields that only anticipate a single member are referred to | fields. Fields that only anticipate a single member are referred to | |||
| as singleton fields. | as singleton fields. | |||
| Because commas are used as a generic delimiter between members, they | Because commas are used as a generic delimiter between members, they | |||
| need to be treated with care if they are allowed as data within a | need to be treated with care if they are allowed as data within a | |||
| member. This is true for both list-based and singleton fields, since | member. This is true for both list-based and singleton fields, since | |||
| a singleton field might be sent with multiple members erroneously; | a singleton field might be sent with multiple members erroneously; | |||
| skipping to change at page 33, line 32 ¶ | skipping to change at page 34, line 45 ¶ | |||
| these: | these: | |||
| Example-URI-Field: "http://example.com/a.html,foo", | Example-URI-Field: "http://example.com/a.html,foo", | |||
| "http://without-a-comma.example.com/" | "http://without-a-comma.example.com/" | |||
| Example-Date-Field: "Sat, 04 May 1996", "Wed, 14 Sep 2005" | Example-Date-Field: "Sat, 04 May 1996", "Wed, 14 Sep 2005" | |||
| Note that double-quote delimiters almost always are used with the | Note that double-quote delimiters almost always are used with the | |||
| quoted-string production; using a different syntax inside double- | quoted-string production; using a different syntax inside double- | |||
| quotes will likely cause unnecessary confusion. | quotes will likely cause unnecessary confusion. | |||
| Many fields (such as Content-Type, defined in Section 7.2.1) use a | Many fields (such as Content-Type, defined in Section 7.4) use a | |||
| common syntax for parameters that allows both unquoted (token) and | common syntax for parameters that allows both unquoted (token) and | |||
| quoted (quoted-string) syntax for a parameter value | quoted (quoted-string) syntax for a parameter value (Section 5.7.6). | |||
| (Section 5.4.1.4). Use of common syntax allows recipients to reuse | Use of common syntax allows recipients to reuse existing parser | |||
| existing parser components. When allowing both forms, the meaning of | components. When allowing both forms, the meaning of a parameter | |||
| a parameter value ought to be the same whether it was received as a | value ought to be the same whether it was received as a token or a | |||
| token or a quoted string. | quoted string. | |||
| Historically, HTTP field values could be extended over multiple lines | Historically, HTTP field values could be extended over multiple lines | |||
| by preceding each extra line with at least one space or horizontal | by preceding each extra line with at least one space or horizontal | |||
| tab (obs-fold). This document assumes that any such obsolete line | tab (obs-fold). This document assumes that any such obsolete line | |||
| folding has been replaced with one or more SP octets prior to | folding has been replaced with one or more SP octets prior to | |||
| interpreting the field value, as described in Section 5.2 of | interpreting the field value, as described in Section 5.2 of | |||
| [Messaging]. | [Messaging]. | |||
| | *Note:* This specification does not use ABNF rules to define | | *Note:* This specification does not use ABNF rules to define | |||
| | each "Field Name: Field Value" pair, as was done in earlier | | each "Field Name: Field Value" pair, as was done in earlier | |||
| | editions (published before [RFC7230]). Instead, ABNF rules are | | editions (published before [RFC7230]). Instead, ABNF rules are | |||
| | named according to each registered field name, wherein the rule | | named according to each registered field name, wherein the rule | |||
| | defines the valid grammar for that field's corresponding field | | defines the valid grammar for that field's corresponding field | |||
| | values (i.e., after the field value has been extracted by a | | values (i.e., after the field value has been extracted by a | |||
| | generic field parser). | | generic field parser). | |||
| 5.4.1. Common Field Value Components | 5.5. Payload | |||
| Some HTTP messages transfer a complete or partial representation as | ||||
| the message "payload". In some cases, a payload might contain only | ||||
| the associated representation's header fields (e.g., responses to | ||||
| HEAD) or only some part(s) of the representation data (e.g., the 206 | ||||
| (Partial Content) status code). | ||||
| 5.5.1. Purpose | ||||
| The purpose of a payload in a request is defined by the method | ||||
| semantics. For example, a representation in the payload of a PUT | ||||
| request (Section 8.3.4) represents the desired state of the target | ||||
| resource if the request is successfully applied, whereas a | ||||
| representation in the payload of a POST request (Section 8.3.3) | ||||
| represents information to be processed by the target resource. | ||||
| In a response, the payload's purpose is defined by both the request | ||||
| method and the response status code. For example, the payload of a | ||||
| 200 (OK) response to GET (Section 8.3.1) represents the current state | ||||
| of the target resource, as observed at the time of the message | ||||
| origination date (Section 9.2.2), whereas the payload of the same | ||||
| status code in a response to POST might represent either the | ||||
| processing result or the new state of the target resource after | ||||
| applying the processing. Response messages with an error status code | ||||
| usually contain a payload that represents the error condition, such | ||||
| that it describes the error state and what next steps are suggested | ||||
| for resolving it. | ||||
| 5.5.2. Identification | ||||
| When a complete or partial representation is transferred in a message | ||||
| payload, it is often desirable for the sender to supply, or the | ||||
| recipient to determine, an identifier for a resource corresponding to | ||||
| that representation. | ||||
| For a request message: | ||||
| o If the request has a Content-Location header field, then the | ||||
| sender asserts that the payload is a representation of the | ||||
| resource identified by the Content-Location field value. However, | ||||
| such an assertion cannot be trusted unless it can be verified by | ||||
| other means (not defined by this specification). The information | ||||
| might still be useful for revision history links. | ||||
| o Otherwise, the payload is unidentified. | ||||
| For a response message, the following rules are applied in order | ||||
| until a match is found: | ||||
| 1. If the request method is GET or HEAD and the response status code | ||||
| is 200 (OK), 204 (No Content), 206 (Partial Content), or 304 (Not | ||||
| Modified), the payload is a representation of the resource | ||||
| identified by the target URI (Section 6.1). | ||||
| 2. If the request method is GET or HEAD and the response status code | ||||
| is 203 (Non-Authoritative Information), the payload is a | ||||
| potentially modified or enhanced representation of the target | ||||
| resource as provided by an intermediary. | ||||
| 3. If the response has a Content-Location header field and its field | ||||
| value is a reference to the same URI as the target URI, the | ||||
| payload is a representation of the target resource. | ||||
| 4. If the response has a Content-Location header field and its field | ||||
| value is a reference to a URI different from the target URI, then | ||||
| the sender asserts that the payload is a representation of the | ||||
| resource identified by the Content-Location field value. | ||||
| However, such an assertion cannot be trusted unless it can be | ||||
| verified by other means (not defined by this specification). | ||||
| 5. Otherwise, the payload is unidentified. | ||||
| 5.5.3. Payload Metadata | ||||
| Header fields that specifically describe the payload, rather than the | ||||
| associated representation, are referred to as "payload header | ||||
| fields". Payload header fields are defined in other parts of this | ||||
| specification, due to their impact on message parsing. | ||||
| 5.5.4. Payload Body | ||||
| The payload body contains the data of a request or response. This is | ||||
| distinct from the message body (e.g., Section 6 of [Messaging]), | ||||
| which is how the payload body is transferred "on the wire", and might | ||||
| be encoded, depending on the HTTP version in use. | ||||
| It is also distinct from a request or response's representation data | ||||
| (Section 7.2), which can be inferred from protocol operation, rather | ||||
| than necessarily appearing "on the wire." | ||||
| The presence of a payload body in a request depends on whether the | ||||
| request method used defines semantics for it. | ||||
| The presence of a payload body in a response depends on both the | ||||
| request method to which it is responding and the response status code | ||||
| (Section 14). | ||||
| Responses to the HEAD request method (Section 8.3.2) never include a | ||||
| payload body because the associated response header fields indicate | ||||
| only what their values would have been if the request method had been | ||||
| GET (Section 8.3.1). | ||||
| 2xx (Successful) responses to a CONNECT request method | ||||
| (Section 8.3.6) switch the connection to tunnel mode instead of | ||||
| having a payload body. | ||||
| All 1xx (Informational), 204 (No Content), and 304 (Not Modified) | ||||
| responses do not include a payload body. | ||||
| All other responses do include a payload body, although that body | ||||
| might be of zero length. | ||||
| 5.6. Trailer Fields | ||||
| 5.6.1. Purpose | ||||
| In some HTTP versions, additional metadata can be sent after the | ||||
| initial header section has been completed (during or after | ||||
| transmission of the payload body), such as a message integrity check, | ||||
| digital signature, or post-processing status. For example, the | ||||
| chunked coding in HTTP/1.1 allows a trailer section after the payload | ||||
| body (Section 7.1.2 of [Messaging]) which can contain trailer fields: | ||||
| field names and values that share the same syntax and namespace as | ||||
| header fields but that are received after the header section. | ||||
| Trailer fields ought to be processed and stored separately from the | ||||
| fields in the header section to avoid contradicting message semantics | ||||
| known at the time the header section was complete. The presence or | ||||
| absence of certain header fields might impact choices made for the | ||||
| routing or processing of the message as a whole before the trailers | ||||
| are received; those choices cannot be unmade by the later discovery | ||||
| of trailer fields. | ||||
| 5.6.2. Limitations | ||||
| Many fields cannot be processed outside the header section because | ||||
| their evaluation is necessary prior to receiving the message body, | ||||
| such as those that describe message framing, routing, authentication, | ||||
| request modifiers, response controls, or payload format. A sender | ||||
| MUST NOT generate a trailer field unless the sender knows the | ||||
| corresponding header field name's definition permits the field to be | ||||
| sent in trailers. | ||||
| Trailer fields can be difficult to process by intermediaries that | ||||
| forward messages from one protocol version to another. If the entire | ||||
| message can be buffered in transit, some intermediaries could merge | ||||
| trailer fields into the header section (as appropriate) before it is | ||||
| forwarded. However, in most cases, the trailers are simply | ||||
| discarded. A recipient MUST NOT merge a trailer field into a header | ||||
| section unless the recipient understands the corresponding header | ||||
| field definition and that definition explicitly permits and defines | ||||
| how trailer field values can be safely merged. | ||||
| The presence of the keyword "trailers" in the TE header field | ||||
| (Section 9.1.4) indicates that the client is willing to accept | ||||
| trailer fields, on behalf of itself and any downstream clients. For | ||||
| requests from an intermediary, this implies that all downstream | ||||
| clients are willing to accept trailer fields in the forwarded | ||||
| response. Note that the presence of "trailers" does not mean that | ||||
| the client(s) will process any particular trailer field in the | ||||
| response; only that the trailer section(s) will not be dropped by any | ||||
| of the clients. | ||||
| Because of the potential for trailer fields to be discarded in | ||||
| transit, a server SHOULD NOT generate trailer fields that it believes | ||||
| are necessary for the user agent to receive. | ||||
| 5.6.3. Processing | ||||
| Like header fields, trailer fields with the same name are processed | ||||
| in the order received; multiple trailer field lines with the same | ||||
| name have the equivalent semantics as appending the multiple values | ||||
| as a list of members, even when the field lines are received in | ||||
| separate trailer sections. Trailer fields that might be generated | ||||
| more than once during a message MUST be defined as a list value even | ||||
| if each member value is only processed once per field line received. | ||||
| Trailer fields are expected (but not required) to be processed one | ||||
| trailer section at a time. That is, for each trailer section | ||||
| received, a recipient that is looking for trailer fields will parse | ||||
| the received section into fields, invoke any associated processing | ||||
| for those fields at that point in the message processing, and then | ||||
| append those fields to the set of trailer fields received for the | ||||
| overall message. | ||||
| This behavior allows for iterative processing of trailer fields that | ||||
| contain incremental signatures or mid-stream status information, and | ||||
| fields that might refer to each other's values within the same | ||||
| section. However, there is no guarantee that trailer sections won't | ||||
| shift in relation to the message body stream, or won't be recombined | ||||
| (or dropped) in transit, so trailer fields that refer to data outside | ||||
| the present trailer section need to use self-descriptive references | ||||
| (i.e., refer to the data by name, ordinal position, or an octet | ||||
| range) rather than assume it is the data most recently received. | ||||
| Likewise, at the end of a message, a recipient MAY treat the entire | ||||
| set of received trailer fields as one data structure to be considered | ||||
| as the message concludes. Additional processing expectations, if | ||||
| any, can be defined within the field specification for a field | ||||
| intended for use in trailers. | ||||
| 5.7. Common Rules for Defining Field Values | ||||
| 5.7.1. Lists (#rule ABNF Extension) | ||||
| A #rule extension to the ABNF rules of [RFC5234] is used to improve | ||||
| readability in the definitions of some list-based field values. | ||||
| A construct "#" is defined, similar to "*", for defining comma- | ||||
| delimited lists of elements. The full form is "<n>#<m>element" | ||||
| indicating at least <n> and at most <m> elements, each separated by a | ||||
| single comma (",") and optional whitespace (OWS). | ||||
| 5.7.1.1. Sender Requirements | ||||
| In any production that uses the list construct, a sender MUST NOT | ||||
| generate empty list elements. In other words, a sender MUST generate | ||||
| lists that satisfy the following syntax: | ||||
| 1#element => element *( OWS "," OWS element ) | ||||
| and: | ||||
| #element => [ 1#element ] | ||||
| and for n >= 1 and m > 1: | ||||
| <n>#<m>element => element <n-1>*<m-1>( OWS "," OWS element ) | ||||
| Appendix A shows the collected ABNF for senders after the list | ||||
| constructs have been expanded. | ||||
| 5.7.1.2. Recipient Requirements | ||||
| Empty elements do not contribute to the count of elements present. A | ||||
| recipient MUST parse and ignore a reasonable number of empty list | ||||
| elements: enough to handle common mistakes by senders that merge | ||||
| values, but not so much that they could be used as a denial-of- | ||||
| service mechanism. In other words, a recipient MUST accept lists | ||||
| that satisfy the following syntax: | ||||
| #element => [ element ] *( OWS "," OWS [ element ] ) | ||||
| Note that because of the potential presence of empty list elements, | ||||
| the RFC 5234 ABNF cannot enforce the cardinality of list elements, | ||||
| and consequently all cases are mapped as if there was no cardinality | ||||
| specified. | ||||
| For example, given these ABNF productions: | ||||
| example-list = 1#example-list-elmt | ||||
| example-list-elmt = token ; see Section 5.7.2 | ||||
| Then the following are valid values for example-list (not including | ||||
| the double quotes, which are present for delimitation only): | ||||
| "foo,bar" | ||||
| "foo ,bar," | ||||
| "foo , ,bar,charlie" | ||||
| In contrast, the following values would be invalid, since at least | ||||
| one non-empty element is required by the example-list production: | ||||
| "" | ||||
| "," | ||||
| ", ," | ||||
| 5.7.2. Tokens | ||||
| Many HTTP field values are defined using common syntax components, | Many HTTP field values are defined using common syntax components, | |||
| separated by whitespace or specific delimiting characters. | separated by whitespace or specific delimiting characters. | |||
| Delimiters are chosen from the set of US-ASCII visual characters not | Delimiters are chosen from the set of US-ASCII visual characters not | |||
| allowed in a token (DQUOTE and "(),/:;<=>?@[\]{}"). | allowed in a token (DQUOTE and "(),/:;<=>?@[\]{}"). | |||
| 5.4.1.1. Tokens | ||||
| Tokens are short textual identifiers that do not include whitespace | Tokens are short textual identifiers that do not include whitespace | |||
| or delimiters. | or delimiters. | |||
| token = 1*tchar | token = 1*tchar | |||
| tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" | tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" | |||
| / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" | / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" | |||
| / DIGIT / ALPHA | / DIGIT / ALPHA | |||
| ; any VCHAR, except delimiters | ; any VCHAR, except delimiters | |||
| 5.4.1.2. Quoted Strings | 5.7.3. Whitespace | |||
| This specification uses three rules to denote the use of linear | ||||
| whitespace: OWS (optional whitespace), RWS (required whitespace), and | ||||
| BWS ("bad" whitespace). | ||||
| The OWS rule is used where zero or more linear whitespace octets | ||||
| might appear. For protocol elements where optional whitespace is | ||||
| preferred to improve readability, a sender SHOULD generate the | ||||
| optional whitespace as a single SP; otherwise, a sender SHOULD NOT | ||||
| generate optional whitespace except as needed to white out invalid or | ||||
| unwanted protocol elements during in-place message filtering. | ||||
| The RWS rule is used when at least one linear whitespace octet is | ||||
| required to separate field tokens. A sender SHOULD generate RWS as a | ||||
| single SP. | ||||
| OWS and RWS have the same semantics as a single SP. Any content | ||||
| known to be defined as OWS or RWS MAY be replaced with a single SP | ||||
| before interpreting it or forwarding the message downstream. | ||||
| The BWS rule is used where the grammar allows optional whitespace | ||||
| only for historical reasons. A sender MUST NOT generate BWS in | ||||
| messages. A recipient MUST parse for such bad whitespace and remove | ||||
| it before interpreting the protocol element. | ||||
| BWS has no semantics. Any content known to be defined as BWS MAY be | ||||
| removed before interpreting it or forwarding the message downstream. | ||||
| OWS = *( SP / HTAB ) | ||||
| ; optional whitespace | ||||
| RWS = 1*( SP / HTAB ) | ||||
| ; required whitespace | ||||
| BWS = OWS | ||||
| ; "bad" whitespace | ||||
| 5.7.4. Quoted Strings | ||||
| A string of text is parsed as a single value if it is quoted using | A string of text is parsed as a single value if it is quoted using | |||
| double-quote marks. | double-quote marks. | |||
| quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE | quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE | |||
| qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text | qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text | |||
| obs-text = %x80-FF | obs-text = %x80-FF | |||
| The backslash octet ("\") can be used as a single-octet quoting | The backslash octet ("\") can be used as a single-octet quoting | |||
| mechanism within quoted-string and comment constructs. Recipients | mechanism within quoted-string and comment constructs. Recipients | |||
| skipping to change at page 35, line 5 ¶ | skipping to change at page 42, line 42 ¶ | |||
| as if it were replaced by the octet following the backslash. | as if it were replaced by the octet following the backslash. | |||
| quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) | quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) | |||
| A sender SHOULD NOT generate a quoted-pair in a quoted-string except | A sender SHOULD NOT generate a quoted-pair in a quoted-string except | |||
| where necessary to quote DQUOTE and backslash octets occurring within | where necessary to quote DQUOTE and backslash octets occurring within | |||
| that string. A sender SHOULD NOT generate a quoted-pair in a comment | that string. A sender SHOULD NOT generate a quoted-pair in a comment | |||
| except where necessary to quote parentheses ["(" and ")"] and | except where necessary to quote parentheses ["(" and ")"] and | |||
| backslash octets occurring within that comment. | backslash octets occurring within that comment. | |||
| 5.4.1.3. Comments | 5.7.5. Comments | |||
| Comments can be included in some HTTP fields by surrounding the | Comments can be included in some HTTP fields by surrounding the | |||
| comment text with parentheses. Comments are only allowed in fields | comment text with parentheses. Comments are only allowed in fields | |||
| containing "comment" as part of their field value definition. | containing "comment" as part of their field value definition. | |||
| comment = "(" *( ctext / quoted-pair / comment ) ")" | comment = "(" *( ctext / quoted-pair / comment ) ")" | |||
| ctext = HTAB / SP / %x21-27 / %x2A-5B / %x5D-7E / obs-text | ctext = HTAB / SP / %x21-27 / %x2A-5B / %x5D-7E / obs-text | |||
| 5.4.1.4. Parameters | 5.7.6. Parameters | |||
| Parameters are zero or more instances of a name=value pair; they are | Parameters are zero or more instances of a name=value pair; they are | |||
| often used in field values as a common syntax for appending auxiliary | often used in field values as a common syntax for appending auxiliary | |||
| information to an item. Each parameter is usually delimited by an | information to an item. Each parameter is usually delimited by an | |||
| immediately preceding semicolon. | immediately preceding semicolon. | |||
| parameters = *( OWS ";" OWS [ parameter ] ) | parameters = *( OWS ";" OWS [ parameter ] ) | |||
| parameter = parameter-name "=" parameter-value | parameter = parameter-name "=" parameter-value | |||
| parameter-name = token | parameter-name = token | |||
| parameter-value = ( token / quoted-string ) | parameter-value = ( token / quoted-string ) | |||
| Parameter names are case-insensitive. Parameter values might or | Parameter names are case-insensitive. Parameter values might or | |||
| might not be case-sensitive, depending on the semantics of the | might not be case-sensitive, depending on the semantics of the | |||
| parameter name. Examples of parameters and some equivalent forms can | parameter name. Examples of parameters and some equivalent forms can | |||
| be seen in media types (Section 7.1.1) and the Accept header field | be seen in media types (Section 7.4.1) and the Accept header field | |||
| (Section 9.4.1). | (Section 11.1.2). | |||
| A parameter value that matches the token production can be | A parameter value that matches the token production can be | |||
| transmitted either as a token or within a quoted-string. The quoted | transmitted either as a token or within a quoted-string. The quoted | |||
| and unquoted values are equivalent. | and unquoted values are equivalent. | |||
| | *Note:* Parameters do not allow whitespace (not even "bad" | | *Note:* Parameters do not allow whitespace (not even "bad" | |||
| | whitespace) around the "=" character. | | whitespace) around the "=" character. | |||
| 5.4.1.5. Date/Time Formats | 5.7.7. Date/Time Formats | |||
| Prior to 1995, there were three different formats commonly used by | Prior to 1995, there were three different formats commonly used by | |||
| servers to communicate timestamps. For compatibility with old | servers to communicate timestamps. For compatibility with old | |||
| implementations, all three are defined here. The preferred format is | implementations, all three are defined here. The preferred format is | |||
| a fixed-length and single-zone subset of the date and time | a fixed-length and single-zone subset of the date and time | |||
| specification used by the Internet Message Format [RFC5322]. | specification used by the Internet Message Format [RFC5322]. | |||
| HTTP-date = IMF-fixdate / obs-date | HTTP-date = IMF-fixdate / obs-date | |||
| An example of the preferred format is | An example of the preferred format is | |||
| skipping to change at page 37, line 39 ¶ | skipping to change at page 45, line 32 ¶ | |||
| timestamps unless otherwise restricted by the field definition. For | timestamps unless otherwise restricted by the field definition. For | |||
| example, messages are occasionally forwarded over HTTP from a non- | example, messages are occasionally forwarded over HTTP from a non- | |||
| HTTP source that might generate any of the date and time | HTTP source that might generate any of the date and time | |||
| specifications defined by the Internet Message Format. | specifications defined by the Internet Message Format. | |||
| | *Note:* HTTP requirements for the date/time stamp format apply | | *Note:* HTTP requirements for the date/time stamp format apply | |||
| | only to their usage within the protocol stream. | | only to their usage within the protocol stream. | |||
| | Implementations are not required to use these formats for user | | Implementations are not required to use these formats for user | |||
| | presentation, request logging, etc. | | presentation, request logging, etc. | |||
| 5.5. ABNF List Extension: #rule | 6. Routing | |||
| A #rule extension to the ABNF rules of [RFC5234] is used to improve | ||||
| readability in the definitions of some list-based field values. | ||||
| A construct "#" is defined, similar to "*", for defining comma- | ||||
| delimited lists of elements. The full form is "<n>#<m>element" | ||||
| indicating at least <n> and at most <m> elements, each separated by a | ||||
| single comma (",") and optional whitespace (OWS). | ||||
| 5.5.1. Sender Requirements | ||||
| In any production that uses the list construct, a sender MUST NOT | ||||
| generate empty list elements. In other words, a sender MUST generate | ||||
| lists that satisfy the following syntax: | ||||
| 1#element => element *( OWS "," OWS element ) | ||||
| and: | ||||
| #element => [ 1#element ] | ||||
| and for n >= 1 and m > 1: | ||||
| <n>#<m>element => element <n-1>*<m-1>( OWS "," OWS element ) | ||||
| Appendix A shows the collected ABNF for senders after the list | ||||
| constructs have been expanded. | ||||
| 5.5.2. Recipient Requirements | ||||
| Empty elements do not contribute to the count of elements present. A | ||||
| recipient MUST parse and ignore a reasonable number of empty list | ||||
| elements: enough to handle common mistakes by senders that merge | ||||
| values, but not so much that they could be used as a denial-of- | ||||
| service mechanism. In other words, a recipient MUST accept lists | ||||
| that satisfy the following syntax: | ||||
| #element => [ element ] *( OWS "," OWS [ element ] ) | ||||
| Note that because of the potential presence of empty list elements, | ||||
| the RFC 5234 ABNF cannot enforce the cardinality of list elements, | ||||
| and consequently all cases are mapped is if there was no cardinality | ||||
| specified. | ||||
| For example, given these ABNF productions: | ||||
| example-list = 1#example-list-elmt | ||||
| example-list-elmt = token ; see Section 5.4.1.1 | ||||
| Then the following are valid values for example-list (not including | ||||
| the double quotes, which are present for delimitation only): | ||||
| "foo,bar" | ||||
| "foo ,bar," | ||||
| "foo , ,bar,charlie" | ||||
| In contrast, the following values would be invalid, since at least | ||||
| one non-empty element is required by the example-list production: | ||||
| "" | ||||
| "," | ||||
| ", ," | ||||
| 5.6. Trailer Fields | ||||
| 5.6.1. Purpose | ||||
| In some HTTP versions, additional metadata can be sent after the | ||||
| initial header section has been completed (during or after | ||||
| transmission of the payload body), such as a message integrity check, | ||||
| digital signature, or post-processing status. For example, the | ||||
| chunked coding in HTTP/1.1 allows a trailer section after the payload | ||||
| body (Section 7.1.2 of [Messaging]) which can contain trailer fields: | ||||
| field names and values that share the same syntax and namespace as | ||||
| header fields but that are received after the header section. | ||||
| Trailer fields ought to be processed and stored separately from the | ||||
| fields in the header section to avoid contradicting message semantics | ||||
| known at the time the header section was complete. The presence or | ||||
| absence of certain header fields might impact choices made for the | ||||
| routing or processing of the message as a whole before the trailers | ||||
| are received; those choices cannot be unmade by the later discovery | ||||
| of trailer fields. | ||||
| 5.6.2. Limitations | ||||
| Many fields cannot be processed outside the header section because | ||||
| their evaluation is necessary prior to receiving the message body, | ||||
| such as those that describe message framing, routing, authentication, | ||||
| request modifiers, response controls, or payload format. A sender | ||||
| MUST NOT generate a trailer field unless the sender knows the | ||||
| corresponding header field name's definition permits the field to be | ||||
| sent in trailers. | ||||
| Trailer fields can be difficult to process by intermediaries that | ||||
| forward messages from one protocol version to another. If the entire | ||||
| message can be buffered in transit, some intermediaries could merge | ||||
| trailer fields into the header section (as appropriate) before it is | ||||
| forwarded. However, in most cases, the trailers are simply | ||||
| discarded. A recipient MUST NOT merge a trailer field into a header | ||||
| section unless the recipient understands the corresponding header | ||||
| field definition and that definition explicitly permits and defines | ||||
| how trailer field values can be safely merged. | ||||
| The presence of the keyword "trailers" in the TE header field | ||||
| (Section 5.6.5) indicates that the client is willing to accept | ||||
| trailer fields, on behalf of itself and any downstream clients. For | ||||
| requests from an intermediary, this implies that all downstream | ||||
| clients are willing to accept trailer fields in the forwarded | ||||
| response. Note that the presence of "trailers" does not mean that | ||||
| the client(s) will process any particular trailer field in the | ||||
| response; only that the trailer section(s) will not be dropped by any | ||||
| of the clients. | ||||
| Because of the potential for trailer fields to be discarded in | ||||
| transit, a server SHOULD NOT generate trailer fields that it believes | ||||
| are necessary for the user agent to receive. | ||||
| 5.6.3. Processing | ||||
| Like header fields, trailer fields with the same name are processed | ||||
| in the order received; multiple trailer field lines with the same | ||||
| name have the equivalent semantics as appending the multiple values | ||||
| as a list of members, even when the field lines are received in | ||||
| separate trailer sections. Trailer fields that might be generated | ||||
| more than once during a message MUST be defined as a list value even | ||||
| if each member value is only processed once per field line received. | ||||
| Trailer fields are expected (but not required) to be processed one | ||||
| trailer section at a time. That is, for each trailer section | ||||
| received, a recipient that is looking for trailer fields will parse | ||||
| the received section into fields, invoke any associated processing | ||||
| for those fields at that point in the message processing, and then | ||||
| append those fields to the set of trailer fields received for the | ||||
| overall message. | ||||
| This behavior allows for iterative processing of trailer fields that | ||||
| contain incremental signatures or mid-stream status information, and | ||||
| fields that might refer to each other's values within the same | ||||
| section. However, there is no guarantee that trailer sections won't | ||||
| shift in relation to the message body stream, or won't be recombined | ||||
| (or dropped) in transit, so trailer fields that refer to data outside | ||||
| the present trailer section need to use self-descriptive references | ||||
| (i.e., refer to the data by name, ordinal position, or an octet | ||||
| range) rather than assume it is the data most recently received. | ||||
| Likewise, at the end of a message, a recipient MAY treat the entire | ||||
| set of received trailer fields as one data structure to be considered | ||||
| as the message concludes. Additional processing expectations, if | ||||
| any, can be defined within the field specification for a field | ||||
| intended for use in trailers. | ||||
| 5.6.4. Trailer | ||||
| The "Trailer" header field provides a list of field names that the | ||||
| sender anticipates sending as trailer fields within that message. | ||||
| This allows a recipient to prepare for receipt of the indicated | ||||
| metadata before it starts processing the body. | ||||
| Trailer = #field-name | ||||
| For example, a sender might indicate that a message integrity check | ||||
| will be computed as the payload is being streamed and provide the | ||||
| final signature as a trailer field. This allows a recipient to | ||||
| perform the same check on the fly as the payload data is received. | ||||
| A sender that intends to generate one or more trailer fields in a | ||||
| message SHOULD generate a Trailer header field in the header section | ||||
| of that message to indicate which fields might be present in the | ||||
| trailers. | ||||
| 5.6.5. TE | ||||
| The "TE" header field in a request can be used to indicate that the | ||||
| sender will not discard trailer fields when it contains a "trailers" | ||||
| member, as described in Section 5.6. | ||||
| Additionally, specific HTTP versions can use it to indicate the | ||||
| transfer codings the client is willing to accept in the response. | ||||
| The TE field-value consists of a list of tokens, each allowing for | ||||
| optional parameters (as described in Section 5.4.1.4). | ||||
| TE = #t-codings | ||||
| t-codings = "trailers" / ( transfer-coding [ t-ranking ] ) | ||||
| t-ranking = OWS ";" OWS "q=" rank | ||||
| rank = ( "0" [ "." 0*3DIGIT ] ) | ||||
| / ( "1" [ "." 0*3("0") ] ) | ||||
| 5.7. Considerations for New HTTP Fields | ||||
| See Section 5.3 for a general requirements for field names, and | ||||
| Section 5.4 for a discussion of field values. | ||||
| Authors of specifications defining new fields are advised to consider | ||||
| documenting: | ||||
| o Whether the field has a singleton or list-based value (see | ||||
| Section 5.4). | ||||
| If it is a singleton field, document how to treat messages where | ||||
| the multiple members are present (a sensible default would be to | ||||
| ignore the field, but this might not always be the right choice). | ||||
| Note that intermediaries and software libraries might combine | ||||
| multiple field instances into a single one, despite the field | ||||
| being defined as a singleton. A robust format enables recipients | ||||
| to discover these situations (good example: "Content-Type", as the | ||||
| comma can only appear inside quoted strings; bad example: | ||||
| "Location", as a comma can occur inside a URI). | ||||
| o Under what conditions the field can be used; e.g., only in | ||||
| responses or requests, in all messages, only on responses to a | ||||
| particular request method, etc. | ||||
| o What the scope of applicability for the information conveyed in | ||||
| the field is. By default, fields apply only to the message they | ||||
| are associated with, but some response fields are designed to | ||||
| apply to all representations of a resource, the resource itself, | ||||
| or an even broader scope. Specifications that expand the scope of | ||||
| a response field will need to carefully consider issues such as | ||||
| content negotiation, the time period of applicability, and (in | ||||
| some cases) multi-tenant server deployments. | ||||
| o Whether the field should be stored by origin servers that | ||||
| understand it upon a PUT request. | ||||
| o Whether the field semantics are further refined by the context, | ||||
| such as by existing request methods or status codes. | ||||
| o Whether it is appropriate to list the field name in the Connection | ||||
| header field (i.e., if the field is to be hop-by-hop; see | ||||
| Section 6.8). | ||||
| o Under what conditions intermediaries are allowed to insert, | ||||
| delete, or modify the field's value. | ||||
| o Whether it is appropriate to list the field name in a Vary | ||||
| response header field (e.g., when the request header field is used | ||||
| by an origin server's content selection algorithm; see | ||||
| Section 11.1.4). | ||||
| o Whether the field is allowable in trailers (see Section 5.6). | ||||
| o Whether the field ought to be preserved across redirects. | ||||
| o Whether it introduces any additional security considerations, such | ||||
| as disclosure of privacy-related data. | ||||
| 5.8. Fields Defined In This Document | ||||
| The following fields are defined by this document: | ||||
| --------------------------- ------------ -------- | ||||
| Field Name Status Ref. | ||||
| --------------------------- ------------ -------- | ||||
| Accept standard 9.4.1 | ||||
| Accept-Charset deprecated 9.4.2 | ||||
| Accept-Encoding standard 9.4.3 | ||||
| Accept-Language standard 9.4.4 | ||||
| Accept-Ranges standard 11.4.1 | ||||
| Allow standard 11.4.2 | ||||
| Authentication-Info standard 11.3.3 | ||||
| Authorization standard 9.5.3 | ||||
| Connection standard 6.8 | ||||
| Content-Encoding standard 7.2.2 | ||||
| Content-Language standard 7.2.3 | ||||
| Content-Length standard 7.2.4 | ||||
| Content-Location standard 7.2.5 | ||||
| Content-Range standard 7.3.4 | ||||
| Content-Type standard 7.2.1 | ||||
| Date standard 11.1.1 | ||||
| ETag standard 11.2.3 | ||||
| Expect standard 9.1.1 | ||||
| From standard 9.6.1 | ||||
| Host standard 6.5 | ||||
| If-Match standard 9.2.3 | ||||
| If-Modified-Since standard 9.2.5 | ||||
| If-None-Match standard 9.2.4 | ||||
| If-Range standard 9.2.7 | ||||
| If-Unmodified-Since standard 9.2.6 | ||||
| Last-Modified standard 11.2.2 | ||||
| Location standard 11.1.2 | ||||
| Max-Forwards standard 9.1.2 | ||||
| Proxy-Authenticate standard 11.3.2 | ||||
| Proxy-Authentication-Info standard 11.3.4 | ||||
| Proxy-Authorization standard 9.5.4 | ||||
| Range standard 9.3 | ||||
| Referer standard 9.6.2 | ||||
| Retry-After standard 11.1.3 | ||||
| Server standard 11.4.3 | ||||
| TE standard 5.6.5 | ||||
| Trailer standard 5.6.4 | ||||
| Upgrade standard 6.7 | ||||
| User-Agent standard 9.6.3 | ||||
| Vary standard 11.1.4 | ||||
| Via standard 6.6.1 | ||||
| WWW-Authenticate standard 11.3.1 | ||||
| --------------------------- ------------ -------- | ||||
| Table 3 | ||||
| Furthermore, the field name "*" is reserved, since using that name as | ||||
| an HTTP header field might conflict with its special semantics in the | ||||
| Vary header field (Section 11.1.4). | ||||
| ------------ ---------- ------ ------------ | ||||
| Field Name Status Ref. Comments | ||||
| ------------ ---------- ------ ------------ | ||||
| * standard 5.8 (reserved) | ||||
| ------------ ---------- ------ ------------ | ||||
| Table 4 | ||||
| 6. Message Routing | HTTP is used in a wide variety of applications, ranging from general- | |||
| purpose computers to home appliances. In some cases, communication | ||||
| options are hard-coded in a client's configuration. However, most | ||||
| HTTP clients rely on the same resource identification mechanism and | ||||
| configuration techniques as general-purpose Web browsers. | ||||
| HTTP request message routing is determined by each client based on | HTTP request message routing is determined by each client based on | |||
| the target resource, the client's proxy configuration, and | the target resource, the client's proxy configuration, and | |||
| establishment or reuse of an inbound connection. The corresponding | establishment or reuse of an inbound connection. The corresponding | |||
| response routing follows the same connection chain back to the | response routing follows the same connection chain back to the | |||
| client. | client. | |||
| 6.1. Identifying a Target Resource | 6.1. Target Resource | |||
| HTTP is used in a wide variety of applications, ranging from general- | 6.1.1. Request Target | |||
| purpose computers to home appliances. In some cases, communication | ||||
| options are hard-coded in a client's configuration. However, most | ||||
| HTTP clients rely on the same resource identification mechanism and | ||||
| configuration techniques as general-purpose Web browsers. | ||||
| HTTP communication is initiated by a user agent for some purpose. | The "request target" is the protocol element that identifies the | |||
| The purpose is a combination of request semantics and a target | "target resource". | |||
| resource upon which to apply those semantics. The "request target" | ||||
| is the protocol element that identifies the "target resource". | ||||
| Typically, the request target is a URI reference (Section 2.4) which | Typically, the request target is a URI reference (Section 4) which a | |||
| a user agent would resolve to its absolute form in order to obtain | user agent would resolve to its absolute form in order to obtain the | |||
| the "target URI". The target URI excludes the reference's fragment | "target URI". The target URI excludes the reference's fragment | |||
| component, if any, since fragment identifiers are reserved for | component, if any, since fragment identifiers are reserved for | |||
| client-side processing ([RFC3986], Section 3.5). | client-side processing ([RFC3986], Section 3.5). | |||
| However, there are two special, method-specific forms allowed for the | However, there are two special, method-specific forms allowed for the | |||
| request target in specific circumstances: | request target in specific circumstances: | |||
| o For CONNECT (Section 8.3.6), the request target is the host name | o For CONNECT (Section 8.3.6), the request target is the host name | |||
| and port number of the tunnel destination, separated by a colon. | and port number of the tunnel destination, separated by a colon. | |||
| o For OPTIONS (Section 8.3.7), the request target can be a single | o For OPTIONS (Section 8.3.7), the request target can be a single | |||
| asterisk ("*"). | asterisk ("*"). | |||
| See the respective method definitions for details. These forms MUST | See the respective method definitions for details. These forms MUST | |||
| NOT be used with other methods. | NOT be used with other methods. | |||
| 6.2. Determining Origin | 6.1.2. Host | |||
| The "origin" for a given URI is the triple of scheme, host, and port | The "Host" header field in a request provides the host and port | |||
| after normalizing the scheme and host to lowercase and normalizing | information from the target URI, enabling the origin server to | |||
| the port to remove any leading zeros. If port is elided from the | distinguish among resources while servicing requests for multiple | |||
| URI, the default port for that scheme is used. For example, the URI | host names on a single IP address. | |||
| https://Example.Com/happy.js | Host = uri-host [ ":" port ] ; Section 4 | |||
| would have the origin | Since the Host field value is critical information for handling a | |||
| request, a user agent SHOULD generate Host as the first field in the | ||||
| header section. | ||||
| { "https", "example.com", "443" } | For example, a GET request to the origin server for | |||
| <http://www.example.org/pub/WWW/> would begin with: | ||||
| which can also be described as the normalized URI prefix with port | GET /pub/WWW/ HTTP/1.1 | |||
| always present: | Host: www.example.org | |||
| https://example.com:443 | Since the Host header field acts as an application-level routing | |||
| mechanism, it is a frequent target for malware seeking to poison a | ||||
| shared cache or redirect a request to an unintended server. An | ||||
| interception proxy is particularly vulnerable if it relies on the | ||||
| Host field value for redirecting requests to internal servers, or for | ||||
| use as a cache key in a shared cache, without first verifying that | ||||
| the intercepted connection is targeting a valid IP address for that | ||||
| host. | ||||
| Each origin defines its own namespace and controls how identifiers | 6.1.3. Reconstructing the Target URI | |||
| within that namespace are mapped to resources. In turn, how the | ||||
| origin responds to valid requests, consistently over time, determines | ||||
| the semantics that users will associate with a URI, and the | ||||
| usefulness of those semantics is what ultimately transforms these | ||||
| mechanisms into a "resource" for users to reference and access in the | ||||
| future. | ||||
| Two origins are distinct if they differ in scheme, host, or port. | Once an inbound connection is obtained, the client sends an HTTP | |||
| Even when it can be verified that the same entity controls two | request message. | |||
| distinct origins, the two namespaces under those origins are distinct | ||||
| unless explicitly aliased by a server authoritative for that origin. | ||||
| Origin is also used within HTML and related Web protocols, beyond the | Depending on the nature of the request, the client's target URI might | |||
| scope of this document, as described in [RFC6454]. | be split into components and transmitted (or implied) within various | |||
| parts of a request message. These parts are recombined by each | ||||
| recipient, in accordance with their local configuration and incoming | ||||
| connection context, to determine the target URI. Appendix of | ||||
| [Messaging] defines how a server determines the target URI for an | ||||
| HTTP/1.1 request. | ||||
| 6.3. Routing Inbound | Once the target URI has been reconstructed, an origin server needs to | |||
| decide whether or not to provide service for that URI via the | ||||
| connection in which the request was received. For example, the | ||||
| request might have been misdirected, deliberately or accidentally, | ||||
| such that the information within a received Host header field differs | ||||
| from the host or port upon which the connection has been made. If | ||||
| the connection is from a trusted gateway, that inconsistency might be | ||||
| expected; otherwise, it might indicate an attempt to bypass security | ||||
| filters, trick the server into delivering non-public content, or | ||||
| poison a cache. See Section 16 for security considerations regarding | ||||
| message routing. | ||||
| | *Note:* previous specifications defined the recomposed target | ||||
| | URI as a distinct concept, the effective request URI. | ||||
| 6.2. Routing Inbound | ||||
| Once the target URI and its origin are determined, a client decides | Once the target URI and its origin are determined, a client decides | |||
| whether a network request is necessary to accomplish the desired | whether a network request is necessary to accomplish the desired | |||
| semantics and, if so, where that request is to be directed. | semantics and, if so, where that request is to be directed. | |||
| 6.3.1. To a Cache | 6.2.1. To a Cache | |||
| If the client has a cache [Caching] and the request can be satisfied | If the client has a cache [Caching] and the request can be satisfied | |||
| by it, then the request is usually directed there first. | by it, then the request is usually directed there first. | |||
| 6.3.2. To a Proxy | 6.2.2. To a Proxy | |||
| If the request is not satisfied by a cache, then a typical client | If the request is not satisfied by a cache, then a typical client | |||
| will check its configuration to determine whether a proxy is to be | will check its configuration to determine whether a proxy is to be | |||
| used to satisfy the request. Proxy configuration is implementation- | used to satisfy the request. Proxy configuration is implementation- | |||
| dependent, but is often based on URI prefix matching, selective | dependent, but is often based on URI prefix matching, selective | |||
| authority matching, or both, and the proxy itself is usually | authority matching, or both, and the proxy itself is usually | |||
| identified by an "http" or "https" URI. If a proxy is applicable, | identified by an "http" or "https" URI. If a proxy is applicable, | |||
| the client connects inbound by establishing (or reusing) a connection | the client connects inbound by establishing (or reusing) a connection | |||
| to that proxy. | to that proxy. | |||
| 6.3.3. To the Origin | 6.2.3. To the Origin | |||
| If no proxy is applicable, a typical client will invoke a handler | If no proxy is applicable, a typical client will invoke a handler | |||
| routine, usually specific to the target URI's scheme, to connect | routine, usually specific to the target URI's scheme, to connect | |||
| directly to an origin for the target resource. How that is | directly to an origin for the target resource. How that is | |||
| accomplished is dependent on the target URI scheme and defined by its | accomplished is dependent on the target URI scheme and defined by its | |||
| associated specification. | associated specification. | |||
| 6.3.3.1. http origins | 6.3. Response Correlation | |||
| Although HTTP is independent of the transport protocol, the "http" | ||||
| scheme (Section 2.5.1) is specific to associating authority with | ||||
| whomever controls the origin server listening for TCP connections on | ||||
| the indicated port of whatever host is identified within the | ||||
| authority component. This is a very weak sense of authority because | ||||
| it depends on both client-specific name resolution mechanisms and | ||||
| communication that might not be secured from an on-path attacker. | ||||
| Nevertheless, it is a sufficient minimum for binding "http" | ||||
| identifiers to an origin server for consistent resolution within a | ||||
| trusted environment. | ||||
| If the host identifier is provided as an IP address, the origin | ||||
| server is the listener (if any) on the indicated TCP port at that IP | ||||
| address. If host is a registered name, the registered name is an | ||||
| indirect identifier for use with a name resolution service, such as | ||||
| DNS, to find an address for an appropriate origin server. | ||||
| When an "http" URI is used within a context that calls for access to | ||||
| the indicated resource, a client MAY attempt access by resolving the | ||||
| host identifier to an IP address, establishing a TCP connection to | ||||
| that address on the indicated port, and sending an HTTP request | ||||
| message to the server containing the URI's identifying data | ||||
| (Section 2.1). | ||||
| If the server responds to such a request with a non-interim HTTP | ||||
| response message, as described in Section 10, then that response is | ||||
| considered an authoritative answer to the client's request. | ||||
| Note, however, that the above is not the only means for obtaining an | ||||
| authoritative response, nor does it imply that an authoritative | ||||
| response is always necessary (see [Caching]). For example, the Alt- | ||||
| Svc header field [RFC7838] allows an origin server to identify other | ||||
| services that are also authoritative for that origin. Access to | ||||
| "http" identified resources might also be provided by protocols | ||||
| outside the scope of this document. | ||||
| See Section 12.1 for security considerations related to establishing | ||||
| authority. | ||||
| 6.3.3.2. https origins | ||||
| The "https" scheme (Section 2.5.2) associates authority based on the | ||||
| ability of a server to use the private key corresponding to a | ||||
| certificate that the client considers to be trustworthy for the | ||||
| identified origin server. The client usually relies upon a chain of | ||||
| trust, conveyed from some prearranged or configured trust anchor, to | ||||
| deem a certificate trustworthy (Section 6.3.3.3). | ||||
| In HTTP/1.1 and earlier, a client will only attribute authority to a | A connection might be used for multiple request/response exchanges. | |||
| server when they are communicating over a successfully established | The mechanism used to correlate between request and response messages | |||
| and secured connection specifically to that URI origin's host. The | is version dependent; some versions of HTTP use implicit ordering of | |||
| connection establishment and certificate verification are used as | messages, while others use an explicit identifier. | |||
| proof of authority. | ||||
| In HTTP/2 and HTTP/3, a client will attribute authority to a server | Responses (both final and interim) can be sent at any time after a | |||
| when they are communicating over a successfully established and | request is received, even if it is not yet complete. However, | |||
| secured connection if the URI origin's host matches any of the hosts | clients (including intermediaries) might abandon a request if the | |||
| present in the server's certificate and the client believes that it | response is not forthcoming within a reasonable period of time. | |||
| could open a connection to that host for that URI. In practice, a | ||||
| client will make a DNS query to check that the origin's host contains | ||||
| the same server IP address as the established connection. This | ||||
| restriction can be removed by the origin server sending an equivalent | ||||
| ORIGIN frame [RFC8336]. | ||||
| The request target's host and port value are passed within each HTTP | 6.4. Message Forwarding | |||
| request, identifying the origin and distinguishing it from other | ||||
| namespaces that might be controlled by the same server. It is the | ||||
| origin's responsibility to ensure that any services provided with | ||||
| control over its certificate's private key are equally responsible | ||||
| for managing the corresponding "https" namespaces, or at least | ||||
| prepared to reject requests that appear to have been misdirected. A | ||||
| server might be unwilling to serve as the origin for some hosts even | ||||
| when they have the authority to do so. | ||||
| For example, if a network attacker causes connections for port N to | As described in Section 3.7, intermediaries can serve a variety of | |||
| be received at port Q, checking the target URI is necessary to ensure | roles in the processing of HTTP requests and responses. Some | |||
| that the attacker can't cause "https://example.com:N/foo" to be | intermediaries are used to improve performance or availability. | |||
| replaced by "https://example.com:Q/foo" without consent. | Others are used for access control or to filter content. Since an | |||
| HTTP stream has characteristics similar to a pipe-and-filter | ||||
| architecture, there are no inherent limits to the extent an | ||||
| intermediary can enhance (or interfere) with either direction of the | ||||
| stream. | ||||
| Note that the "https" scheme does not rely on TCP and the connected | An intermediary not acting as a tunnel MUST implement the Connection | |||
| port number for associating authority, since both are outside the | header field, as specified in Section 6.4.1, and exclude fields from | |||
| secured communication and thus cannot be trusted as definitive. | being forwarded that are only intended for the incoming connection. | |||
| Hence, the HTTP communication might take place over any channel that | ||||
| has been secured, as defined in Section 2.5.2, including protocols | ||||
| that don't use TCP. | ||||
| When an "https" URI is used within a context that calls for access to | An intermediary MUST NOT forward a message to itself unless it is | |||
| the indicated resource, a client MAY attempt access by resolving the | protected from an infinite request loop. In general, an intermediary | |||
| host identifier to an IP address, establishing a TCP connection to | ought to recognize its own server names, including any aliases, local | |||
| that address on the indicated port, securing the connection end-to- | variations, or literal IP addresses, and respond to such requests | |||
| end by successfully initiating TLS over TCP with confidentiality and | directly. | |||
| integrity protection, and sending an HTTP request message over that | ||||
| connection containing the URI's identifying data (Section 2.1). | ||||
| If the server responds to such a request with a non-interim HTTP | An HTTP message can be parsed as a stream for incremental processing | |||
| response message, as described in Section 10, then that response is | or forwarding downstream. However, recipients cannot rely on | |||
| considered an authoritative answer to the client's request. | incremental delivery of partial messages, since some implementations | |||
| will buffer or delay message forwarding for the sake of network | ||||
| efficiency, security checks, or payload transformations. | ||||
| Note, however, that the above is not the only means for obtaining an | 6.4.1. Connection | |||
| authoritative response, nor does it imply that an authoritative | ||||
| response is always necessary (see [Caching]). | ||||
| 6.3.3.3. https certificate verification | The "Connection" header field allows the sender to list desired | |||
| control options for the current connection. | ||||
| To establish a secured connection to dereference a URI, a client MUST | When a field aside from Connection is used to supply control | |||
| verify that the service's identity is an acceptable match for the | information for or about the current connection, the sender MUST list | |||
| URI's origin server. Certificate verification is used to prevent | the corresponding field name within the Connection header field. | |||
| server impersonation by an on-path attacker or by an attacker that | Note that some versions of HTTP prohibit the use of fields for such | |||
| controls name resolution. This process requires that a client be | information, and therefore do not allow the Connection field. | |||
| configured with a set of trust anchors. | ||||
| In general, a client MUST verify the service identity using the | Intermediaries MUST parse a received Connection header field before a | |||
| verification process defined in Section 6 of [RFC6125] (for a | message is forwarded and, for each connection-option in this field, | |||
| reference identifier of type URI-ID) unless the client has been | remove any header or trailer field(s) from the message with the same | |||
| specifically configured to accept some other form of verification. | name as the connection-option, and then remove the Connection header | |||
| For example, a client might be connecting to a server whose address | field itself (or replace it with the intermediary's own connection | |||
| and hostname are dynamic, with an expectation that the service will | options for the forwarded message). | |||
| present a specific certificate (or a certificate matching some | ||||
| externally defined reference identity) rather than one matching the | ||||
| dynamic URI's origin server identifier. | ||||
| In special cases, it might be appropriate for a client to simply | Hence, the Connection header field provides a declarative way of | |||
| ignore the server's identity, but it must be understood that this | distinguishing fields that are only intended for the immediate | |||
| leaves a connection open to active attack. | recipient ("hop-by-hop") from those fields that are intended for all | |||
| recipients on the chain ("end-to-end"), enabling the message to be | ||||
| self-descriptive and allowing future connection-specific extensions | ||||
| to be deployed without fear that they will be blindly forwarded by | ||||
| older intermediaries. | ||||
| If the certificate is not valid for the URI's origin server, a user | Furthermore, intermediaries SHOULD remove or replace field(s) whose | |||
| agent MUST either notify the user (user agents MAY give the user an | semantics are known to require removal before forwarding, whether or | |||
| option to continue with the connection in any case) or terminate the | not they appear as a Connection option, after applying those fields' | |||
| connection with a bad certificate error. Automated clients MUST log | semantics. This includes but is not limited to: | |||
| the error to an appropriate audit log (if available) and SHOULD | ||||
| terminate the connection (with a bad certificate error). Automated | ||||
| clients MAY provide a configuration setting that disables this check, | ||||
| but MUST provide a setting which enables it. | ||||
| 6.4. Reconstructing the Target URI | o Proxy-Connection (Appendix C.1.2 of [Messaging]) | |||
| Once an inbound connection is obtained, the client sends an HTTP | o Keep-Alive (Section 19.7.1 of [RFC2068]) | |||
| request message (Section 2.1). | ||||
| Depending on the nature of the request, the client's target URI might | o TE (Section 9.1.4) | |||
| be split into components and transmitted (or implied) within various | o Trailer (Section 9.1.5) | |||
| parts of a request message. These parts are recombined by each | ||||
| recipient, in accordance with their local configuration and incoming | ||||
| connection context, to determine the target URI. Appendix of | ||||
| [Messaging] defines how a server determines the target URI for an | ||||
| HTTP/1.1 request. | ||||
| Once the target URI has been reconstructed, an origin server needs to | o Transfer-Encoding (Section 6.1 of [Messaging]) | |||
| decide whether or not to provide service for that URI via the | ||||
| connection in which the request was received. For example, the | ||||
| request might have been misdirected, deliberately or accidentally, | ||||
| such that the information within a received Host header field differs | ||||
| from the host or port upon which the connection has been made. If | ||||
| the connection is from a trusted gateway, that inconsistency might be | ||||
| expected; otherwise, it might indicate an attempt to bypass security | ||||
| filters, trick the server into delivering non-public content, or | ||||
| poison a cache. See Section 12 for security considerations regarding | ||||
| message routing. | ||||
| | *Note:* previous specifications defined the recomposed target | o Upgrade (Section 6.6) | |||
| | URI as a distinct concept, the effective request URI. | ||||
| 6.5. Host | The Connection header field's value has the following grammar: | |||
| The "Host" header field in a request provides the host and port | Connection = #connection-option | |||
| information from the target URI, enabling the origin server to | connection-option = token | |||
| distinguish among resources while servicing requests for multiple | ||||
| host names on a single IP address. | ||||
| Host = uri-host [ ":" port ] ; Section 2.4 | Connection options are case-insensitive. | |||
| Since the Host field value is critical information for handling a | A sender MUST NOT send a connection option corresponding to a field | |||
| request, a user agent SHOULD generate Host as the first field in the | that is intended for all recipients of the payload. For example, | |||
| header section. | Cache-Control is never appropriate as a connection option | |||
| (Section 5.2 of [Caching]). | ||||
| For example, a GET request to the origin server for | The connection options do not always correspond to a field present in | |||
| <http://www.example.org/pub/WWW/> would begin with: | the message, since a connection-specific field might not be needed if | |||
| there are no parameters associated with a connection option. In | ||||
| contrast, a connection-specific field that is received without a | ||||
| corresponding connection option usually indicates that the field has | ||||
| been improperly forwarded by an intermediary and ought to be ignored | ||||
| by the recipient. | ||||
| GET /pub/WWW/ HTTP/1.1 | When defining new connection options, specification authors ought to | |||
| Host: www.example.org | document it as reserved field name and register that definition in | |||
| the Hypertext Transfer Protocol (HTTP) Field Name Registry | ||||
| (Section 15.3.1), to avoid collisions. | ||||
| Since the Host header field acts as an application-level routing | 6.4.2. Max-Forwards | |||
| mechanism, it is a frequent target for malware seeking to poison a | ||||
| shared cache or redirect a request to an unintended server. An | ||||
| interception proxy is particularly vulnerable if it relies on the | ||||
| Host field value for redirecting requests to internal servers, or for | ||||
| use as a cache key in a shared cache, without first verifying that | ||||
| the intercepted connection is targeting a valid IP address for that | ||||
| host. | ||||
| 6.6. Message Forwarding | The "Max-Forwards" header field provides a mechanism with the TRACE | |||
| (Section 8.3.8) and OPTIONS (Section 8.3.7) request methods to limit | ||||
| the number of times that the request is forwarded by proxies. This | ||||
| can be useful when the client is attempting to trace a request that | ||||
| appears to be failing or looping mid-chain. | ||||
| As described in Section 2.2, intermediaries can serve a variety of | Max-Forwards = 1*DIGIT | |||
| roles in the processing of HTTP requests and responses. Some | ||||
| intermediaries are used to improve performance or availability. | ||||
| Others are used for access control or to filter content. Since an | ||||
| HTTP stream has characteristics similar to a pipe-and-filter | ||||
| architecture, there are no inherent limits to the extent an | ||||
| intermediary can enhance (or interfere) with either direction of the | ||||
| stream. | ||||
| An intermediary not acting as a tunnel MUST implement the Connection | The Max-Forwards value is a decimal integer indicating the remaining | |||
| header field, as specified in Section 6.8, and exclude fields from | number of times this request message can be forwarded. | |||
| being forwarded that are only intended for the incoming connection. | ||||
| An intermediary MUST NOT forward a message to itself unless it is | Each intermediary that receives a TRACE or OPTIONS request containing | |||
| protected from an infinite request loop. In general, an intermediary | a Max-Forwards header field MUST check and update its value prior to | |||
| ought to recognize its own server names, including any aliases, local | forwarding the request. If the received value is zero (0), the | |||
| variations, or literal IP addresses, and respond to such requests | intermediary MUST NOT forward the request; instead, the intermediary | |||
| directly. | MUST respond as the final recipient. If the received Max-Forwards | |||
| value is greater than zero, the intermediary MUST generate an updated | ||||
| Max-Forwards field in the forwarded message with a field value that | ||||
| is the lesser of a) the received value decremented by one (1) or b) | ||||
| the recipient's maximum supported value for Max-Forwards. | ||||
| An HTTP message can be parsed as a stream for incremental processing | A recipient MAY ignore a Max-Forwards header field received with any | |||
| or forwarding downstream. However, recipients cannot rely on | other request methods. | |||
| incremental delivery of partial messages, since some implementations | ||||
| will buffer or delay message forwarding for the sake of network | ||||
| efficiency, security checks, or payload transformations. | ||||
| 6.6.1. Via | 6.4.3. Via | |||
| The "Via" header field indicates the presence of intermediate | The "Via" header field indicates the presence of intermediate | |||
| protocols and recipients between the user agent and the server (on | protocols and recipients between the user agent and the server (on | |||
| requests) or between the origin server and the client (on responses), | requests) or between the origin server and the client (on responses), | |||
| similar to the "Received" header field in email (Section 3.6.7 of | similar to the "Received" header field in email (Section 3.6.7 of | |||
| [RFC5322]). Via can be used for tracking message forwards, avoiding | [RFC5322]). Via can be used for tracking message forwards, avoiding | |||
| request loops, and identifying the protocol capabilities of senders | request loops, and identifying the protocol capabilities of senders | |||
| along the request/response chain. | along the request/response chain. | |||
| Via = #( received-protocol RWS received-by [ RWS comment ] ) | Via = #( received-protocol RWS received-by [ RWS comment ] ) | |||
| received-protocol = [ protocol-name "/" ] protocol-version | received-protocol = [ protocol-name "/" ] protocol-version | |||
| ; see Section 6.7 | ; see Section 6.6 | |||
| received-by = pseudonym [ ":" port ] | received-by = pseudonym [ ":" port ] | |||
| pseudonym = token | pseudonym = token | |||
| Each member of the Via field value represents a proxy or gateway that | Each member of the Via field value represents a proxy or gateway that | |||
| has forwarded the message. Each intermediary appends its own | has forwarded the message. Each intermediary appends its own | |||
| information about how the message was received, such that the end | information about how the message was received, such that the end | |||
| result is ordered according to the sequence of forwarding recipients. | result is ordered according to the sequence of forwarding recipients. | |||
| A proxy MUST send an appropriate Via header field, as described | A proxy MUST send an appropriate Via header field, as described | |||
| below, in each message that it forwards. An HTTP-to-HTTP gateway | below, in each message that it forwards. An HTTP-to-HTTP gateway | |||
| MUST send an appropriate Via header field in each inbound request | MUST send an appropriate Via header field in each inbound request | |||
| message and MAY send a Via header field in forwarded response | message and MAY send a Via header field in forwarded response | |||
| messages. | messages. | |||
| For each intermediary, the received-protocol indicates the protocol | For each intermediary, the received-protocol indicates the protocol | |||
| and protocol version used by the upstream sender of the message. | and protocol version used by the upstream sender of the message. | |||
| Hence, the Via field value records the advertised protocol | Hence, the Via field value records the advertised protocol | |||
| capabilities of the request/response chain such that they remain | capabilities of the request/response chain such that they remain | |||
| visible to downstream recipients; this can be useful for determining | visible to downstream recipients; this can be useful for determining | |||
| what backwards-incompatible features might be safe to use in | what backwards-incompatible features might be safe to use in | |||
| response, or within a later request, as described in Section 4.2. | response, or within a later request, as described in Section 5.1. | |||
| For brevity, the protocol-name is omitted when the received protocol | For brevity, the protocol-name is omitted when the received protocol | |||
| is HTTP. | is HTTP. | |||
| The received-by portion is normally the host and optional port number | The received-by portion is normally the host and optional port number | |||
| of a recipient server or client that subsequently forwarded the | of a recipient server or client that subsequently forwarded the | |||
| message. However, if the real host is considered to be sensitive | message. However, if the real host is considered to be sensitive | |||
| information, a sender MAY replace it with a pseudonym. If a port is | information, a sender MAY replace it with a pseudonym. If a port is | |||
| not provided, a recipient MAY interpret that as meaning it was | not provided, a recipient MAY interpret that as meaning it was | |||
| received on the default TCP port, if any, for the received-protocol. | received on the default TCP port, if any, for the received-protocol. | |||
| skipping to change at page 53, line 10 ¶ | skipping to change at page 53, line 5 ¶ | |||
| could be collapsed to | could be collapsed to | |||
| Via: 1.0 ricky, 1.1 mertz, 1.0 lucy | Via: 1.0 ricky, 1.1 mertz, 1.0 lucy | |||
| A sender SHOULD NOT combine multiple list members unless they are all | A sender SHOULD NOT combine multiple list members unless they are all | |||
| under the same organizational control and the hosts have already been | under the same organizational control and the hosts have already been | |||
| replaced by pseudonyms. A sender MUST NOT combine members that have | replaced by pseudonyms. A sender MUST NOT combine members that have | |||
| different received-protocol values. | different received-protocol values. | |||
| 6.6.2. Transformations | 6.5. Transformations | |||
| Some intermediaries include features for transforming messages and | Some intermediaries include features for transforming messages and | |||
| their payloads. A proxy might, for example, convert between image | their payloads. A proxy might, for example, convert between image | |||
| formats in order to save cache space or to reduce the amount of | formats in order to save cache space or to reduce the amount of | |||
| traffic on a slow link. However, operational problems might occur | traffic on a slow link. However, operational problems might occur | |||
| when these transformations are applied to payloads intended for | when these transformations are applied to payloads intended for | |||
| critical applications, such as medical imaging or scientific data | critical applications, such as medical imaging or scientific data | |||
| analysis, particularly when integrity checks or digital signatures | analysis, particularly when integrity checks or digital signatures | |||
| are used to ensure that the payload received is identical to the | are used to ensure that the payload received is identical to the | |||
| original. | original. | |||
| skipping to change at page 53, line 32 ¶ | skipping to change at page 53, line 27 ¶ | |||
| An HTTP-to-HTTP proxy is called a "transforming proxy" if it is | An HTTP-to-HTTP proxy is called a "transforming proxy" if it is | |||
| designed or configured to modify messages in a semantically | designed or configured to modify messages in a semantically | |||
| meaningful way (i.e., modifications, beyond those required by normal | meaningful way (i.e., modifications, beyond those required by normal | |||
| HTTP processing, that change the message in a way that would be | HTTP processing, that change the message in a way that would be | |||
| significant to the original sender or potentially significant to | significant to the original sender or potentially significant to | |||
| downstream recipients). For example, a transforming proxy might be | downstream recipients). For example, a transforming proxy might be | |||
| acting as a shared annotation server (modifying responses to include | acting as a shared annotation server (modifying responses to include | |||
| references to a local annotation database), a malware filter, a | references to a local annotation database), a malware filter, a | |||
| format transcoder, or a privacy filter. Such transformations are | format transcoder, or a privacy filter. Such transformations are | |||
| presumed to be desired by whichever client (or client organization) | presumed to be desired by whichever client (or client organization) | |||
| selected the proxy. | chose the proxy. | |||
| If a proxy receives a target URI with a host name that is not a fully | If a proxy receives a target URI with a host name that is not a fully | |||
| qualified domain name, it MAY add its own domain to the host name it | qualified domain name, it MAY add its own domain to the host name it | |||
| received when forwarding the request. A proxy MUST NOT change the | received when forwarding the request. A proxy MUST NOT change the | |||
| host name if the target URI contains a fully qualified domain name. | host name if the target URI contains a fully qualified domain name. | |||
| A proxy MUST NOT modify the "absolute-path" and "query" parts of the | A proxy MUST NOT modify the "absolute-path" and "query" parts of the | |||
| received target URI when forwarding it to the next inbound server, | received target URI when forwarding it to the next inbound server, | |||
| except as noted above to replace an empty path with "/" or "*". | except as noted above to replace an empty path with "/" or "*". | |||
| A proxy MUST NOT transform the payload (Section 7.3) of a message | A proxy MUST NOT transform the payload (Section 5.5) of a message | |||
| that contains a no-transform cache-control response directive | that contains a no-transform cache-control response directive | |||
| (Section 5.2 of [Caching]). Note that this does not include changes | (Section 5.2 of [Caching]). Note that this does not include changes | |||
| to the message body that do not affect the payload, such as transfer | to the message body that do not affect the payload, such as transfer | |||
| codings (Section 7 of [Messaging]). | codings (Section 7 of [Messaging]). | |||
| A proxy MAY transform the payload of a message that does not contain | A proxy MAY transform the payload of a message that does not contain | |||
| a no-transform cache-control directive. A proxy that transforms the | a no-transform cache-control directive. A proxy that transforms the | |||
| payload of a 200 (OK) response can inform downstream recipients that | payload of a 200 (OK) response can inform downstream recipients that | |||
| a transformation has been applied by changing the response status | a transformation has been applied by changing the response status | |||
| code to 203 (Non-Authoritative Information) (Section 10.3.4). | code to 203 (Non-Authoritative Information) (Section 14.3.4). | |||
| A proxy SHOULD NOT modify header fields that provide information | A proxy SHOULD NOT modify header fields that provide information | |||
| about the endpoints of the communication chain, the resource state, | about the endpoints of the communication chain, the resource state, | |||
| or the selected representation (other than the payload) unless the | or the selected representation (other than the payload) unless the | |||
| field's definition specifically allows such modification or the | field's definition specifically allows such modification or the | |||
| modification is deemed necessary for privacy or security. | modification is deemed necessary for privacy or security. | |||
| 6.7. Upgrading HTTP | 6.6. Upgrade | |||
| The "Upgrade" header field is intended to provide a simple mechanism | The "Upgrade" header field is intended to provide a simple mechanism | |||
| for transitioning from HTTP/1.1 to some other protocol on the same | for transitioning from HTTP/1.1 to some other protocol on the same | |||
| connection. | connection. | |||
| A client MAY send a list of protocol names in the Upgrade header | A client MAY send a list of protocol names in the Upgrade header | |||
| field of a request to invite the server to switch to one or more of | field of a request to invite the server to switch to one or more of | |||
| the named protocols, in order of descending preference, before | the named protocols, in order of descending preference, before | |||
| sending the final response. A server MAY ignore a received Upgrade | sending the final response. A server MAY ignore a received Upgrade | |||
| header field if it wishes to continue using the current protocol on | header field if it wishes to continue using the current protocol on | |||
| skipping to change at page 56, line 6 ¶ | skipping to change at page 55, line 43 ¶ | |||
| request: | request: | |||
| HTTP/1.1 101 Switching Protocols | HTTP/1.1 101 Switching Protocols | |||
| Connection: upgrade | Connection: upgrade | |||
| Upgrade: websocket | Upgrade: websocket | |||
| [... data stream switches to websocket with an appropriate response | [... data stream switches to websocket with an appropriate response | |||
| (as defined by new protocol) to the "GET /hello" request ...] | (as defined by new protocol) to the "GET /hello" request ...] | |||
| When Upgrade is sent, the sender MUST also send a Connection header | When Upgrade is sent, the sender MUST also send a Connection header | |||
| field (Section 6.8) that contains an "upgrade" connection option, in | field (Section 6.4.1) that contains an "upgrade" connection option, | |||
| order to prevent Upgrade from being accidentally forwarded by | in order to prevent Upgrade from being accidentally forwarded by | |||
| intermediaries that might not implement the listed protocols. A | intermediaries that might not implement the listed protocols. A | |||
| server MUST ignore an Upgrade header field that is received in an | server MUST ignore an Upgrade header field that is received in an | |||
| HTTP/1.0 request. | HTTP/1.0 request. | |||
| A client cannot begin using an upgraded protocol on the connection | A client cannot begin using an upgraded protocol on the connection | |||
| until it has completely sent the request message (i.e., the client | until it has completely sent the request message (i.e., the client | |||
| can't change the protocol it is sending in the middle of a message). | can't change the protocol it is sending in the middle of a message). | |||
| If a server receives both an Upgrade and an Expect header field with | If a server receives both an Upgrade and an Expect header field with | |||
| the "100-continue" expectation (Section 9.1.1), the server MUST send | the "100-continue" expectation (Section 9.1.1), the server MUST send | |||
| a 100 (Continue) response before sending a 101 (Switching Protocols) | a 100 (Continue) response before sending a 101 (Switching Protocols) | |||
| response. | response. | |||
| The Upgrade header field only applies to switching protocols on top | The Upgrade header field only applies to switching protocols on top | |||
| of the existing connection; it cannot be used to switch the | of the existing connection; it cannot be used to switch the | |||
| underlying connection (transport) protocol, nor to switch the | underlying connection (transport) protocol, nor to switch the | |||
| existing communication to a different connection. For those | existing communication to a different connection. For those | |||
| purposes, it is more appropriate to use a 3xx (Redirection) response | purposes, it is more appropriate to use a 3xx (Redirection) response | |||
| (Section 10.4). | (Section 14.4). | |||
| 6.7.1. Upgrade Protocol Names | ||||
| This specification only defines the protocol name "HTTP" for use by | This specification only defines the protocol name "HTTP" for use by | |||
| the family of Hypertext Transfer Protocols, as defined by the HTTP | the family of Hypertext Transfer Protocols, as defined by the HTTP | |||
| version rules of Section 4.2 and future updates to this | version rules of Section 5.1 and future updates to this | |||
| specification. Additional protocol names ought to be registered | specification. Additional protocol names ought to be registered | |||
| using the registration procedure defined in Section 6.7.2. | using the registration procedure defined in Section 15.7. | |||
| ------ ------------------- ------------------------- ------ | ||||
| Name Description Expected Version Tokens Ref. | ||||
| ------ ------------------- ------------------------- ------ | ||||
| HTTP Hypertext any DIGIT.DIGIT (e.g, 4.2 | ||||
| Transfer Protocol "2.0") | ||||
| ------ ------------------- ------------------------- ------ | ||||
| Table 5 | ||||
| 6.7.2. Upgrade Token Registry | ||||
| The "Hypertext Transfer Protocol (HTTP) Upgrade Token Registry" | ||||
| defines the namespace for protocol-name tokens used to identify | ||||
| protocols in the Upgrade header field. The registry is maintained at | ||||
| <https://www.iana.org/assignments/http-upgrade-tokens>. | ||||
| Each registered protocol name is associated with contact information | ||||
| and an optional set of specifications that details how the connection | ||||
| will be processed after it has been upgraded. | ||||
| Registrations happen on a "First Come First Served" basis (see | ||||
| Section 4.4 of [RFC8126]) and are subject to the following rules: | ||||
| 1. A protocol-name token, once registered, stays registered forever. | ||||
| 2. A protocol-name token is case-insensitive and registered with the | ||||
| preferred case to be generated by senders. | ||||
| 3. The registration MUST name a responsible party for the | ||||
| registration. | ||||
| 4. The registration MUST name a point of contact. | ||||
| 5. The registration MAY name a set of specifications associated with | ||||
| that token. Such specifications need not be publicly available. | ||||
| 6. The registration SHOULD name a set of expected "protocol-version" | ||||
| tokens associated with that token at the time of registration. | ||||
| 7. The responsible party MAY change the registration at any time. | ||||
| The IANA will keep a record of all such changes, and make them | ||||
| available upon request. | ||||
| 8. The IESG MAY reassign responsibility for a protocol token. This | ||||
| will normally only be used in the case when a responsible party | ||||
| cannot be contacted. | ||||
| 6.8. Connection-Specific Fields | ||||
| The "Connection" header field allows the sender to list desired | ||||
| control options for the current connection. | ||||
| When a field aside from Connection is used to supply control | ||||
| information for or about the current connection, the sender MUST list | ||||
| the corresponding field name within the Connection header field. | ||||
| Note that some versions of HTTP prohibit the use of fields for such | ||||
| information, and therefore do not allow the Connection field. | ||||
| Intermediaries MUST parse a received Connection header field before a | ||||
| message is forwarded and, for each connection-option in this field, | ||||
| remove any header or trailer field(s) from the message with the same | ||||
| name as the connection-option, and then remove the Connection header | ||||
| field itself (or replace it with the intermediary's own connection | ||||
| options for the forwarded message). | ||||
| Hence, the Connection header field provides a declarative way of | ||||
| distinguishing fields that are only intended for the immediate | ||||
| recipient ("hop-by-hop") from those fields that are intended for all | ||||
| recipients on the chain ("end-to-end"), enabling the message to be | ||||
| self-descriptive and allowing future connection-specific extensions | ||||
| to be deployed without fear that they will be blindly forwarded by | ||||
| older intermediaries. | ||||
| Furthermore, intermediaries SHOULD remove or replace field(s) whose | ||||
| semantics are known to require removal before forwarding, whether or | ||||
| not they appear as a Connection option, after applying those fields' | ||||
| semantics. This includes but is not limited to: | ||||
| o Proxy-Connection (Appendix C.1.2 of [Messaging]) | ||||
| o Keep-Alive (Section 19.7.1 of [RFC2068]) | ||||
| o TE (Section 5.6.5) | ||||
| o Trailer (Section 5.6.4) | ||||
| o Transfer-Encoding (Section 6.1 of [Messaging]) | ||||
| o Upgrade (Section 6.7) | ||||
| The Connection header field's value has the following grammar: | ||||
| Connection = #connection-option | ||||
| connection-option = token | ||||
| Connection options are case-insensitive. | ||||
| A sender MUST NOT send a connection option corresponding to a field | ||||
| that is intended for all recipients of the payload. For example, | ||||
| Cache-Control is never appropriate as a connection option | ||||
| (Section 5.2 of [Caching]). | ||||
| The connection options do not always correspond to a field present in | 7. Representations | |||
| the message, since a connection-specific field might not be needed if | ||||
| there are no parameters associated with a connection option. In | ||||
| contrast, a connection-specific field that is received without a | ||||
| corresponding connection option usually indicates that the field has | ||||
| been improperly forwarded by an intermediary and ought to be ignored | ||||
| by the recipient. | ||||
| When defining new connection options, specification authors ought to | A "representation" is information that is intended to reflect a past, | |||
| document it as reserved field name and register that definition in | current, or desired state of a given resource, in a format that can | |||
| the Hypertext Transfer Protocol (HTTP) Field Name Registry | be readily communicated via the protocol. A representation consists | |||
| (Section 5.3.2), to avoid collisions. | of a set of representation metadata and a potentially unbounded | |||
| stream of representation data. | ||||
| 7. Representations | HTTP allows "information hiding" behind its uniform interface by | |||
| phrasing communication with respect to a transferable representation | ||||
| of the resource state, rather than transferring the resource itself. | ||||
| This allows the resource identified by a URI to be anything, | ||||
| including temporal functions like "the current weather in Laguna | ||||
| Beach", while potentially providing information that represents that | ||||
| resource at the time a message is generated [REST]. | ||||
| Considering that a resource could be anything, and that the uniform | The uniform interface is similar to a window through which one can | |||
| interface provided by HTTP is similar to a window through which one | observe and act upon a thing only through the communication of | |||
| can observe and act upon such a thing only through the communication | messages to an independent actor on the other side. A shared | |||
| of messages to some independent actor on the other side, an | ||||
| abstraction is needed to represent ("take the place of") the current | abstraction is needed to represent ("take the place of") the current | |||
| or desired state of that thing in our communications. That | or desired state of that thing in our communications. When a | |||
| abstraction is called a representation [REST]. | representation is hypertext, it can provide both a representation of | |||
| the resource state and processing instructions that help guide the | ||||
| recipient's future interactions. | ||||
| For the purposes of HTTP, a "representation" is information that is | 7.1. Selected Representation | |||
| intended to reflect a past, current, or desired state of a given | ||||
| resource, in a format that can be readily communicated via the | ||||
| protocol, and that consists of a set of representation metadata and a | ||||
| potentially unbounded stream of representation data. | ||||
| An origin server might be provided with, or be capable of generating, | An origin server might be provided with, or be capable of generating, | |||
| multiple representations that are each intended to reflect the | multiple representations that are each intended to reflect the | |||
| current state of a target resource. In such cases, some algorithm is | current state of a target resource. In such cases, some algorithm is | |||
| used by the origin server to select one of those representations as | used by the origin server to select one of those representations as | |||
| most applicable to a given request, usually based on content | most applicable to a given request, usually based on content | |||
| negotiation. This "selected representation" is used to provide the | negotiation. This "selected representation" is used to provide the | |||
| data and metadata for evaluating conditional requests (Section 9.2) | data and metadata for evaluating conditional requests (Section 12.1) | |||
| and constructing the payload for 200 (OK), 206 (Partial Content), and | and constructing the payload for 200 (OK), 206 (Partial Content), and | |||
| 304 (Not Modified) responses to GET (Section 8.3.1). | 304 (Not Modified) responses to GET (Section 8.3.1). | |||
| 7.1. Representation Data | 7.2. Data | |||
| The representation data associated with an HTTP message is either | The representation data associated with an HTTP message is either | |||
| provided as the payload body of the message or referred to by the | provided as the payload body of the message or referred to by the | |||
| message semantics and the target URI. The representation data is in | message semantics and the target URI. The representation data is in | |||
| a format and encoding defined by the representation metadata header | a format and encoding defined by the representation metadata header | |||
| fields. | fields. | |||
| The data type of the representation data is determined via the header | The data type of the representation data is determined via the header | |||
| fields Content-Type and Content-Encoding. These define a two-layer, | fields Content-Type and Content-Encoding. These define a two-layer, | |||
| ordered encoding model: | ordered encoding model: | |||
| representation-data := Content-Encoding( Content-Type( bits ) ) | representation-data := Content-Encoding( Content-Type( bits ) ) | |||
| 7.1.1. Media Type | 7.3. Metadata | |||
| HTTP uses media types [RFC2046] in the Content-Type (Section 7.2.1) | Representation header fields provide metadata about the | |||
| and Accept (Section 9.4.1) header fields in order to provide open and | representation. When a message includes a payload body, the | |||
| representation header fields describe how to interpret the | ||||
| representation data enclosed in the payload body. In a response to a | ||||
| HEAD request, the representation header fields describe the | ||||
| representation data that would have been enclosed in the payload body | ||||
| if the same request had been a GET. | ||||
| The following header fields convey representation metadata: | ||||
| ------------------ ------ | ||||
| Field Name Ref. | ||||
| ------------------ ------ | ||||
| Content-Type 7.4 | ||||
| Content-Encoding 7.5 | ||||
| Content-Language 7.6 | ||||
| Content-Length 7.7 | ||||
| Content-Location 7.8 | ||||
| ------------------ ------ | ||||
| Table 3 | ||||
| 7.4. Content-Type | ||||
| The "Content-Type" header field indicates the media type of the | ||||
| associated representation: either the representation enclosed in the | ||||
| message payload or the selected representation, as determined by the | ||||
| message semantics. The indicated media type defines both the data | ||||
| format and how that data is intended to be processed by a recipient, | ||||
| within the scope of the received message semantics, after any content | ||||
| codings indicated by Content-Encoding are decoded. | ||||
| Content-Type = media-type | ||||
| Media types are defined in Section 7.4.1. An example of the field is | ||||
| Content-Type: text/html; charset=ISO-8859-4 | ||||
| A sender that generates a message containing a payload body SHOULD | ||||
| generate a Content-Type header field in that message unless the | ||||
| intended media type of the enclosed representation is unknown to the | ||||
| sender. If a Content-Type header field is not present, the recipient | ||||
| MAY either assume a media type of "application/octet-stream" | ||||
| ([RFC2046], Section 4.5.1) or examine the data to determine its type. | ||||
| In practice, resource owners do not always properly configure their | ||||
| origin server to provide the correct Content-Type for a given | ||||
| representation. Some user agents examine a payload's content and, in | ||||
| certain cases, override the received type (for example, see | ||||
| [Sniffing]). This "MIME sniffing" risks drawing incorrect | ||||
| conclusions about the data, which might expose the user to additional | ||||
| security risks (e.g., "privilege escalation"). Furthermore, it is | ||||
| impossible to determine the sender's intended processing model by | ||||
| examining the data format: many data formats match multiple media | ||||
| types that differ only in processing semantics. Implementers are | ||||
| encouraged to provide a means to disable such sniffing. | ||||
| Furthermore, although Content-Type is defined as a singleton field, | ||||
| it is sometimes incorrectly generated multiple times, resulting in a | ||||
| combined field value that appears to be a list. Recipients often | ||||
| attempt to handle this error by using the last syntactically valid | ||||
| member of the list, but note that some implementations might have | ||||
| different error handling behaviors, leading to interoperability and/ | ||||
| or security issues. | ||||
| 7.4.1. Media Type | ||||
| HTTP uses media types [RFC2046] in the Content-Type (Section 7.4) and | ||||
| Accept (Section 11.1.2) header fields in order to provide open and | ||||
| extensible data typing and type negotiation. Media types define both | extensible data typing and type negotiation. Media types define both | |||
| a data format and various processing models: how to process that data | a data format and various processing models: how to process that data | |||
| in accordance with each context in which it is received. | in accordance with each context in which it is received. | |||
| media-type = type "/" subtype parameters | media-type = type "/" subtype parameters | |||
| type = token | type = token | |||
| subtype = token | subtype = token | |||
| The type and subtype tokens are case-insensitive. | The type and subtype tokens are case-insensitive. | |||
| The type/subtype MAY be followed by semicolon-delimited parameters | The type/subtype MAY be followed by semicolon-delimited parameters | |||
| (Section 5.4.1.4) in the form of name=value pairs. The presence or | (Section 5.7.6) in the form of name=value pairs. The presence or | |||
| absence of a parameter might be significant to the processing of a | absence of a parameter might be significant to the processing of a | |||
| media type, depending on its definition within the media type | media type, depending on its definition within the media type | |||
| registry. Parameter values might or might not be case-sensitive, | registry. Parameter values might or might not be case-sensitive, | |||
| depending on the semantics of the parameter name. | depending on the semantics of the parameter name. | |||
| For example, the following media types are equivalent in describing | For example, the following media types are equivalent in describing | |||
| HTML text data encoded in the UTF-8 character encoding scheme, but | HTML text data encoded in the UTF-8 character encoding scheme, but | |||
| the first is preferred for consistency (the "charset" parameter value | the first is preferred for consistency (the "charset" parameter value | |||
| is defined as being case-insensitive in [RFC2046], Section 4.1.2): | is defined as being case-insensitive in [RFC2046], Section 4.1.2): | |||
| text/html;charset=utf-8 | text/html;charset=utf-8 | |||
| Text/HTML;Charset="utf-8" | Text/HTML;Charset="utf-8" | |||
| text/html; charset="utf-8" | text/html; charset="utf-8" | |||
| text/html;charset=UTF-8 | text/html;charset=UTF-8 | |||
| Media types ought to be registered with IANA according to the | Media types ought to be registered with IANA according to the | |||
| procedures defined in [BCP13]. | procedures defined in [BCP13]. | |||
| 7.1.1.1. Charset | 7.4.2. Charset | |||
| HTTP uses charset names to indicate or negotiate the character | HTTP uses charset names to indicate or negotiate the character | |||
| encoding scheme of a textual representation [RFC6365]. A charset is | encoding scheme of a textual representation [RFC6365]. A charset is | |||
| identified by a case-insensitive token. | identified by a case-insensitive token. | |||
| charset = token | charset = token | |||
| Charset names ought to be registered in the IANA "Character Sets" | Charset names ought to be registered in the IANA "Character Sets" | |||
| registry (<https://www.iana.org/assignments/character-sets>) | registry (<https://www.iana.org/assignments/character-sets>) | |||
| according to the procedures defined in Section 2 of [RFC2978]. | according to the procedures defined in Section 2 of [RFC2978]. | |||
| | *Note:* In theory, charset names are defined by the "mime- | | *Note:* In theory, charset names are defined by the "mime- | |||
| | charset" ABNF rule defined in Section 2.3 of [RFC2978] (as | | charset" ABNF rule defined in Section 2.3 of [RFC2978] (as | |||
| | corrected in [Err1912]). That rule allows two characters that | | corrected in [Err1912]). That rule allows two characters that | |||
| | are not included in "token" ("{" and "}"), but no charset name | | are not included in "token" ("{" and "}"), but no charset name | |||
| | registered at the time of this writing includes braces (see | | registered at the time of this writing includes braces (see | |||
| | [Err5433]). | | [Err5433]). | |||
| 7.1.1.2. Canonicalization and Text Defaults | 7.4.3. Canonicalization and Text Defaults | |||
| Media types are registered with a canonical form in order to be | Media types are registered with a canonical form in order to be | |||
| interoperable among systems with varying native encoding formats. | interoperable among systems with varying native encoding formats. | |||
| Representations selected or transferred via HTTP ought to be in | Representations selected or transferred via HTTP ought to be in | |||
| canonical form, for many of the same reasons described by the | canonical form, for many of the same reasons described by the | |||
| Multipurpose Internet Mail Extensions (MIME) [RFC2045]. However, the | Multipurpose Internet Mail Extensions (MIME) [RFC2045]. However, the | |||
| performance characteristics of email deployments (i.e., store and | performance characteristics of email deployments (i.e., store and | |||
| forward messages to peers) are significantly different from those | forward messages to peers) are significantly different from those | |||
| common to HTTP and the Web (server-based information services). | common to HTTP and the Web (server-based information services). | |||
| Furthermore, MIME's constraints for the sake of compatibility with | Furthermore, MIME's constraints for the sake of compatibility with | |||
| skipping to change at page 61, line 42 ¶ | skipping to change at page 61, line 5 ¶ | |||
| addition, text media in HTTP is not limited to charsets that use | addition, text media in HTTP is not limited to charsets that use | |||
| octets 13 and 10 for CR and LF, respectively. This flexibility | octets 13 and 10 for CR and LF, respectively. This flexibility | |||
| regarding line breaks applies only to text within a representation | regarding line breaks applies only to text within a representation | |||
| that has been assigned a "text" media type; it does not apply to | that has been assigned a "text" media type; it does not apply to | |||
| "multipart" types or HTTP elements outside the payload body (e.g., | "multipart" types or HTTP elements outside the payload body (e.g., | |||
| header fields). | header fields). | |||
| If a representation is encoded with a content-coding, the underlying | If a representation is encoded with a content-coding, the underlying | |||
| data ought to be in a form defined above prior to being encoded. | data ought to be in a form defined above prior to being encoded. | |||
| 7.1.1.3. Multipart Types | 7.4.4. Multipart Types | |||
| MIME provides for a number of "multipart" types - encapsulations of | MIME provides for a number of "multipart" types - encapsulations of | |||
| one or more representations within a single message body. All | one or more representations within a single message body. All | |||
| multipart types share a common syntax, as defined in Section 5.1.1 of | multipart types share a common syntax, as defined in Section 5.1.1 of | |||
| [RFC2046], and include a boundary parameter as part of the media type | [RFC2046], and include a boundary parameter as part of the media type | |||
| value. The message body is itself a protocol element; a sender MUST | value. The message body is itself a protocol element; a sender MUST | |||
| generate only CRLF to represent line breaks between body parts. | generate only CRLF to represent line breaks between body parts. | |||
| HTTP message framing does not use the multipart boundary as an | HTTP message framing does not use the multipart boundary as an | |||
| indicator of message body length, though it might be used by | indicator of message body length, though it might be used by | |||
| implementations that generate or process the payload. For example, | implementations that generate or process the payload. For example, | |||
| the "multipart/form-data" type is often used for carrying form data | the "multipart/form-data" type is often used for carrying form data | |||
| in a request, as described in [RFC7578], and the "multipart/ | in a request, as described in [RFC7578], and the "multipart/ | |||
| byteranges" type is defined by this specification for use in some 206 | byteranges" type is defined by this specification for use in some 206 | |||
| (Partial Content) responses (see Section 10.3.7). | (Partial Content) responses (see Section 14.3.7). | |||
| 7.1.2. Content Codings | ||||
| Content coding values indicate an encoding transformation that has | ||||
| been or can be applied to a representation. Content codings are | ||||
| primarily used to allow a representation to be compressed or | ||||
| otherwise usefully transformed without losing the identity of its | ||||
| underlying media type and without loss of information. Frequently, | ||||
| the representation is stored in coded form, transmitted directly, and | ||||
| only decoded by the final recipient. | ||||
| content-coding = token | ||||
| All content codings are case-insensitive and ought to be registered | ||||
| within the "HTTP Content Coding Registry", as defined in | ||||
| Section 7.1.2.4 | ||||
| Content-coding values are used in the Accept-Encoding (Section 9.4.3) | ||||
| and Content-Encoding (Section 7.2.2) header fields. | ||||
| The following content-coding values are defined by this | ||||
| specification: | ||||
| ------------ ------------------------------------------- --------- | ||||
| Name Description Ref. | ||||
| ------------ ------------------------------------------- --------- | ||||
| compress UNIX "compress" data format [Welch] 7.1.2.1 | ||||
| deflate "deflate" compressed data ([RFC1951]) 7.1.2.2 | ||||
| inside the "zlib" data format ([RFC1950]) | ||||
| gzip GZIP file format [RFC1952] 7.1.2.3 | ||||
| identity Reserved 9.4.3 | ||||
| x-compress Deprecated (alias for compress) 7.1.2.1 | ||||
| x-gzip Deprecated (alias for gzip) 7.1.2.3 | ||||
| ------------ ------------------------------------------- --------- | ||||
| Table 6 | ||||
| 7.1.2.1. Compress Coding | ||||
| The "compress" coding is an adaptive Lempel-Ziv-Welch (LZW) coding | ||||
| [Welch] that is commonly produced by the UNIX file compression | ||||
| program "compress". A recipient SHOULD consider "x-compress" to be | ||||
| equivalent to "compress". | ||||
| 7.1.2.2. Deflate Coding | ||||
| The "deflate" coding is a "zlib" data format [RFC1950] containing a | ||||
| "deflate" compressed data stream [RFC1951] that uses a combination of | ||||
| the Lempel-Ziv (LZ77) compression algorithm and Huffman coding. | ||||
| | *Note:* Some non-conformant implementations send the "deflate" | ||||
| | compressed data without the zlib wrapper. | ||||
| 7.1.2.3. Gzip Coding | ||||
| The "gzip" coding is an LZ77 coding with a 32-bit Cyclic Redundancy | ||||
| Check (CRC) that is commonly produced by the gzip file compression | ||||
| program [RFC1952]. A recipient SHOULD consider "x-gzip" to be | ||||
| equivalent to "gzip". | ||||
| 7.1.2.4. Content Coding Registry | ||||
| The "HTTP Content Coding Registry", maintained by IANA at | ||||
| <https://www.iana.org/assignments/http-parameters/>, registers | ||||
| content-coding names. | ||||
| Content coding registrations MUST include the following fields: | ||||
| o Name | ||||
| o Description | ||||
| o Pointer to specification text | ||||
| Names of content codings MUST NOT overlap with names of transfer | ||||
| codings (Section 7 of [Messaging]), unless the encoding | ||||
| transformation is identical (as is the case for the compression | ||||
| codings defined in Section 7.1.2). | ||||
| Values to be added to this namespace require IETF Review (see | ||||
| Section 4.8 of [RFC8126]) and MUST conform to the purpose of content | ||||
| coding defined in Section 7.1.2. | ||||
| New content codings ought to be self-descriptive whenever possible, | ||||
| with optional parameters discoverable within the coding format | ||||
| itself, rather than rely on external metadata that might be lost | ||||
| during transit. | ||||
| 7.1.3. Language Tags | ||||
| A language tag, as defined in [RFC5646], identifies a natural | ||||
| language spoken, written, or otherwise conveyed by human beings for | ||||
| communication of information to other human beings. Computer | ||||
| languages are explicitly excluded. | ||||
| HTTP uses language tags within the Accept-Language and | ||||
| Content-Language header fields. Accept-Language uses the broader | ||||
| language-range production defined in Section 9.4.4, whereas | ||||
| Content-Language uses the language-tag production defined below. | ||||
| language-tag = <Language-Tag, see [RFC5646], Section 2.1> | ||||
| A language tag is a sequence of one or more case-insensitive subtags, | ||||
| each separated by a hyphen character ("-", %x2D). In most cases, a | ||||
| language tag consists of a primary language subtag that identifies a | ||||
| broad family of related languages (e.g., "en" = English), which is | ||||
| optionally followed by a series of subtags that refine or narrow that | ||||
| language's range (e.g., "en-CA" = the variety of English as | ||||
| communicated in Canada). Whitespace is not allowed within a language | ||||
| tag. Example tags include: | ||||
| fr, en-US, es-419, az-Arab, x-pig-latin, man-Nkoo-GN | ||||
| See [RFC5646] for further information. | ||||
| 7.1.4. Range Units | ||||
| Representation data can be partitioned into subranges when there are | ||||
| addressable structural units inherent to that data's content coding | ||||
| or media type. For example, octet (a.k.a., byte) boundaries are a | ||||
| structural unit common to all representation data, allowing | ||||
| partitions of the data to be identified as a range of bytes at some | ||||
| offset from the start or end of that data. | ||||
| This general notion of a "range unit" is used in the Accept-Ranges | ||||
| (Section 11.4.1) response header field to advertise support for range | ||||
| requests, the Range (Section 9.3) request header field to delineate | ||||
| the parts of a representation that are requested, and the | ||||
| Content-Range (Section 7.3.4) payload header field to describe which | ||||
| part of a representation is being transferred. | ||||
| range-unit = token | ||||
| All range unit names are case-insensitive and ought to be registered | ||||
| within the "HTTP Range Unit Registry", as defined in Section 7.1.4.4 | ||||
| The following range unit names are defined by this document: | ||||
| ----------------- ---------------------------------- --------- | ||||
| Range Unit Name Description Ref. | ||||
| ----------------- ---------------------------------- --------- | ||||
| bytes a range of octets 7.1.4.2 | ||||
| none reserved as keyword to indicate 11.4.1 | ||||
| range requests are not supported | ||||
| ----------------- ---------------------------------- --------- | ||||
| Table 7 | ||||
| 7.1.4.1. Range Specifiers | ||||
| Ranges are expressed in terms of a range unit paired with a set of | ||||
| range specifiers. The range unit name determines what kinds of | ||||
| range-spec are applicable to its own specifiers. Hence, the | ||||
| following gramar is generic: each range unit is expected to specify | ||||
| requirements on when int-range, suffix-range, and other-range are | ||||
| allowed. | ||||
| A range request can specify a single range or a set of ranges within | ||||
| a single representation. | ||||
| ranges-specifier = range-unit "=" range-set | ||||
| range-set = 1#range-spec | ||||
| range-spec = int-range | ||||
| / suffix-range | ||||
| / other-range | ||||
| An int-range is a range expressed as two non-negative integers or as | ||||
| one non-negative integer through to the end of the representation | ||||
| data. The range unit specifies what the integers mean (e.g., they | ||||
| might indicate unit offsets from the beginning, inclusive numbered | ||||
| parts, etc.). | ||||
| int-range = first-pos "-" [ last-pos ] | ||||
| first-pos = 1*DIGIT | ||||
| last-pos = 1*DIGIT | ||||
| An int-range is invalid if the last-pos value is present and less | ||||
| than the first-pos. | ||||
| A suffix-range is a range expressed as a suffix of the representation | ||||
| data with the provided non-negative integer maximum length (in range | ||||
| units). In other words, the last N units of the representation data. | ||||
| suffix-range = "-" suffix-length | ||||
| suffix-length = 1*DIGIT | ||||
| To provide for extensibility, the other-range rule is a mostly | ||||
| unconstrained grammar that allows application-specific or future | ||||
| range units to define additional range specifiers. | ||||
| other-range = 1*( %x21-2B / %x2D-7E ) | ||||
| ; 1*(VCHAR excluding comma) | ||||
| 7.1.4.2. Byte Ranges | ||||
| The "bytes" range unit is used to express subranges of a | ||||
| representation data's octet sequence. Each byte range is expressed | ||||
| as an integer range at some offset, relative to either the beginning | ||||
| (int-range) or end (suffix-range) of the representation data. Byte | ||||
| ranges do not use the other-range specifier. | ||||
| The first-pos value in a bytes int-range gives the offset of the | ||||
| first byte in a range. The last-pos value gives the offset of the | ||||
| last byte in the range; that is, the byte positions specified are | ||||
| inclusive. Byte offsets start at zero. | ||||
| If the representation data has a content coding applied, each byte | ||||
| range is calculated with respect to the encoded sequence of bytes, | ||||
| not the sequence of underlying bytes that would be obtained after | ||||
| decoding. | ||||
| Examples of bytes range specifiers: | ||||
| o The first 500 bytes (byte offsets 0-499, inclusive): | ||||
| bytes=0-499 | ||||
| o The second 500 bytes (byte offsets 500-999, inclusive): | ||||
| bytes=500-999 | ||||
| A client can limit the number of bytes requested without knowing the | ||||
| size of the selected representation. If the last-pos value is | ||||
| absent, or if the value is greater than or equal to the current | ||||
| length of the representation data, the byte range is interpreted as | ||||
| the remainder of the representation (i.e., the server replaces the | ||||
| value of last-pos with a value that is one less than the current | ||||
| length of the selected representation). | ||||
| A client can request the last N bytes (N > 0) of the selected | ||||
| representation using a suffix-range. If the selected representation | ||||
| is shorter than the specified suffix-length, the entire | ||||
| representation is used. | ||||
| Additional examples, assuming a representation of length 10000: | ||||
| o The final 500 bytes (byte offsets 9500-9999, inclusive): | ||||
| bytes=-500 | ||||
| Or: | ||||
| bytes=9500- | ||||
| o The first and last bytes only (bytes 0 and 9999): | ||||
| bytes=0-0,-1 | ||||
| o The first, middle, and last 1000 bytes: | ||||
| bytes= 0-999, 4500-5499, -1000 | ||||
| o Other valid (but not canonical) specifications of the second 500 | ||||
| bytes (byte offsets 500-999, inclusive): | ||||
| bytes=500-600,601-999 | ||||
| bytes=500-700,601-999 | ||||
| If a valid bytes range-set includes at least one range-spec with a | ||||
| first-pos that is less than the current length of the representation, | ||||
| or at least one suffix-range with a non-zero suffix-length, then the | ||||
| bytes range-set is satisfiable. Otherwise, the bytes range-set is | ||||
| unsatisfiable. | ||||
| If the selected representation has zero length, the only satisfiable | ||||
| form of range-spec is a suffix-range with a non-zero suffix-length. | ||||
| In the byte-range syntax, first-pos, last-pos, and suffix-length are | ||||
| expressed as decimal number of octets. Since there is no predefined | ||||
| limit to the length of a payload, recipients MUST anticipate | ||||
| potentially large decimal numerals and prevent parsing errors due to | ||||
| integer conversion overflows. | ||||
| 7.1.4.3. Other Range Units | ||||
| Other range units, such as format-specific boundaries like pages, | ||||
| sections, records, rows, or time, are potentially usable in HTTP for | ||||
| application-specific purposes, but are not commonly used in practice. | ||||
| Implementors of alternative range units ought to consider how they | ||||
| would work with content codings and general-purpose intermediaries. | ||||
| Range units are intended to be extensible. New range units ought to | ||||
| be registered with IANA, as defined in Section 7.1.4.4. | ||||
| 7.1.4.4. Range Unit Registry | ||||
| The "HTTP Range Unit Registry" defines the namespace for the range | ||||
| unit names and refers to their corresponding specifications. It is | ||||
| maintained at <https://www.iana.org/assignments/http-parameters>. | ||||
| Registration of an HTTP Range Unit MUST include the following fields: | ||||
| o Name | ||||
| o Description | ||||
| o Pointer to specification text | ||||
| Values to be added to this namespace require IETF Review (see | ||||
| [RFC8126], Section 4.8). | ||||
| 7.2. Representation Metadata | ||||
| Representation header fields provide metadata about the | ||||
| representation. When a message includes a payload body, the | ||||
| representation header fields describe how to interpret the | ||||
| representation data enclosed in the payload body. In a response to a | ||||
| HEAD request, the representation header fields describe the | ||||
| representation data that would have been enclosed in the payload body | ||||
| if the same request had been a GET. | ||||
| The following header fields convey representation metadata: | ||||
| ------------------ ------- | ||||
| Field Name Ref. | ||||
| ------------------ ------- | ||||
| Content-Type 7.2.1 | ||||
| Content-Encoding 7.2.2 | ||||
| Content-Language 7.2.3 | ||||
| Content-Length 7.2.4 | ||||
| Content-Location 7.2.5 | ||||
| ------------------ ------- | ||||
| Table 8 | ||||
| 7.2.1. Content-Type | ||||
| The "Content-Type" header field indicates the media type of the | ||||
| associated representation: either the representation enclosed in the | ||||
| message payload or the selected representation, as determined by the | ||||
| message semantics. The indicated media type defines both the data | ||||
| format and how that data is intended to be processed by a recipient, | ||||
| within the scope of the received message semantics, after any content | ||||
| codings indicated by Content-Encoding are decoded. | ||||
| Content-Type = media-type | ||||
| Media types are defined in Section 7.1.1. An example of the field is | ||||
| Content-Type: text/html; charset=ISO-8859-4 | ||||
| A sender that generates a message containing a payload body SHOULD | ||||
| generate a Content-Type header field in that message unless the | ||||
| intended media type of the enclosed representation is unknown to the | ||||
| sender. If a Content-Type header field is not present, the recipient | ||||
| MAY either assume a media type of "application/octet-stream" | ||||
| ([RFC2046], Section 4.5.1) or examine the data to determine its type. | ||||
| In practice, resource owners do not always properly configure their | ||||
| origin server to provide the correct Content-Type for a given | ||||
| representation. Some user agents examine a payload's content and, in | ||||
| certain cases, override the received type (for example, see | ||||
| [Sniffing]). This "MIME sniffing" risks drawing incorrect | ||||
| conclusions about the data, which might expose the user to additional | ||||
| security risks (e.g., "privilege escalation"). Furthermore, it is | ||||
| impossible to determine the sender's intended processing model by | ||||
| examining the data format: many data formats match multiple media | ||||
| types that differ only in processing semantics. Implementers are | ||||
| encouraged to provide a means to disable such sniffing. | ||||
| Furthermore, although Content-Type is defined as a singleton field, | ||||
| it is sometimes incorrectly generated multiple times, resulting in a | ||||
| combined field value that appears to be a list. Recipients often | ||||
| attempt to handle this error by using the last syntactically valid | ||||
| member of the list, but note that some implementations might have | ||||
| different error handling behaviors, leading to interoperability and/ | ||||
| or security issues. | ||||
| 7.2.2. Content-Encoding | 7.5. Content-Encoding | |||
| The "Content-Encoding" header field indicates what content codings | The "Content-Encoding" header field indicates what content codings | |||
| have been applied to the representation, beyond those inherent in the | have been applied to the representation, beyond those inherent in the | |||
| media type, and thus what decoding mechanisms have to be applied in | media type, and thus what decoding mechanisms have to be applied in | |||
| order to obtain data in the media type referenced by the Content-Type | order to obtain data in the media type referenced by the Content-Type | |||
| header field. Content-Encoding is primarily used to allow a | header field. Content-Encoding is primarily used to allow a | |||
| representation's data to be compressed without losing the identity of | representation's data to be compressed without losing the identity of | |||
| its underlying media type. | its underlying media type. | |||
| Content-Encoding = #content-coding | Content-Encoding = #content-coding | |||
| skipping to change at page 71, line 14 ¶ | skipping to change at page 62, line 29 ¶ | |||
| choose to publish the same data as multiple representations that | choose to publish the same data as multiple representations that | |||
| differ only in whether the coding is defined as part of Content-Type | differ only in whether the coding is defined as part of Content-Type | |||
| or Content-Encoding, since some user agents will behave differently | or Content-Encoding, since some user agents will behave differently | |||
| in their handling of each response (e.g., open a "Save as ..." dialog | in their handling of each response (e.g., open a "Save as ..." dialog | |||
| instead of automatic decompression and rendering of content). | instead of automatic decompression and rendering of content). | |||
| An origin server MAY respond with a status code of 415 (Unsupported | An origin server MAY respond with a status code of 415 (Unsupported | |||
| Media Type) if a representation in the request message has a content | Media Type) if a representation in the request message has a content | |||
| coding that is not acceptable. | coding that is not acceptable. | |||
| 7.2.3. Content-Language | 7.5.1. Content Codings | |||
| Content coding values indicate an encoding transformation that has | ||||
| been or can be applied to a representation. Content codings are | ||||
| primarily used to allow a representation to be compressed or | ||||
| otherwise usefully transformed without losing the identity of its | ||||
| underlying media type and without loss of information. Frequently, | ||||
| the representation is stored in coded form, transmitted directly, and | ||||
| only decoded by the final recipient. | ||||
| content-coding = token | ||||
| All content codings are case-insensitive and ought to be registered | ||||
| within the "HTTP Content Coding Registry", as described in | ||||
| Section 15.6 | ||||
| Content-coding values are used in the Accept-Encoding | ||||
| (Section 11.1.4) and Content-Encoding (Section 7.5) header fields. | ||||
| The following content-coding values are defined by this | ||||
| specification: | ||||
| ------------ ------------------------------------------- --------- | ||||
| Name Description Ref. | ||||
| ------------ ------------------------------------------- --------- | ||||
| compress UNIX "compress" data format [Welch] 7.5.1.1 | ||||
| deflate "deflate" compressed data ([RFC1951]) 7.5.1.2 | ||||
| inside the "zlib" data format ([RFC1950]) | ||||
| gzip GZIP file format [RFC1952] 7.5.1.3 | ||||
| identity Reserved 11.1.4 | ||||
| x-compress Deprecated (alias for compress) 7.5.1.1 | ||||
| x-gzip Deprecated (alias for gzip) 7.5.1.3 | ||||
| ------------ ------------------------------------------- --------- | ||||
| Table 4 | ||||
| 7.5.1.1. Compress Coding | ||||
| The "compress" coding is an adaptive Lempel-Ziv-Welch (LZW) coding | ||||
| [Welch] that is commonly produced by the UNIX file compression | ||||
| program "compress". A recipient SHOULD consider "x-compress" to be | ||||
| equivalent to "compress". | ||||
| 7.5.1.2. Deflate Coding | ||||
| The "deflate" coding is a "zlib" data format [RFC1950] containing a | ||||
| "deflate" compressed data stream [RFC1951] that uses a combination of | ||||
| the Lempel-Ziv (LZ77) compression algorithm and Huffman coding. | ||||
| | *Note:* Some non-conformant implementations send the "deflate" | ||||
| | compressed data without the zlib wrapper. | ||||
| 7.5.1.3. Gzip Coding | ||||
| The "gzip" coding is an LZ77 coding with a 32-bit Cyclic Redundancy | ||||
| Check (CRC) that is commonly produced by the gzip file compression | ||||
| program [RFC1952]. A recipient SHOULD consider "x-gzip" to be | ||||
| equivalent to "gzip". | ||||
| 7.6. Content-Language | ||||
| The "Content-Language" header field describes the natural language(s) | The "Content-Language" header field describes the natural language(s) | |||
| of the intended audience for the representation. Note that this | of the intended audience for the representation. Note that this | |||
| might not be equivalent to all the languages used within the | might not be equivalent to all the languages used within the | |||
| representation. | representation. | |||
| Content-Language = #language-tag | Content-Language = #language-tag | |||
| Language tags are defined in Section 7.1.3. The primary purpose of | Language tags are defined in Section 7.6.1. The primary purpose of | |||
| Content-Language is to allow a user to identify and differentiate | Content-Language is to allow a user to identify and differentiate | |||
| representations according to the users' own preferred language. | representations according to the users' own preferred language. | |||
| Thus, if the content is intended only for a Danish-literate audience, | Thus, if the content is intended only for a Danish-literate audience, | |||
| the appropriate field is | the appropriate field is | |||
| Content-Language: da | Content-Language: da | |||
| If no Content-Language is specified, the default is that the content | If no Content-Language is specified, the default is that the content | |||
| is intended for all language audiences. This might mean that the | is intended for all language audiences. This might mean that the | |||
| sender does not consider it to be specific to any natural language, | sender does not consider it to be specific to any natural language, | |||
| skipping to change at page 72, line 5 ¶ | skipping to change at page 64, line 35 ¶ | |||
| However, just because multiple languages are present within a | However, just because multiple languages are present within a | |||
| representation does not mean that it is intended for multiple | representation does not mean that it is intended for multiple | |||
| linguistic audiences. An example would be a beginner's language | linguistic audiences. An example would be a beginner's language | |||
| primer, such as "A First Lesson in Latin", which is clearly intended | primer, such as "A First Lesson in Latin", which is clearly intended | |||
| to be used by an English-literate audience. In this case, the | to be used by an English-literate audience. In this case, the | |||
| Content-Language would properly only include "en". | Content-Language would properly only include "en". | |||
| Content-Language MAY be applied to any media type - it is not limited | Content-Language MAY be applied to any media type - it is not limited | |||
| to textual documents. | to textual documents. | |||
| 7.2.4. Content-Length | 7.6.1. Language Tags | |||
| A language tag, as defined in [RFC5646], identifies a natural | ||||
| language spoken, written, or otherwise conveyed by human beings for | ||||
| communication of information to other human beings. Computer | ||||
| languages are explicitly excluded. | ||||
| HTTP uses language tags within the Accept-Language and | ||||
| Content-Language header fields. Accept-Language uses the broader | ||||
| language-range production defined in Section 11.1.5, whereas | ||||
| Content-Language uses the language-tag production defined below. | ||||
| language-tag = <Language-Tag, see [RFC5646], Section 2.1> | ||||
| A language tag is a sequence of one or more case-insensitive subtags, | ||||
| each separated by a hyphen character ("-", %x2D). In most cases, a | ||||
| language tag consists of a primary language subtag that identifies a | ||||
| broad family of related languages (e.g., "en" = English), which is | ||||
| optionally followed by a series of subtags that refine or narrow that | ||||
| language's range (e.g., "en-CA" = the variety of English as | ||||
| communicated in Canada). Whitespace is not allowed within a language | ||||
| tag. Example tags include: | ||||
| fr, en-US, es-419, az-Arab, x-pig-latin, man-Nkoo-GN | ||||
| See [RFC5646] for further information. | ||||
| 7.7. Content-Length | ||||
| The "Content-Length" header field indicates the associated | The "Content-Length" header field indicates the associated | |||
| representation's data length as a decimal non-negative integer number | representation's data length as a decimal non-negative integer number | |||
| of octets. When transferring a representation in a message, Content- | of octets. When transferring a representation in a message, Content- | |||
| Length refers specifically to the amount of data enclosed so that it | Length refers specifically to the amount of data enclosed so that it | |||
| can be used to delimit framing of the message body (e.g., Section 6.2 | can be used to delimit framing of the message body (e.g., Section 6.2 | |||
| of [Messaging]). In other cases, Content-Length indicates the | of [Messaging]). In other cases, Content-Length indicates the | |||
| selected representation's current length, which can be used by | selected representation's current length, which can be used by | |||
| recipients to estimate transfer time or compare to previously stored | recipients to estimate transfer time or compare to previously stored | |||
| representations. | representations. | |||
| skipping to change at page 72, line 42 ¶ | skipping to change at page 66, line 6 ¶ | |||
| a payload body and the method semantics do not anticipate such a | a payload body and the method semantics do not anticipate such a | |||
| body. | body. | |||
| A server MAY send a Content-Length header field in a response to a | A server MAY send a Content-Length header field in a response to a | |||
| HEAD request (Section 8.3.2); a server MUST NOT send Content-Length | HEAD request (Section 8.3.2); a server MUST NOT send Content-Length | |||
| in such a response unless its field value equals the decimal number | in such a response unless its field value equals the decimal number | |||
| of octets that would have been sent in the payload body of a response | of octets that would have been sent in the payload body of a response | |||
| if the same request had used the GET method. | if the same request had used the GET method. | |||
| A server MAY send a Content-Length header field in a 304 (Not | A server MAY send a Content-Length header field in a 304 (Not | |||
| Modified) response to a conditional GET request (Section 10.4.5); a | Modified) response to a conditional GET request (Section 14.4.5); a | |||
| server MUST NOT send Content-Length in such a response unless its | server MUST NOT send Content-Length in such a response unless its | |||
| field value equals the decimal number of octets that would have been | field value equals the decimal number of octets that would have been | |||
| sent in the payload body of a 200 (OK) response to the same request. | sent in the payload body of a 200 (OK) response to the same request. | |||
| A server MUST NOT send a Content-Length header field in any response | A server MUST NOT send a Content-Length header field in any response | |||
| with a status code of 1xx (Informational) or 204 (No Content). A | with a status code of 1xx (Informational) or 204 (No Content). A | |||
| server MUST NOT send a Content-Length header field in any 2xx | server MUST NOT send a Content-Length header field in any 2xx | |||
| (Successful) response to a CONNECT request (Section 8.3.6). | (Successful) response to a CONNECT request (Section 8.3.6). | |||
| Aside from the cases defined above, in the absence of Transfer- | Aside from the cases defined above, in the absence of Transfer- | |||
| Encoding, an origin server SHOULD send a Content-Length header field | Encoding, an origin server SHOULD send a Content-Length header field | |||
| when the payload body size is known prior to sending the complete | when the payload body size is known prior to sending the complete | |||
| header section. This will allow downstream recipients to measure | header section. This will allow downstream recipients to measure | |||
| transfer progress, know when a received message is complete, and | transfer progress, know when a received message is complete, and | |||
| potentially reuse the connection for additional requests. | potentially reuse the connection for additional requests. | |||
| Any Content-Length field value greater than or equal to zero is | Any Content-Length field value greater than or equal to zero is | |||
| valid. Since there is no predefined limit to the length of a | valid. Since there is no predefined limit to the length of a | |||
| payload, a recipient MUST anticipate potentially large decimal | payload, a recipient MUST anticipate potentially large decimal | |||
| numerals and prevent parsing errors due to integer conversion | numerals and prevent parsing errors due to integer conversion | |||
| overflows (Section 12.5). | overflows (Section 16.5). | |||
| If a message is received that has a Content-Length header field value | If a message is received that has a Content-Length header field value | |||
| consisting of the same decimal value as a comma-separated list | consisting of the same decimal value as a comma-separated list | |||
| (Section 5.5) - for example, "Content-Length: 42, 42" - indicating | (Section 5.7.1) - for example, "Content-Length: 42, 42" - indicating | |||
| that duplicate Content-Length header fields have been generated or | that duplicate Content-Length header fields have been generated or | |||
| combined by an upstream message processor, then the recipient MUST | combined by an upstream message processor, then the recipient MUST | |||
| either reject the message as invalid or replace the duplicated field | either reject the message as invalid or replace the duplicated field | |||
| values with a single valid Content-Length field containing that | values with a single valid Content-Length field containing that | |||
| decimal value prior to determining the message body length or | decimal value prior to determining the message body length or | |||
| forwarding the message. | forwarding the message. | |||
| 7.2.5. Content-Location | 7.8. Content-Location | |||
| The "Content-Location" header field references a URI that can be used | The "Content-Location" header field references a URI that can be used | |||
| as an identifier for a specific resource corresponding to the | as an identifier for a specific resource corresponding to the | |||
| representation in this message's payload. In other words, if one | representation in this message's payload. In other words, if one | |||
| were to perform a GET request on this URI at the time of this | were to perform a GET request on this URI at the time of this | |||
| message's generation, then a 200 (OK) response would contain the same | message's generation, then a 200 (OK) response would contain the same | |||
| representation that is enclosed as payload in this message. | representation that is enclosed as payload in this message. | |||
| Content-Location = absolute-URI / partial-URI | Content-Location = absolute-URI / partial-URI | |||
| The field value is either an absolute-URI or a partial-URI. In the | The field value is either an absolute-URI or a partial-URI. In the | |||
| latter case (Section 2.4), the referenced URI is relative to the | latter case (Section 4), the referenced URI is relative to the target | |||
| target URI ([RFC3986], Section 5). | URI ([RFC3986], Section 5). | |||
| The Content-Location value is not a replacement for the target URI | The Content-Location value is not a replacement for the target URI | |||
| (Section 6.1). It is representation metadata. It has the same | (Section 6.1). It is representation metadata. It has the same | |||
| syntax and semantics as the header field of the same name defined for | syntax and semantics as the header field of the same name defined for | |||
| MIME body parts in Section 4 of [RFC2557]. However, its appearance | MIME body parts in Section 4 of [RFC2557]. However, its appearance | |||
| in an HTTP message has some special implications for HTTP recipients. | in an HTTP message has some special implications for HTTP recipients. | |||
| If Content-Location is included in a 2xx (Successful) response | If Content-Location is included in a 2xx (Successful) response | |||
| message and its value refers (after conversion to absolute form) to a | message and its value refers (after conversion to absolute form) to a | |||
| URI that is the same as the target URI, then the recipient MAY | URI that is the same as the target URI, then the recipient MAY | |||
| skipping to change at page 75, line 17 ¶ | skipping to change at page 68, line 29 ¶ | |||
| For example, if a client makes a PUT request on a negotiated resource | For example, if a client makes a PUT request on a negotiated resource | |||
| and the origin server accepts that PUT (without redirection), then | and the origin server accepts that PUT (without redirection), then | |||
| the new state of that resource is expected to be consistent with the | the new state of that resource is expected to be consistent with the | |||
| one representation supplied in that PUT; the Content-Location cannot | one representation supplied in that PUT; the Content-Location cannot | |||
| be used as a form of reverse content selection identifier to update | be used as a form of reverse content selection identifier to update | |||
| only one of the negotiated representations. If the user agent had | only one of the negotiated representations. If the user agent had | |||
| wanted the latter semantics, it would have applied the PUT directly | wanted the latter semantics, it would have applied the PUT directly | |||
| to the Content-Location URI. | to the Content-Location URI. | |||
| 7.3. Payload | 7.9. Validators | |||
| Some HTTP messages transfer a complete or partial representation as | ||||
| the message "payload". In some cases, a payload might contain only | ||||
| the associated representation's header fields (e.g., responses to | ||||
| HEAD) or only some part(s) of the representation data (e.g., the 206 | ||||
| (Partial Content) status code). | ||||
| Header fields that specifically describe the payload, rather than the | ||||
| associated representation, are referred to as "payload header | ||||
| fields". Payload header fields are defined in other parts of this | ||||
| specification, due to their impact on message parsing. | ||||
| ------------------- ---------------------------- | ||||
| Field Name Ref. | ||||
| ------------------- ---------------------------- | ||||
| Content-Range 7.3.4 | ||||
| Trailer 5.6.4 | ||||
| Transfer-Encoding Section 6.1 of [Messaging] | ||||
| ------------------- ---------------------------- | ||||
| Table 9 | ||||
| 7.3.1. Purpose | ||||
| The purpose of a payload in a request is defined by the method | ||||
| semantics. For example, a representation in the payload of a PUT | ||||
| request (Section 8.3.4) represents the desired state of the target | ||||
| resource if the request is successfully applied, whereas a | ||||
| representation in the payload of a POST request (Section 8.3.3) | ||||
| represents information to be processed by the target resource. | ||||
| In a response, the payload's purpose is defined by both the request | ||||
| method and the response status code. For example, the payload of a | ||||
| 200 (OK) response to GET (Section 8.3.1) represents the current state | ||||
| of the target resource, as observed at the time of the message | ||||
| origination date (Section 11.1.1), whereas the payload of the same | ||||
| status code in a response to POST might represent either the | ||||
| processing result or the new state of the target resource after | ||||
| applying the processing. Response messages with an error status code | ||||
| usually contain a payload that represents the error condition, such | ||||
| that it describes the error state and what next steps are suggested | ||||
| for resolving it. | ||||
| 7.3.2. Identification | ||||
| When a complete or partial representation is transferred in a message | ||||
| payload, it is often desirable for the sender to supply, or the | ||||
| recipient to determine, an identifier for a resource corresponding to | ||||
| that representation. | ||||
| For a request message: | ||||
| o If the request has a Content-Location header field, then the | ||||
| sender asserts that the payload is a representation of the | ||||
| resource identified by the Content-Location field value. However, | ||||
| such an assertion cannot be trusted unless it can be verified by | ||||
| other means (not defined by this specification). The information | ||||
| might still be useful for revision history links. | ||||
| o Otherwise, the payload is unidentified. | ||||
| For a response message, the following rules are applied in order | ||||
| until a match is found: | ||||
| 1. If the request method is GET or HEAD and the response status code | ||||
| is 200 (OK), 204 (No Content), 206 (Partial Content), or 304 (Not | ||||
| Modified), the payload is a representation of the resource | ||||
| identified by the target URI (Section 6.1). | ||||
| 2. If the request method is GET or HEAD and the response status code | ||||
| is 203 (Non-Authoritative Information), the payload is a | ||||
| potentially modified or enhanced representation of the target | ||||
| resource as provided by an intermediary. | ||||
| 3. If the response has a Content-Location header field and its field | ||||
| value is a reference to the same URI as the target URI, the | ||||
| payload is a representation of the target resource. | ||||
| 4. If the response has a Content-Location header field and its field | ||||
| value is a reference to a URI different from the target URI, then | ||||
| the sender asserts that the payload is a representation of the | ||||
| resource identified by the Content-Location field value. | ||||
| However, such an assertion cannot be trusted unless it can be | ||||
| verified by other means (not defined by this specification). | ||||
| 5. Otherwise, the payload is unidentified. | ||||
| 7.3.3. Payload Body | ||||
| The payload body contains the data of a request or response. This is | ||||
| distinct from the message body (e.g., Section 6 of [Messaging]), | ||||
| which is how the payload body is transferred "on the wire", and might | ||||
| be encoded, depending on the HTTP version in use. | ||||
| It is also distinct from a request or response's representation data | ||||
| (Section 7.1), which can be inferred from protocol operation, rather | ||||
| than necessarily appearing "on the wire." | ||||
| The presence of a payload body in a request depends on whether the | ||||
| request method used defines semantics for it. | ||||
| The presence of a payload body in a response depends on both the | ||||
| request method to which it is responding and the response status code | ||||
| (Section 10). | ||||
| Responses to the HEAD request method (Section 8.3.2) never include a | ||||
| payload body because the associated response header fields indicate | ||||
| only what their values would have been if the request method had been | ||||
| GET (Section 8.3.1). | ||||
| 2xx (Successful) responses to a CONNECT request method | ||||
| (Section 8.3.6) switch the connection to tunnel mode instead of | ||||
| having a payload body. | ||||
| All 1xx (Informational), 204 (No Content), and 304 (Not Modified) | ||||
| responses do not include a payload body. | ||||
| All other responses do include a payload body, although that body | ||||
| might be of zero length. | ||||
| 7.3.4. Content-Range | Validator header fields convey metadata about the selected | |||
| representation (Section 7). In responses to safe requests, validator | ||||
| fields describe the selected representation chosen by the origin | ||||
| server while handling the response. Note that, depending on the | ||||
| status code semantics, the selected representation for a given | ||||
| response is not necessarily the same as the representation enclosed | ||||
| as response payload. | ||||
| The "Content-Range" header field is sent in a single part 206 | In a successful response to a state-changing request, validator | |||
| (Partial Content) response to indicate the partial range of the | fields describe the new representation that has replaced the prior | |||
| selected representation enclosed as the message payload, sent in each | selected representation as a result of processing the request. | |||
| part of a multipart 206 response to indicate the range enclosed | ||||
| within each body part, and sent in 416 (Range Not Satisfiable) | ||||
| responses to provide information about the selected representation. | ||||
| Content-Range = range-unit SP | For example, an ETag field in a 201 (Created) response communicates | |||
| ( range-resp / unsatisfied-range ) | the entity-tag of the newly created resource's representation, so | |||
| that it can be used in later conditional requests to prevent the | ||||
| "lost update" problem Section 12.1. | ||||
| range-resp = incl-range "/" ( complete-length / "*" ) | --------------- ------- | |||
| incl-range = first-pos "-" last-pos | Field Name Ref. | |||
| unsatisfied-range = "*/" complete-length | --------------- ------- | |||
| ETag 7.9.3 | ||||
| Last-Modified 7.9.2 | ||||
| --------------- ------- | ||||
| complete-length = 1*DIGIT | Table 5 | |||
| If a 206 (Partial Content) response contains a Content-Range header | This specification defines two forms of metadata that are commonly | |||
| field with a range unit (Section 7.1.4) that the recipient does not | used to observe resource state and test for preconditions: | |||
| understand, the recipient MUST NOT attempt to recombine it with a | modification dates (Section 7.9.2) and opaque entity tags | |||
| stored representation. A proxy that receives such a message SHOULD | (Section 7.9.3). Additional metadata that reflects resource state | |||
| forward it downstream. | has been defined by various extensions of HTTP, such as Web | |||
| Distributed Authoring and Versioning (WebDAV, [RFC4918]), that are | ||||
| beyond the scope of this specification. A resource metadata value is | ||||
| referred to as a "validator" when it is used within a precondition. | ||||
| For byte ranges, a sender SHOULD indicate the complete length of the | 7.9.1. Weak versus Strong | |||
| representation from which the range has been extracted, unless the | ||||
| complete length is unknown or difficult to determine. An asterisk | ||||
| character ("*") in place of the complete-length indicates that the | ||||
| representation length was unknown when the header field was | ||||
| generated. | ||||
| The following example illustrates when the complete length of the | Validators come in two flavors: strong or weak. Weak validators are | |||
| selected representation is known by the sender to be 1234 bytes: | easy to generate but are far less useful for comparisons. Strong | |||
| validators are ideal for comparisons but can be very difficult (and | ||||
| occasionally impossible) to generate efficiently. Rather than impose | ||||
| that all forms of resource adhere to the same strength of validator, | ||||
| HTTP exposes the type of validator in use and imposes restrictions on | ||||
| when weak validators can be used as preconditions. | ||||
| Content-Range: bytes 42-1233/1234 | A "strong validator" is representation metadata that changes value | |||
| whenever a change occurs to the representation data that would be | ||||
| observable in the payload body of a 200 (OK) response to GET. | ||||
| and this second example illustrates when the complete length is | A strong validator might change for reasons other than a change to | |||
| unknown: | the representation data, such as when a semantically significant part | |||
| of the representation metadata is changed (e.g., Content-Type), but | ||||
| it is in the best interests of the origin server to only change the | ||||
| value when it is necessary to invalidate the stored responses held by | ||||
| remote caches and authoring tools. | ||||
| Content-Range: bytes 42-1233/* | Cache entries might persist for arbitrarily long periods, regardless | |||
| of expiration times. Thus, a cache might attempt to validate an | ||||
| entry using a validator that it obtained in the distant past. A | ||||
| strong validator is unique across all versions of all representations | ||||
| associated with a particular resource over time. However, there is | ||||
| no implication of uniqueness across representations of different | ||||
| resources (i.e., the same strong validator might be in use for | ||||
| representations of multiple resources at the same time and does not | ||||
| imply that those representations are equivalent). | ||||
| A Content-Range field value is invalid if it contains a range-resp | There are a variety of strong validators used in practice. The best | |||
| that has a last-pos value less than its first-pos value, or a | are based on strict revision control, wherein each change to a | |||
| complete-length value less than or equal to its last-pos value. The | representation always results in a unique node name and revision | |||
| recipient of an invalid Content-Range MUST NOT attempt to recombine | identifier being assigned before the representation is made | |||
| the received content with a stored representation. | accessible to GET. A collision-resistant hash function applied to | |||
| the representation data is also sufficient if the data is available | ||||
| prior to the response header fields being sent and the digest does | ||||
| not need to be recalculated every time a validation request is | ||||
| received. However, if a resource has distinct representations that | ||||
| differ only in their metadata, such as might occur with content | ||||
| negotiation over media types that happen to share the same data | ||||
| format, then the origin server needs to incorporate additional | ||||
| information in the validator to distinguish those representations. | ||||
| A server generating a 416 (Range Not Satisfiable) response to a byte- | In contrast, a "weak validator" is representation metadata that might | |||
| range request SHOULD send a Content-Range header field with an | not change for every change to the representation data. This | |||
| unsatisfied-range value, as in the following example: | weakness might be due to limitations in how the value is calculated, | |||
| such as clock resolution, an inability to ensure uniqueness for all | ||||
| possible representations of the resource, or a desire of the resource | ||||
| owner to group representations by some self-determined set of | ||||
| equivalency rather than unique sequences of data. An origin server | ||||
| SHOULD change a weak entity-tag whenever it considers prior | ||||
| representations to be unacceptable as a substitute for the current | ||||
| representation. In other words, a weak entity-tag ought to change | ||||
| whenever the origin server wants caches to invalidate old responses. | ||||
| Content-Range: bytes */1234 | For example, the representation of a weather report that changes in | |||
| content every second, based on dynamic measurements, might be grouped | ||||
| into sets of equivalent representations (from the origin server's | ||||
| perspective) with the same weak validator in order to allow cached | ||||
| representations to be valid for a reasonable period of time (perhaps | ||||
| adjusted dynamically based on server load or weather quality). | ||||
| Likewise, a representation's modification time, if defined with only | ||||
| one-second resolution, might be a weak validator if it is possible | ||||
| for the representation to be modified twice during a single second | ||||
| and retrieved between those modifications. | ||||
| The complete-length in a 416 response indicates the current length of | Likewise, a validator is weak if it is shared by two or more | |||
| the selected representation. | representations of a given resource at the same time, unless those | |||
| representations have identical representation data. For example, if | ||||
| the origin server sends the same validator for a representation with | ||||
| a gzip content coding applied as it does for a representation with no | ||||
| content coding, then that validator is weak. However, two | ||||
| simultaneous representations might share the same strong validator if | ||||
| they differ only in the representation metadata, such as when two | ||||
| different media types are available for the same representation data. | ||||
| The Content-Range header field has no meaning for status codes that | Strong validators are usable for all conditional requests, including | |||
| do not explicitly describe its semantic. For this specification, | cache validation, partial content ranges, and "lost update" | |||
| only the 206 (Partial Content) and 416 (Range Not Satisfiable) status | avoidance. Weak validators are only usable when the client does not | |||
| codes describe a meaning for Content-Range. | require exact equality with previously obtained representation data, | |||
| such as when validating a cache entry or limiting a web traversal to | ||||
| recent changes. | ||||
| The following are examples of Content-Range values in which the | 7.9.2. Last-Modified | |||
| selected representation contains a total of 1234 bytes: | ||||
| o The first 500 bytes: | The "Last-Modified" header field in a response provides a timestamp | |||
| indicating the date and time at which the origin server believes the | ||||
| selected representation was last modified, as determined at the | ||||
| conclusion of handling the request. | ||||
| Content-Range: bytes 0-499/1234 | Last-Modified = HTTP-date | |||
| o The second 500 bytes: | An example of its use is | |||
| Content-Range: bytes 500-999/1234 | Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT | |||
| o All except for the first 500 bytes: | 7.9.2.1. Generation | |||
| Content-Range: bytes 500-1233/1234 | An origin server SHOULD send Last-Modified for any selected | |||
| representation for which a last modification date can be reasonably | ||||
| and consistently determined, since its use in conditional requests | ||||
| and evaluating cache freshness ([Caching]) results in a substantial | ||||
| reduction of HTTP traffic on the Internet and can be a significant | ||||
| factor in improving service scalability and reliability. | ||||
| o The last 500 bytes: | A representation is typically the sum of many parts behind the | |||
| resource interface. The last-modified time would usually be the most | ||||
| recent time that any of those parts were changed. How that value is | ||||
| determined for any given resource is an implementation detail beyond | ||||
| the scope of this specification. What matters to HTTP is how | ||||
| recipients of the Last-Modified header field can use its value to | ||||
| make conditional requests and test the validity of locally cached | ||||
| responses. | ||||
| Content-Range: bytes 734-1233/1234 | An origin server SHOULD obtain the Last-Modified value of the | |||
| representation as close as possible to the time that it generates the | ||||
| Date field value for its response. This allows a recipient to make | ||||
| an accurate assessment of the representation's modification time, | ||||
| especially if the representation changes near the time that the | ||||
| response is generated. | ||||
| 7.3.5. Media Type multipart/byteranges | An origin server with a clock MUST NOT send a Last-Modified date that | |||
| is later than the server's time of message origination (Date). If | ||||
| the last modification time is derived from implementation-specific | ||||
| metadata that evaluates to some time in the future, according to the | ||||
| origin server's clock, then the origin server MUST replace that value | ||||
| with the message origination date. This prevents a future | ||||
| modification date from having an adverse impact on cache validation. | ||||
| When a 206 (Partial Content) response message includes the content of | An origin server without a clock MUST NOT assign Last-Modified values | |||
| multiple ranges, they are transmitted as body parts in a multipart | to a response unless these values were associated with the resource | |||
| message body ([RFC2046], Section 5.1) with the media type of | by some other system or user with a reliable clock. | |||
| "multipart/byteranges". | ||||
| The multipart/byteranges media type includes one or more body parts, | 7.9.2.2. Comparison | |||
| each with its own Content-Type and Content-Range fields. The | ||||
| required boundary parameter specifies the boundary string used to | ||||
| separate each body part. | ||||
| Implementation Notes: | A Last-Modified time, when used as a validator in a request, is | |||
| implicitly weak unless it is possible to deduce that it is strong, | ||||
| using the following rules: | ||||
| 1. Additional CRLFs might precede the first boundary string in the | o The validator is being compared by an origin server to the actual | |||
| body. | current validator for the representation and, | |||
| 2. Although [RFC2046] permits the boundary string to be quoted, some | o That origin server reliably knows that the associated | |||
| existing implementations handle a quoted boundary string | representation did not change twice during the second covered by | |||
| incorrectly. | the presented validator. | |||
| 3. A number of clients and servers were coded to an early draft of | or | |||
| the byteranges specification that used a media type of multipart/ | ||||
| x-byteranges , which is almost (but not quite) compatible with | ||||
| this type. | ||||
| Despite the name, the "multipart/byteranges" media type is not | o The validator is about to be used by a client in an | |||
| limited to byte ranges. The following example uses an "exampleunit" | If-Modified-Since, If-Unmodified-Since, or If-Range header field, | |||
| range unit: | because the client has a cache entry for the associated | |||
| representation, and | ||||
| HTTP/1.1 206 Partial Content | o That cache entry includes a Date value, which gives the time when | |||
| Date: Tue, 14 Nov 1995 06:25:24 GMT | the origin server sent the original response, and | |||
| Last-Modified: Tue, 14 July 04:58:08 GMT | ||||
| Content-Length: 2331785 | ||||
| Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES | ||||
| --THIS_STRING_SEPARATES | o The presented Last-Modified time is at least 60 seconds before the | |||
| Content-Type: video/example | Date value. | |||
| Content-Range: exampleunit 1.2-4.3/25 | ||||
| ...the first range... | or | |||
| --THIS_STRING_SEPARATES | ||||
| Content-Type: video/example | ||||
| Content-Range: exampleunit 11.2-14.3/25 | ||||
| ...the second range | o The validator is being compared by an intermediate cache to the | |||
| --THIS_STRING_SEPARATES-- | validator stored in its cache entry for the representation, and | |||
| The following information serves as the registration form for the | o That cache entry includes a Date value, which gives the time when | |||
| multipart/byteranges media type. | the origin server sent the original response, and | |||
| Type name: multipart | o The presented Last-Modified time is at least 60 seconds before the | |||
| Date value. | ||||
| Subtype name: byteranges | This method relies on the fact that if two different responses were | |||
| sent by the origin server during the same second, but both had the | ||||
| same Last-Modified time, then at least one of those responses would | ||||
| have a Date value equal to its Last-Modified time. The arbitrary | ||||
| 60-second limit guards against the possibility that the Date and | ||||
| Last-Modified values are generated from different clocks or at | ||||
| somewhat different times during the preparation of the response. An | ||||
| implementation MAY use a value larger than 60 seconds, if it is | ||||
| believed that 60 seconds is too short. | ||||
| Required parameters: boundary | 7.9.3. ETag | |||
| Optional parameters: N/A | The "ETag" field in a response provides the current entity-tag for | |||
| the selected representation, as determined at the conclusion of | ||||
| handling the request. An entity-tag is an opaque validator for | ||||
| differentiating between multiple representations of the same | ||||
| resource, regardless of whether those multiple representations are | ||||
| due to resource state changes over time, content negotiation | ||||
| resulting in multiple representations being valid at the same time, | ||||
| or both. An entity-tag consists of an opaque quoted string, possibly | ||||
| prefixed by a weakness indicator. | ||||
| Encoding considerations: only "7bit", "8bit", or "binary" are | ETag = entity-tag | |||
| permitted | ||||
| Security considerations: see Section 12 | entity-tag = [ weak ] opaque-tag | |||
| weak = %s"W/" | ||||
| opaque-tag = DQUOTE *etagc DQUOTE | ||||
| etagc = %x21 / %x23-7E / obs-text | ||||
| ; VCHAR except double quotes, plus obs-text | ||||
| Interoperability considerations: N/A | | *Note:* Previously, opaque-tag was defined to be a quoted- | |||
| | string ([RFC2616], Section 3.11); thus, some recipients might | ||||
| | perform backslash unescaping. Servers therefore ought to avoid | ||||
| | backslash characters in entity tags. | ||||
| Published specification: This specification (see Section 7.3.5). | An entity-tag can be more reliable for validation than a modification | |||
| date in situations where it is inconvenient to store modification | ||||
| dates, where the one-second resolution of HTTP date values is not | ||||
| sufficient, or where modification dates are not consistently | ||||
| maintained. | ||||
| Applications that use this media type: HTTP components supporting | Examples: | |||
| multiple ranges in a single request. | ||||
| Fragment identifier considerations: N/A | ETag: "xyzzy" | |||
| ETag: W/"xyzzy" | ||||
| ETag: "" | ||||
| Additional information: Deprecated alias names for this type: N/A | An entity-tag can be either a weak or strong validator, with strong | |||
| being the default. If an origin server provides an entity-tag for a | ||||
| representation and the generation of that entity-tag does not satisfy | ||||
| all of the characteristics of a strong validator (Section 7.9.1), | ||||
| then the origin server MUST mark the entity-tag as weak by prefixing | ||||
| its opaque value with "W/" (case-sensitive). | ||||
| Magic number(s): N/A | A sender MAY send the Etag field in a trailer section (see | |||
| Section 5.6). However, since trailers are often ignored, it is | ||||
| preferable to send Etag as a header field unless the entity-tag is | ||||
| generated while sending the message body. | ||||
| File extension(s): N/A | 7.9.3.1. Generation | |||
| Macintosh file type code(s): N/A | The principle behind entity-tags is that only the service author | |||
| knows the implementation of a resource well enough to select the most | ||||
| accurate and efficient validation mechanism for that resource, and | ||||
| that any such mechanism can be mapped to a simple sequence of octets | ||||
| for easy comparison. Since the value is opaque, there is no need for | ||||
| the client to be aware of how each entity-tag is constructed. | ||||
| Person and email address to contact for further information: See Aut | For example, a resource that has implementation-specific versioning | |||
| hors' Addresses section. | applied to all changes might use an internal revision number, perhaps | |||
| combined with a variance identifier for content negotiation, to | ||||
| accurately differentiate between representations. Other | ||||
| implementations might use a collision-resistant hash of | ||||
| representation content, a combination of various file attributes, or | ||||
| a modification timestamp that has sub-second resolution. | ||||
| Intended usage: COMMON | An origin server SHOULD send an ETag for any selected representation | |||
| for which detection of changes can be reasonably and consistently | ||||
| determined, since the entity-tag's use in conditional requests and | ||||
| evaluating cache freshness ([Caching]) can result in a substantial | ||||
| reduction of HTTP network traffic and can be a significant factor in | ||||
| improving service scalability and reliability. | ||||
| Restrictions on usage: N/A | 7.9.3.2. Comparison | |||
| Author: See Authors' Addresses section. | There are two entity-tag comparison functions, depending on whether | |||
| or not the comparison context allows the use of weak validators: | ||||
| Change controller: IESG | o Strong comparison: two entity-tags are equivalent if both are not | |||
| weak and their opaque-tags match character-by-character. | ||||
| 7.4. Content Negotiation | o Weak comparison: two entity-tags are equivalent if their opaque- | |||
| tags match character-by-character, regardless of either or both | ||||
| being tagged as "weak". | ||||
| When responses convey payload information, whether indicating a | The example below shows the results for a set of entity-tag pairs and | |||
| success or an error, the origin server often has different ways of | both the weak and strong comparison function results: | |||
| representing that information; for example, in different formats, | ||||
| languages, or encodings. Likewise, different users or user agents | ||||
| might have differing capabilities, characteristics, or preferences | ||||
| that could influence which representation, among those available, | ||||
| would be best to deliver. For this reason, HTTP provides mechanisms | ||||
| for content negotiation. | ||||
| This specification defines three patterns of content negotiation that | -------- -------- ------------------- ----------------- | |||
| can be made visible within the protocol: "proactive" negotiation, | ETag 1 ETag 2 Strong Comparison Weak Comparison | |||
| where the server selects the representation based upon the user | -------- -------- ------------------- ----------------- | |||
| agent's stated preferences, "reactive" negotiation, where the server | W/"1" W/"1" no match match | |||
| provides a list of representations for the user agent to choose from, | W/"1" W/"2" no match no match | |||
| and "request payload" negotiation, where the user agent selects the | W/"1" "1" no match match | |||
| representation for a future request based upon the server's stated | "1" "1" match match | |||
| preferences in past responses. Other patterns of content negotiation | -------- -------- ------------------- ----------------- | |||
| include "conditional content", where the representation consists of | ||||
| multiple parts that are selectively rendered based on user agent | ||||
| parameters, "active content", where the representation contains a | ||||
| script that makes additional (more specific) requests based on the | ||||
| user agent characteristics, and "Transparent Content Negotiation" | ||||
| ([RFC2295]), where content selection is performed by an intermediary. | ||||
| These patterns are not mutually exclusive, and each has trade-offs in | ||||
| applicability and practicality. | ||||
| Note that, in all cases, HTTP is not aware of the resource semantics. | Table 6 | |||
| The consistency with which an origin server responds to requests, | ||||
| over time and over the varying dimensions of content negotiation, and | ||||
| thus the "sameness" of a resource's observed representations over | ||||
| time, is determined entirely by whatever entity or algorithm selects | ||||
| or generates those responses. | ||||
| 7.4.1. Proactive Negotiation | 7.9.3.3. Example: Entity-Tags Varying on Content-Negotiated Resources | |||
| When content negotiation preferences are sent by the user agent in a | Consider a resource that is subject to content negotiation | |||
| request to encourage an algorithm located at the server to select the | (Section 11), and where the representations sent in response to a GET | |||
| preferred representation, it is called proactive negotiation (a.k.a., | request vary based on the Accept-Encoding request header field | |||
| server-driven negotiation). Selection is based on the available | (Section 11.1.4): | |||
| representations for a response (the dimensions over which it might | ||||
| vary, such as language, content-coding, etc.) compared to various | ||||
| information supplied in the request, including both the explicit | ||||
| negotiation fields of Section 9.4 and implicit characteristics, such | ||||
| as the client's network address or parts of the User-Agent field. | ||||
| Proactive negotiation is advantageous when the algorithm for | >> Request: | |||
| selecting from among the available representations is difficult to | ||||
| describe to a user agent, or when the server desires to send its | ||||
| "best guess" to the user agent along with the first response (hoping | ||||
| to avoid the round trip delay of a subsequent request if the "best | ||||
| guess" is good enough for the user). In order to improve the | ||||
| server's guess, a user agent MAY send request header fields that | ||||
| describe its preferences. | ||||
| Proactive negotiation has serious disadvantages: | GET /index HTTP/1.1 | |||
| Host: www.example.com | ||||
| Accept-Encoding: gzip | ||||
| o It is impossible for the server to accurately determine what might | In this case, the response might or might not use the gzip content | |||
| be "best" for any given user, since that would require complete | coding. If it does not, the response might look like: | |||
| knowledge of both the capabilities of the user agent and the | ||||
| intended use for the response (e.g., does the user want to view it | ||||
| on screen or print it on paper?); | ||||
| o Having the user agent describe its capabilities in every request | >> Response: | |||
| can be both very inefficient (given that only a small percentage | ||||
| of responses have multiple representations) and a potential risk | ||||
| to the user's privacy; | ||||
| o It complicates the implementation of an origin server and the | HTTP/1.1 200 OK | |||
| algorithms for generating responses to a request; and, | Date: Fri, 26 Mar 2010 00:05:00 GMT | |||
| ETag: "123-a" | ||||
| Content-Length: 70 | ||||
| Vary: Accept-Encoding | ||||
| Content-Type: text/plain | ||||
| o It limits the reusability of responses for shared caching. | Hello World! | |||
| Hello World! | ||||
| Hello World! | ||||
| Hello World! | ||||
| Hello World! | ||||
| A user agent cannot rely on proactive negotiation preferences being | An alternative representation that does use gzip content coding would | |||
| consistently honored, since the origin server might not implement | be: | |||
| proactive negotiation for the requested resource or might decide that | ||||
| sending a response that doesn't conform to the user agent's | ||||
| preferences is better than sending a 406 (Not Acceptable) response. | ||||
| A Vary header field (Section 11.1.4) is often sent in a response | >> Response: | |||
| subject to proactive negotiation to indicate what parts of the | ||||
| request information were used in the selection algorithm. | ||||
| 7.4.2. Reactive Negotiation | HTTP/1.1 200 OK | |||
| Date: Fri, 26 Mar 2010 00:05:00 GMT | ||||
| ETag: "123-b" | ||||
| Content-Length: 43 | ||||
| Vary: Accept-Encoding | ||||
| Content-Type: text/plain | ||||
| Content-Encoding: gzip | ||||
| With reactive negotiation (a.k.a., agent-driven negotiation), | ...binary data... | |||
| selection of the best response representation (regardless of the | ||||
| status code) is performed by the user agent after receiving an | ||||
| initial response from the origin server that contains a list of | ||||
| resources for alternative representations. If the user agent is not | ||||
| satisfied by the initial response representation, it can perform a | ||||
| GET request on one or more of the alternative resources, selected | ||||
| based on metadata included in the list, to obtain a different form of | ||||
| representation for that response. Selection of alternatives might be | ||||
| performed automatically by the user agent or manually by the user | ||||
| selecting from a generated (possibly hypertext) menu. | ||||
| Note that the above refers to representations of the response, in | | *Note:* Content codings are a property of the representation | |||
| general, not representations of the resource. The alternative | | data, so a strong entity-tag for a content-encoded | |||
| representations are only considered representations of the target | | representation has to be distinct from the entity tag of an | |||
| resource if the response in which those alternatives are provided has | | unencoded representation to prevent potential conflicts during | |||
| the semantics of being a representation of the target resource (e.g., | | cache updates and range requests. In contrast, transfer | |||
| a 200 (OK) response to a GET request) or has the semantics of | | codings (Section 7 of [Messaging]) apply only during message | |||
| providing links to alternative representations for the target | | transfer and do not result in distinct entity-tags. | |||
| resource (e.g., a 300 (Multiple Choices) response to a GET request). | ||||
| A server might choose not to send an initial representation, other | 7.9.4. When to Use Entity-Tags and Last-Modified Dates | |||
| than the list of alternatives, and thereby indicate that reactive | ||||
| negotiation by the user agent is preferred. For example, the | ||||
| alternatives listed in responses with the 300 (Multiple Choices) and | ||||
| 406 (Not Acceptable) status codes include information about the | ||||
| available representations so that the user or user agent can react by | ||||
| making a selection. | ||||
| Reactive negotiation is advantageous when the response would vary | In 200 (OK) responses to GET or HEAD, an origin server: | |||
| over commonly used dimensions (such as type, language, or encoding), | ||||
| when the origin server is unable to determine a user agent's | ||||
| capabilities from examining the request, and generally when public | ||||
| caches are used to distribute server load and reduce network usage. | ||||
| Reactive negotiation suffers from the disadvantages of transmitting a | o SHOULD send an entity-tag validator unless it is not feasible to | |||
| list of alternatives to the user agent, which degrades user-perceived | generate one. | |||
| latency if transmitted in the header section, and needing a second | ||||
| request to obtain an alternate representation. Furthermore, this | ||||
| specification does not define a mechanism for supporting automatic | ||||
| selection, though it does not prevent such a mechanism from being | ||||
| developed as an extension. | ||||
| 7.4.3. Request Payload Negotiation | o MAY send a weak entity-tag instead of a strong entity-tag, if | |||
| performance considerations support the use of weak entity-tags, or | ||||
| if it is unfeasible to send a strong entity-tag. | ||||
| When content negotiation preferences are sent in a server's response, | o SHOULD send a Last-Modified value if it is feasible to send one. | |||
| the listed preferences are called request payload negotiation because | ||||
| they intend to influence selection of an appropriate payload for | ||||
| subsequent requests to that resource. For example, the | ||||
| Accept-Encoding field (Section 9.4.3) can be sent in a response to | ||||
| indicate preferred content codings for subsequent requests to that | ||||
| resource [RFC7694]. | ||||
| | Similarly, Section 3.1 of [RFC5789] defines the "Accept-Patch" | In other words, the preferred behavior for an origin server is to | |||
| | response header field which allows discovery of which content | send both a strong entity-tag and a Last-Modified value in successful | |||
| | types are accepted in PATCH requests. | responses to a retrieval request. | |||
| 7.4.4. Quality Values | A client: | |||
| The content negotiation fields defined by this specification use a | o MUST send that entity-tag in any cache validation request (using | |||
| common parameter, named "q" (case-insensitive), to assign a relative | If-Match or If-None-Match) if an entity-tag has been provided by | |||
| "weight" to the preference for that associated kind of content. This | the origin server. | |||
| weight is referred to as a "quality value" (or "qvalue") because the | ||||
| same parameter name is often used within server configurations to | ||||
| assign a weight to the relative quality of the various | ||||
| representations that can be selected for a resource. | ||||
| The weight is normalized to a real number in the range 0 through 1, | o SHOULD send the Last-Modified value in non-subrange cache | |||
| where 0.001 is the least preferred and 1 is the most preferred; a | validation requests (using If-Modified-Since) if only a Last- | |||
| value of 0 means "not acceptable". If no "q" parameter is present, | Modified value has been provided by the origin server. | |||
| the default weight is 1. | ||||
| weight = OWS ";" OWS "q=" qvalue | o MAY send the Last-Modified value in subrange cache validation | |||
| qvalue = ( "0" [ "." 0*3DIGIT ] ) | requests (using If-Unmodified-Since) if only a Last-Modified value | |||
| / ( "1" [ "." 0*3("0") ] ) | has been provided by an HTTP/1.0 origin server. The user agent | |||
| SHOULD provide a way to disable this, in case of difficulty. | ||||
| A sender of qvalue MUST NOT generate more than three digits after the | o SHOULD send both validators in cache validation requests if both | |||
| decimal point. User configuration of these values ought to be | an entity-tag and a Last-Modified value have been provided by the | |||
| limited in the same fashion. | origin server. This allows both HTTP/1.0 and HTTP/1.1 caches to | |||
| respond appropriately. | ||||
| 8. Request Methods | 8. Methods | |||
| 8.1. Overview | 8.1. Overview | |||
| The request method token is the primary source of request semantics; | The request method token is the primary source of request semantics; | |||
| it indicates the purpose for which the client has made this request | it indicates the purpose for which the client has made this request | |||
| and what is expected by the client as a successful result. | and what is expected by the client as a successful result. | |||
| The request method's semantics might be further specialized by the | The request method's semantics might be further specialized by the | |||
| semantics of some header fields when present in a request (Section 9) | semantics of some header fields when present in a request if those | |||
| if those additional semantics do not conflict with the method. For | additional semantics do not conflict with the method. For example, a | |||
| example, a client can send conditional request header fields | client can send conditional request header fields (Section 12.1) to | |||
| (Section 9.2) to make the requested action conditional on the current | make the requested action conditional on the current state of the | |||
| state of the target resource. | target resource. | |||
| method = token | method = token | |||
| HTTP was originally designed to be usable as an interface to | HTTP was originally designed to be usable as an interface to | |||
| distributed object systems. The request method was envisioned as | distributed object systems. The request method was envisioned as | |||
| applying semantics to a target resource in much the same way as | applying semantics to a target resource in much the same way as | |||
| invoking a defined method on an identified object would apply | invoking a defined method on an identified object would apply | |||
| semantics. | semantics. | |||
| The method token is case-sensitive because it might be used as a | The method token is case-sensitive because it might be used as a | |||
| skipping to change at page 86, line 29 ¶ | skipping to change at page 78, line 26 ¶ | |||
| DELETE Remove all current representations of the 8.3.5 | DELETE Remove all current representations of the 8.3.5 | |||
| target resource. | target resource. | |||
| CONNECT Establish a tunnel to the server 8.3.6 | CONNECT Establish a tunnel to the server 8.3.6 | |||
| identified by the target resource. | identified by the target resource. | |||
| OPTIONS Describe the communication options for the 8.3.7 | OPTIONS Describe the communication options for the 8.3.7 | |||
| target resource. | target resource. | |||
| TRACE Perform a message loop-back test along the 8.3.8 | TRACE Perform a message loop-back test along the 8.3.8 | |||
| path to the target resource. | path to the target resource. | |||
| --------- -------------------------------------------- ------- | --------- -------------------------------------------- ------- | |||
| Table 10 | Table 7 | |||
| All general-purpose servers MUST support the methods GET and HEAD. | All general-purpose servers MUST support the methods GET and HEAD. | |||
| All other methods are OPTIONAL. | All other methods are OPTIONAL. | |||
| The set of methods allowed by a target resource can be listed in an | The set of methods allowed by a target resource can be listed in an | |||
| Allow header field (Section 11.4.2). However, the set of allowed | Allow header field (Section 9.2.1). However, the set of allowed | |||
| methods can change dynamically. When a request method is received | methods can change dynamically. When a request method is received | |||
| that is unrecognized or not implemented by an origin server, the | that is unrecognized or not implemented by an origin server, the | |||
| origin server SHOULD respond with the 501 (Not Implemented) status | origin server SHOULD respond with the 501 (Not Implemented) status | |||
| code. When a request method is received that is known by an origin | code. When a request method is received that is known by an origin | |||
| server but not allowed for the target resource, the origin server | server but not allowed for the target resource, the origin server | |||
| SHOULD respond with the 405 (Method Not Allowed) status code. | SHOULD respond with the 405 (Method Not Allowed) status code. | |||
| 8.2. Common Method Properties | Additional methods, outside the scope of this specification, have | |||
| been specified for use in HTTP. All such methods ought to be | ||||
| --------- ------ ------------ ------- | registered within the "Hypertext Transfer Protocol (HTTP) Method | |||
| Method Safe Idempotent Ref. | Registry", as described in Section 15.1. | |||
| --------- ------ ------------ ------- | ||||
| CONNECT no no 8.3.6 | ||||
| DELETE no yes 8.3.5 | ||||
| GET yes yes 8.3.1 | ||||
| HEAD yes yes 8.3.2 | ||||
| OPTIONS yes yes 8.3.7 | ||||
| POST no no 8.3.3 | ||||
| PUT no yes 8.3.4 | ||||
| TRACE yes yes 8.3.8 | ||||
| --------- ------ ------------ ------- | ||||
| Table 11 | ||||
| 8.2. Common Method Properties | ||||
| 8.2.1. Safe Methods | 8.2.1. Safe Methods | |||
| Request methods are considered "safe" if their defined semantics are | Request methods are considered "safe" if their defined semantics are | |||
| essentially read-only; i.e., the client does not request, and does | essentially read-only; i.e., the client does not request, and does | |||
| not expect, any state change on the origin server as a result of | not expect, any state change on the origin server as a result of | |||
| applying a safe method to a target resource. Likewise, reasonable | applying a safe method to a target resource. Likewise, reasonable | |||
| use of a safe method is not expected to cause any harm, loss of | use of a safe method is not expected to cause any harm, loss of | |||
| property, or unusual burden on the origin server. | property, or unusual burden on the origin server. | |||
| This definition of safe methods does not prevent an implementation | This definition of safe methods does not prevent an implementation | |||
| skipping to change at page 89, line 40 ¶ | skipping to change at page 81, line 37 ¶ | |||
| referring to making a GET request. A successful response reflects | referring to making a GET request. A successful response reflects | |||
| the quality of "sameness" identified by the target URI. In turn, | the quality of "sameness" identified by the target URI. In turn, | |||
| constructing applications such that they produce a URI for each | constructing applications such that they produce a URI for each | |||
| important resource results in more resources being available for | important resource results in more resources being available for | |||
| other applications, producing a network effect that promotes further | other applications, producing a network effect that promotes further | |||
| expansion of the Web. | expansion of the Web. | |||
| It is tempting to think of resource identifiers as remote file system | It is tempting to think of resource identifiers as remote file system | |||
| pathnames and of representations as being a copy of the contents of | pathnames and of representations as being a copy of the contents of | |||
| such files. In fact, that is how many resources are implemented (see | such files. In fact, that is how many resources are implemented (see | |||
| Section 12.3 for related security considerations). However, there | Section 16.3 for related security considerations). However, there | |||
| are no such limitations in practice. | are no such limitations in practice. | |||
| The HTTP interface for a resource is just as likely to be implemented | The HTTP interface for a resource is just as likely to be implemented | |||
| as a tree of content objects, a programmatic view on various database | as a tree of content objects, a programmatic view on various database | |||
| records, or a gateway to other information systems. Even when the | records, or a gateway to other information systems. Even when the | |||
| URI mapping mechanism is tied to a file system, an origin server | URI mapping mechanism is tied to a file system, an origin server | |||
| might be configured to execute the files with the request as input | might be configured to execute the files with the request as input | |||
| and send the output as the representation rather than transfer the | and send the output as the representation rather than transfer the | |||
| files directly. Regardless, only the origin server needs to know how | files directly. Regardless, only the origin server needs to know how | |||
| each of its resource identifiers corresponds to an implementation and | each of its resource identifiers corresponds to an implementation and | |||
| how each implementation manages to select and send a current | how each implementation manages to select and send a current | |||
| representation of the target resource in a response to GET. | representation of the target resource in a response to GET. | |||
| A client can alter the semantics of GET to be a "range request", | A client can alter the semantics of GET to be a "range request", | |||
| requesting transfer of only some part(s) of the selected | requesting transfer of only some part(s) of the selected | |||
| representation, by sending a Range header field in the request | representation, by sending a Range header field in the request | |||
| (Section 9.3). | (Section 13.2). | |||
| A client SHOULD NOT generate a body in a GET request. A payload | A client SHOULD NOT generate a body in a GET request. A payload | |||
| received in a GET request has no defined semantics, cannot alter the | received in a GET request has no defined semantics, cannot alter the | |||
| meaning or target of the request, and might lead some implementations | meaning or target of the request, and might lead some implementations | |||
| to reject the request and close the connection because of its | to reject the request and close the connection because of its | |||
| potential as a request smuggling attack (Section 11.2 of | potential as a request smuggling attack (Section 11.2 of | |||
| [Messaging]). | [Messaging]). | |||
| The response to a GET request is cacheable; a cache MAY use it to | The response to a GET request is cacheable; a cache MAY use it to | |||
| satisfy subsequent GET and HEAD requests unless otherwise indicated | satisfy subsequent GET and HEAD requests unless otherwise indicated | |||
| by the Cache-Control header field (Section 5.2 of [Caching]). A | by the Cache-Control header field (Section 5.2 of [Caching]). A | |||
| cache that receives a payload in a GET request is likely to ignore | cache that receives a payload in a GET request is likely to ignore | |||
| that payload and cache regardless of the payload contents. | that payload and cache regardless of the payload contents. | |||
| When information retrieval is performed with a mechanism that | When information retrieval is performed with a mechanism that | |||
| constructs a target URI from user-provided information, such as the | constructs a target URI from user-provided information, such as the | |||
| query fields of a form using GET, potentially sensitive data might be | query fields of a form using GET, potentially sensitive data might be | |||
| provided that would not be appropriate for disclosure within a URI | provided that would not be appropriate for disclosure within a URI | |||
| (see Section 12.9). In some cases, the data can be filtered or | (see Section 16.9). In some cases, the data can be filtered or | |||
| transformed such that it would not reveal such information. In | transformed such that it would not reveal such information. In | |||
| others, particularly when there is no benefit from caching a | others, particularly when there is no benefit from caching a | |||
| response, using the POST method (Section 8.3.3) instead of GET will | response, using the POST method (Section 8.3.3) instead of GET will | |||
| usually transmit such information in the request body rather than | usually transmit such information in the request body rather than | |||
| construct a new URI. | construct a new URI. | |||
| 8.3.2. HEAD | 8.3.2. HEAD | |||
| The HEAD method is identical to GET except that the server MUST NOT | The HEAD method is identical to GET except that the server MUST NOT | |||
| send a message body in the response (i.e., the response terminates at | send a message body in the response (i.e., the response terminates at | |||
| the end of the header section). The server SHOULD send the same | the end of the header section). The server SHOULD send the same | |||
| header fields in response to a HEAD request as it would have sent if | header fields in response to a HEAD request as it would have sent if | |||
| the request had been a GET, except that the payload header fields | the request had been a GET, except that the payload header fields | |||
| (Section 7.3) MAY be omitted. This method can be used for obtaining | (Section 5.5) MAY be omitted. This method can be used for obtaining | |||
| metadata about the selected representation without transferring the | metadata about the selected representation without transferring the | |||
| representation data and is often used for testing hypertext links for | representation data and is often used for testing hypertext links for | |||
| validity, accessibility, and recent modification. | validity, accessibility, and recent modification. | |||
| A payload within a HEAD request message has no defined semantics; | A payload within a HEAD request message has no defined semantics; | |||
| sending a payload body on a HEAD request might cause some existing | sending a payload body on a HEAD request might cause some existing | |||
| implementations to reject the request. | implementations to reject the request. | |||
| The response to a HEAD request is cacheable; a cache MAY use it to | The response to a HEAD request is cacheable; a cache MAY use it to | |||
| satisfy subsequent HEAD requests unless otherwise indicated by the | satisfy subsequent HEAD requests unless otherwise indicated by the | |||
| skipping to change at page 91, line 40 ¶ | skipping to change at page 83, line 40 ¶ | |||
| appropriate status code depending on the result of processing the | appropriate status code depending on the result of processing the | |||
| POST request; almost all of the status codes defined by this | POST request; almost all of the status codes defined by this | |||
| specification could be received in a response to POST (the exceptions | specification could be received in a response to POST (the exceptions | |||
| being 206 (Partial Content), 304 (Not Modified), and 416 (Range Not | being 206 (Partial Content), 304 (Not Modified), and 416 (Range Not | |||
| Satisfiable)). | Satisfiable)). | |||
| If one or more resources has been created on the origin server as a | If one or more resources has been created on the origin server as a | |||
| result of successfully processing a POST request, the origin server | result of successfully processing a POST request, the origin server | |||
| SHOULD send a 201 (Created) response containing a Location header | SHOULD send a 201 (Created) response containing a Location header | |||
| field that provides an identifier for the primary resource created | field that provides an identifier for the primary resource created | |||
| (Section 11.1.2) and a representation that describes the status of | (Section 9.2.3) and a representation that describes the status of the | |||
| the request while referring to the new resource(s). | request while referring to the new resource(s). | |||
| Responses to POST requests are only cacheable when they include | Responses to POST requests are only cacheable when they include | |||
| explicit freshness information (see Section 4.2.1 of [Caching]) and a | explicit freshness information (see Section 4.2.1 of [Caching]) and a | |||
| Content-Location header field that has the same value as the POST's | Content-Location header field that has the same value as the POST's | |||
| target URI (Section 7.2.5). A cached POST response can be reused to | target URI (Section 7.8). A cached POST response can be reused to | |||
| satisfy a later GET or HEAD request, but not a POST request, since | satisfy a later GET or HEAD request, but not a POST request, since | |||
| POST is required to be written through to the origin server, because | POST is required to be written through to the origin server, because | |||
| it is unsafe; see Section 4 of [Caching]. | it is unsafe; see Section 4 of [Caching]. | |||
| If the result of processing a POST would be equivalent to a | If the result of processing a POST would be equivalent to a | |||
| representation of an existing resource, an origin server MAY redirect | representation of an existing resource, an origin server MAY redirect | |||
| the user agent to that resource by sending a 303 (See Other) response | the user agent to that resource by sending a 303 (See Other) response | |||
| with the existing resource's identifier in the Location field. This | with the existing resource's identifier in the Location field. This | |||
| has the benefits of providing the user agent a resource identifier | has the benefits of providing the user agent a resource identifier | |||
| and transferring the representation via a method more amenable to | and transferring the representation via a method more amenable to | |||
| skipping to change at page 93, line 45 ¶ | skipping to change at page 85, line 45 ¶ | |||
| agent request and the semantics of the origin server response. It | agent request and the semantics of the origin server response. It | |||
| does not define what a resource might be, in any sense of that word, | does not define what a resource might be, in any sense of that word, | |||
| beyond the interface provided via HTTP. It does not define how | beyond the interface provided via HTTP. It does not define how | |||
| resource state is "stored", nor how such storage might change as a | resource state is "stored", nor how such storage might change as a | |||
| result of a change in resource state, nor how the origin server | result of a change in resource state, nor how the origin server | |||
| translates resource state into representations. Generally speaking, | translates resource state into representations. Generally speaking, | |||
| all implementation details behind the resource interface are | all implementation details behind the resource interface are | |||
| intentionally hidden by the server. | intentionally hidden by the server. | |||
| An origin server MUST NOT send a validator header field | An origin server MUST NOT send a validator header field | |||
| (Section 11.2), such as an ETag or Last-Modified field, in a | (Section 7.9), such as an ETag or Last-Modified field, in a | |||
| successful response to PUT unless the request's representation data | successful response to PUT unless the request's representation data | |||
| was saved without any transformation applied to the body (i.e., the | was saved without any transformation applied to the body (i.e., the | |||
| resource's new representation data is identical to the representation | resource's new representation data is identical to the representation | |||
| data received in the PUT request) and the validator field value | data received in the PUT request) and the validator field value | |||
| reflects the new representation. This requirement allows a user | reflects the new representation. This requirement allows a user | |||
| agent to know when the representation body it has in memory remains | agent to know when the representation body it has in memory remains | |||
| current as a result of the PUT, thus not in need of being retrieved | current as a result of the PUT, thus not in need of being retrieved | |||
| again from the origin server, and that the new validator(s) received | again from the origin server, and that the new validator(s) received | |||
| in the response can be used for future conditional requests in order | in the response can be used for future conditional requests in order | |||
| to prevent accidental overwrites (Section 9.2). | to prevent accidental overwrites (Section 12.1). | |||
| The fundamental difference between the POST and PUT methods is | The fundamental difference between the POST and PUT methods is | |||
| highlighted by the different intent for the enclosed representation. | highlighted by the different intent for the enclosed representation. | |||
| The target resource in a POST request is intended to handle the | The target resource in a POST request is intended to handle the | |||
| enclosed representation according to the resource's own semantics, | enclosed representation according to the resource's own semantics, | |||
| whereas the enclosed representation in a PUT request is defined as | whereas the enclosed representation in a PUT request is defined as | |||
| replacing the state of the target resource. Hence, the intent of PUT | replacing the state of the target resource. Hence, the intent of PUT | |||
| is idempotent and visible to intermediaries, even though the exact | is idempotent and visible to intermediaries, even though the exact | |||
| effect is only known by the origin server. | effect is only known by the origin server. | |||
| skipping to change at page 94, line 40 ¶ | skipping to change at page 86, line 40 ¶ | |||
| identifying "the current version" (a resource) that is separate from | identifying "the current version" (a resource) that is separate from | |||
| the URIs identifying each particular version (different resources | the URIs identifying each particular version (different resources | |||
| that at one point shared the same state as the current version | that at one point shared the same state as the current version | |||
| resource). A successful PUT request on "the current version" URI | resource). A successful PUT request on "the current version" URI | |||
| might therefore create a new version resource in addition to changing | might therefore create a new version resource in addition to changing | |||
| the state of the target resource, and might also cause links to be | the state of the target resource, and might also cause links to be | |||
| added between the related resources. | added between the related resources. | |||
| An origin server that allows PUT on a given target resource MUST send | An origin server that allows PUT on a given target resource MUST send | |||
| a 400 (Bad Request) response to a PUT request that contains a | a 400 (Bad Request) response to a PUT request that contains a | |||
| Content-Range header field (Section 7.3.4), since the payload is | Content-Range header field (Section 13.4), since the payload is | |||
| likely to be partial content that has been mistakenly PUT as a full | likely to be partial content that has been mistakenly PUT as a full | |||
| representation. Partial content updates are possible by targeting a | representation. Partial content updates are possible by targeting a | |||
| separately identified resource with state that overlaps a portion of | separately identified resource with state that overlaps a portion of | |||
| the larger resource, or by using a different method that has been | the larger resource, or by using a different method that has been | |||
| specifically defined for partial updates (for example, the PATCH | specifically defined for partial updates (for example, the PATCH | |||
| method defined in [RFC5789]). | method defined in [RFC5789]). | |||
| Responses to the PUT method are not cacheable. If a successful PUT | Responses to the PUT method are not cacheable. If a successful PUT | |||
| request passes through a cache that has one or more stored responses | request passes through a cache that has one or more stored responses | |||
| for the target URI, those stored responses will be invalidated (see | for the target URI, those stored responses will be invalidated (see | |||
| skipping to change at page 98, line 28 ¶ | skipping to change at page 90, line 28 ¶ | |||
| header that might indicate optional features implemented by the | header that might indicate optional features implemented by the | |||
| server and applicable to the target resource (e.g., Allow), including | server and applicable to the target resource (e.g., Allow), including | |||
| potential extensions not defined by this specification. The response | potential extensions not defined by this specification. The response | |||
| payload, if any, might also describe the communication options in a | payload, if any, might also describe the communication options in a | |||
| machine or human-readable representation. A standard format for such | machine or human-readable representation. A standard format for such | |||
| a representation is not defined by this specification, but might be | a representation is not defined by this specification, but might be | |||
| defined by future extensions to HTTP. | defined by future extensions to HTTP. | |||
| A client MAY send a Max-Forwards header field in an OPTIONS request | A client MAY send a Max-Forwards header field in an OPTIONS request | |||
| to target a specific recipient in the request chain (see | to target a specific recipient in the request chain (see | |||
| Section 9.1.2). A proxy MUST NOT generate a Max-Forwards header | Section 6.4.2). A proxy MUST NOT generate a Max-Forwards header | |||
| field while forwarding a request unless that request was received | field while forwarding a request unless that request was received | |||
| with a Max-Forwards field. | with a Max-Forwards field. | |||
| A client that generates an OPTIONS request containing a payload body | A client that generates an OPTIONS request containing a payload body | |||
| MUST send a valid Content-Type header field describing the | MUST send a valid Content-Type header field describing the | |||
| representation media type. Note that this specification does not | representation media type. Note that this specification does not | |||
| define any use for such a payload. | define any use for such a payload. | |||
| Responses to the OPTIONS method are not cacheable. | Responses to the OPTIONS method are not cacheable. | |||
| 8.3.8. TRACE | 8.3.8. TRACE | |||
| The TRACE method requests a remote, application-level loop-back of | The TRACE method requests a remote, application-level loop-back of | |||
| the request message. The final recipient of the request SHOULD | the request message. The final recipient of the request SHOULD | |||
| reflect the message received, excluding some fields described below, | reflect the message received, excluding some fields described below, | |||
| back to the client as the message body of a 200 (OK) response with a | back to the client as the message body of a 200 (OK) response with a | |||
| Content-Type of "message/http" (Section 10.1 of [Messaging]). The | Content-Type of "message/http" (Section 10.1 of [Messaging]). The | |||
| final recipient is either the origin server or the first server to | final recipient is either the origin server or the first server to | |||
| receive a Max-Forwards value of zero (0) in the request | receive a Max-Forwards value of zero (0) in the request | |||
| (Section 9.1.2). | (Section 6.4.2). | |||
| A client MUST NOT generate fields in a TRACE request containing | A client MUST NOT generate fields in a TRACE request containing | |||
| sensitive data that might be disclosed by the response. For example, | sensitive data that might be disclosed by the response. For example, | |||
| it would be foolish for a user agent to send stored user credentials | it would be foolish for a user agent to send stored user credentials | |||
| Section 9.5 or cookies [RFC6265] in a TRACE request. The final | Section 10 or cookies [RFC6265] in a TRACE request. The final | |||
| recipient of the request SHOULD exclude any request fields that are | recipient of the request SHOULD exclude any request fields that are | |||
| likely to contain sensitive data when that recipient generates the | likely to contain sensitive data when that recipient generates the | |||
| response body. | response body. | |||
| TRACE allows the client to see what is being received at the other | TRACE allows the client to see what is being received at the other | |||
| end of the request chain and use that data for testing or diagnostic | end of the request chain and use that data for testing or diagnostic | |||
| information. The value of the Via header field (Section 6.6.1) is of | information. The value of the Via header field (Section 6.4.3) is of | |||
| particular interest, since it acts as a trace of the request chain. | particular interest, since it acts as a trace of the request chain. | |||
| Use of the Max-Forwards header field allows the client to limit the | Use of the Max-Forwards header field allows the client to limit the | |||
| length of the request chain, which is useful for testing a chain of | length of the request chain, which is useful for testing a chain of | |||
| proxies forwarding messages in an infinite loop. | proxies forwarding messages in an infinite loop. | |||
| A client MUST NOT send a message body in a TRACE request. | A client MUST NOT send a message body in a TRACE request. | |||
| Responses to the TRACE method are not cacheable. | Responses to the TRACE method are not cacheable. | |||
| 8.4. Method Extensibility | 9. Context | |||
| Additional methods, outside the scope of this specification, have | ||||
| been specified for use in HTTP. All such methods ought to be | ||||
| registered within the "Hypertext Transfer Protocol (HTTP) Method | ||||
| Registry". | ||||
| 8.4.1. Method Registry | ||||
| The "Hypertext Transfer Protocol (HTTP) Method Registry", maintained | ||||
| by IANA at <https://www.iana.org/assignments/http-methods>, registers | ||||
| method names. | ||||
| HTTP method registrations MUST include the following fields: | ||||
| o Method Name (see Section 8) | ||||
| o Safe ("yes" or "no", see Section 8.2.1) | ||||
| o Idempotent ("yes" or "no", see Section 8.2.2) | ||||
| o Pointer to specification text | ||||
| Values to be added to this namespace require IETF Review (see | ||||
| [RFC8126], Section 4.8). | ||||
| 8.4.2. Considerations for New Methods | ||||
| Standardized methods are generic; that is, they are potentially | ||||
| applicable to any resource, not just one particular media type, kind | ||||
| of resource, or application. As such, it is preferred that new | ||||
| methods be registered in a document that isn't specific to a single | ||||
| application or data format, since orthogonal technologies deserve | ||||
| orthogonal specification. | ||||
| Since message parsing (Section 6 of [Messaging]) needs to be | ||||
| independent of method semantics (aside from responses to HEAD), | ||||
| definitions of new methods cannot change the parsing algorithm or | ||||
| prohibit the presence of a message body on either the request or the | ||||
| response message. Definitions of new methods can specify that only a | ||||
| zero-length message body is allowed by requiring a Content-Length | ||||
| header field with a value of "0". | ||||
| A new method definition needs to indicate whether it is safe | ||||
| (Section 8.2.1), idempotent (Section 8.2.2), cacheable | ||||
| (Section 8.2.3), what semantics are to be associated with the payload | ||||
| body if any is present in the request and what refinements the method | ||||
| makes to header field or status code semantics. If the new method is | ||||
| cacheable, its definition ought to describe how, and under what | ||||
| conditions, a cache can store a response and use it to satisfy a | ||||
| subsequent request. The new method ought to describe whether it can | ||||
| be made conditional (Section 9.2) and, if so, how a server responds | ||||
| when the condition is false. Likewise, if the new method might have | ||||
| some use for partial response semantics (Section 9.3), it ought to | ||||
| document this, too. | ||||
| | *Note:* Avoid defining a method name that starts with "M-", | ||||
| | since that prefix might be misinterpreted as having the | ||||
| | semantics assigned to it by [RFC2774]. | ||||
| 9. Request Header Fields | 9.1. Request Context | |||
| A client sends request header fields to provide more information | A client sends request header fields to provide more information | |||
| about the request context, make the request conditional based on the | about the request context, make the request conditional based on the | |||
| target resource state, suggest preferred formats for the response, | target resource state, suggest preferred formats for the response, | |||
| supply authentication credentials, or modify the expected request | supply authentication credentials, or modify the expected request | |||
| processing. These fields act as request modifiers, similar to the | processing. These fields act as request modifiers, similar to the | |||
| parameters on a programming language method invocation. | parameters on a programming language method invocation. | |||
| 9.1. Controls | The following request header fields provide additional information | |||
| about the request context, including information about the user, user | ||||
| Controls are request header fields that direct specific handling of | agent, and resource behind the request. | |||
| the request. | ||||
| --------------- -------------------------- | ------------ ------- | |||
| Field Name Ref. | Field Name Ref. | |||
| --------------- -------------------------- | ------------ ------- | |||
| Cache-Control Section 5.2 of [Caching] | Expect 9.1.1 | |||
| Expect 9.1.1 | From 9.1.2 | |||
| Host 6.5 | Referer 9.1.3 | |||
| Max-Forwards 9.1.2 | TE 9.1.4 | |||
| Pragma Section 5.4 of [Caching] | Trailer 9.1.5 | |||
| TE 5.6.5 | User-Agent 9.1.6 | |||
| --------------- -------------------------- | ------------ ------- | |||
| Table 12 | Table 8 | |||
| 9.1.1. Expect | 9.1.1. Expect | |||
| The "Expect" header field in a request indicates a certain set of | The "Expect" header field in a request indicates a certain set of | |||
| behaviors (expectations) that need to be supported by the server in | behaviors (expectations) that need to be supported by the server in | |||
| order to properly handle this request. | order to properly handle this request. | |||
| Expect = #expectation | Expect = #expectation | |||
| expectation = token [ "=" ( token / quoted-string ) parameters ] | expectation = token [ "=" ( token / quoted-string ) parameters ] | |||
| skipping to change at page 103, line 42 ¶ | skipping to change at page 94, line 27 ¶ | |||
| | *Note:* The Expect header field was added after the original | | *Note:* The Expect header field was added after the original | |||
| | publication of HTTP/1.1 [RFC2068] as both the means to request | | publication of HTTP/1.1 [RFC2068] as both the means to request | |||
| | an interim 100 (Continue) response and the general mechanism | | an interim 100 (Continue) response and the general mechanism | |||
| | for indicating must-understand extensions. However, the | | for indicating must-understand extensions. However, the | |||
| | extension mechanism has not been used by clients and the must- | | extension mechanism has not been used by clients and the must- | |||
| | understand requirements have not been implemented by many | | understand requirements have not been implemented by many | |||
| | servers, rendering the extension mechanism useless. This | | servers, rendering the extension mechanism useless. This | |||
| | specification has removed the extension mechanism in order to | | specification has removed the extension mechanism in order to | |||
| | simplify the definition and processing of 100-continue. | | simplify the definition and processing of 100-continue. | |||
| 9.1.2. Max-Forwards | 9.1.2. From | |||
| The "Max-Forwards" header field provides a mechanism with the TRACE | The "From" header field contains an Internet email address for a | |||
| (Section 8.3.8) and OPTIONS (Section 8.3.7) request methods to limit | human user who controls the requesting user agent. The address ought | |||
| the number of times that the request is forwarded by proxies. This | to be machine-usable, as defined by "mailbox" in Section 3.4 of | |||
| can be useful when the client is attempting to trace a request that | [RFC5322]: | |||
| appears to be failing or looping mid-chain. | ||||
| Max-Forwards = 1*DIGIT | From = mailbox | |||
| The Max-Forwards value is a decimal integer indicating the remaining | mailbox = <mailbox, see [RFC5322], Section 3.4> | |||
| number of times this request message can be forwarded. | ||||
| Each intermediary that receives a TRACE or OPTIONS request containing | An example is: | |||
| a Max-Forwards header field MUST check and update its value prior to | ||||
| forwarding the request. If the received value is zero (0), the | ||||
| intermediary MUST NOT forward the request; instead, the intermediary | ||||
| MUST respond as the final recipient. If the received Max-Forwards | ||||
| value is greater than zero, the intermediary MUST generate an updated | ||||
| Max-Forwards field in the forwarded message with a field value that | ||||
| is the lesser of a) the received value decremented by one (1) or b) | ||||
| the recipient's maximum supported value for Max-Forwards. | ||||
| A recipient MAY ignore a Max-Forwards header field received with any | From: webmaster@example.org | |||
| other request methods. | ||||
| 9.2. Preconditions | The From header field is rarely sent by non-robotic user agents. A | |||
| user agent SHOULD NOT send a From header field without explicit | ||||
| configuration by the user, since that might conflict with the user's | ||||
| privacy interests or their site's security policy. | ||||
| A conditional request is an HTTP request with one or more request | A robotic user agent SHOULD send a valid From header field so that | |||
| header fields that indicate a precondition to be tested before | the person responsible for running the robot can be contacted if | |||
| applying the request method to the target resource. Section 9.2.1 | problems occur on servers, such as if the robot is sending excessive, | |||
| defines when preconditions are applied. Section 9.2.2 defines the | unwanted, or invalid requests. | |||
| order of evaluation when more than one precondition is present. | ||||
| Conditional GET requests are the most efficient mechanism for HTTP | A server SHOULD NOT use the From header field for access control or | |||
| cache updates [Caching]. Conditionals can also be applied to state- | authentication, since most recipients will assume that the field | |||
| changing methods, such as PUT and DELETE, to prevent the "lost | value is public information. | |||
| update" problem: one client accidentally overwriting the work of | ||||
| another client that has been acting in parallel. | ||||
| Conditional request preconditions are based on the state of the | 9.1.3. Referer | |||
| target resource as a whole (its current value set) or the state as | ||||
| observed in a previously obtained representation (one value in that | ||||
| set). A resource might have multiple current representations, each | ||||
| with its own observable state. The conditional request mechanisms | ||||
| assume that the mapping of requests to a selected representation | ||||
| (Section 7) will be consistent over time if the server intends to | ||||
| take advantage of conditionals. Regardless, if the mapping is | ||||
| inconsistent and the server is unable to select the appropriate | ||||
| representation, then no harm will result when the precondition | ||||
| evaluates to false. | ||||
| The following request header fields allow a client to place a | The "Referer" [sic] header field allows the user agent to specify a | |||
| precondition on the state of the target resource, so that the action | URI reference for the resource from which the target URI was obtained | |||
| corresponding to the method semantics will not be applied if the | (i.e., the "referrer", though the field name is misspelled). A user | |||
| precondition evaluates to false. Each precondition defined by this | agent MUST NOT include the fragment and userinfo components of the | |||
| specification consists of a comparison between a set of validators | URI reference [RFC3986], if any, when generating the Referer field | |||
| obtained from prior representations of the target resource to the | value. | |||
| current state of validators for the selected representation | ||||
| (Section 11.2). Hence, these preconditions evaluate whether the | ||||
| state of the target resource has changed since a given state known by | ||||
| the client. The effect of such an evaluation depends on the method | ||||
| semantics and choice of conditional, as defined in Section 9.2.1. | ||||
| --------------------- ------- | Referer = absolute-URI / partial-URI | |||
| Field Name Ref. | ||||
| --------------------- ------- | ||||
| If-Match 9.2.3 | ||||
| If-None-Match 9.2.4 | ||||
| If-Modified-Since 9.2.5 | ||||
| If-Unmodified-Since 9.2.6 | ||||
| If-Range 9.2.7 | ||||
| --------------------- ------- | ||||
| Table 13 | The field value is either an absolute-URI or a partial-URI. In the | |||
| latter case (Section 4), the referenced URI is relative to the target | ||||
| URI ([RFC3986], Section 5). | ||||
| 9.2.1. Evaluation | The Referer header field allows servers to generate back-links to | |||
| other resources for simple analytics, logging, optimized caching, | ||||
| etc. It also allows obsolete or mistyped links to be found for | ||||
| maintenance. Some servers use the Referer header field as a means of | ||||
| denying links from other sites (so-called "deep linking") or | ||||
| restricting cross-site request forgery (CSRF), but not all requests | ||||
| contain it. | ||||
| Except when excluded below, a recipient cache or origin server MUST | Example: | |||
| evaluate received request preconditions after it has successfully | ||||
| performed its normal request checks and just before it would process | ||||
| the request body (if any) or perform the action associated with the | ||||
| request method. A server MUST ignore all received preconditions if | ||||
| its response to the same request without those conditions, prior to | ||||
| processing the request body, would have been a status code other than | ||||
| a 2xx (Successful) or 412 (Precondition Failed). In other words, | ||||
| redirects and failures that can be detected before significant | ||||
| processing occurs take precedence over the evaluation of | ||||
| preconditions. | ||||
| A server that is not the origin server for the target resource and | Referer: http://www.example.org/hypertext/Overview.html | |||
| cannot act as a cache for requests on the target resource MUST NOT | ||||
| evaluate the conditional request header fields defined by this | ||||
| specification, and it MUST forward them if the request is forwarded, | ||||
| since the generating client intends that they be evaluated by a | ||||
| server that can provide a current representation. Likewise, a server | ||||
| MUST ignore the conditional request header fields defined by this | ||||
| specification when received with a request method that does not | ||||
| involve the selection or modification of a selected representation, | ||||
| such as CONNECT, OPTIONS, or TRACE. | ||||
| Note that protocol extensions can modify the conditions under which | If the target URI was obtained from a source that does not have its | |||
| revalidation is triggered. For example, the "immutable" cache | own URI (e.g., input from the user keyboard, or an entry within the | |||
| directive (defined by [RFC8246]) instructs caches to forgo | user's bookmarks/favorites), the user agent MUST either exclude the | |||
| revalidation of fresh responses even when requested by the client. | Referer field or send it with a value of "about:blank". | |||
| Conditional request header fields that are defined by extensions to | The Referer field has the potential to reveal information about the | |||
| HTTP might place conditions on all recipients, on the state of the | request context or browsing history of the user, which is a privacy | |||
| target resource in general, or on a group of resources. For | concern if the referring resource's identifier reveals personal | |||
| instance, the "If" header field in WebDAV can make a request | information (such as an account name) or a resource that is supposed | |||
| conditional on various aspects of multiple resources, such as locks, | to be confidential (such as behind a firewall or internal to a | |||
| if the recipient understands and implements that field ([RFC4918], | secured service). Most general-purpose user agents do not send the | |||
| Section 10.4). | Referer header field when the referring resource is a local "file" or | |||
| "data" URI. A user agent MUST NOT send a Referer header field in an | ||||
| unsecured HTTP request if the referring page was received with a | ||||
| secure protocol. See Section 16.9 for additional security | ||||
| considerations. | ||||
| Although conditional request header fields are defined as being | Some intermediaries have been known to indiscriminately remove | |||
| usable with the HEAD method (to keep HEAD's semantics consistent with | Referer header fields from outgoing requests. This has the | |||
| those of GET), there is no point in sending a conditional HEAD | unfortunate side effect of interfering with protection against CSRF | |||
| because a successful response is around the same size as a 304 (Not | attacks, which can be far more harmful to their users. | |||
| Modified) response and more useful than a 412 (Precondition Failed) | Intermediaries and user agent extensions that wish to limit | |||
| response. | information disclosure in Referer ought to restrict their changes to | |||
| specific edits, such as replacing internal domain names with | ||||
| pseudonyms or truncating the query and/or path components. An | ||||
| intermediary SHOULD NOT modify or delete the Referer header field | ||||
| when the field value shares the same scheme and host as the target | ||||
| URI. | ||||
| 9.2.2. Precedence | 9.1.4. TE | |||
| When more than one conditional request header field is present in a | The "TE" header field in a request can be used to indicate that the | |||
| request, the order in which the fields are evaluated becomes | sender will not discard trailer fields when it contains a "trailers" | |||
| important. In practice, the fields defined in this document are | member, as described in Section 5.6. | |||
| consistently implemented in a single, logical order, since "lost | ||||
| update" preconditions have more strict requirements than cache | ||||
| validation, a validated cache is more efficient than a partial | ||||
| response, and entity tags are presumed to be more accurate than date | ||||
| validators. | ||||
| A recipient cache or origin server MUST evaluate the request | Additionally, specific HTTP versions can use it to indicate the | |||
| preconditions defined by this specification in the following order: | transfer codings the client is willing to accept in the response. | |||
| 1. When recipient is the origin server and If-Match is present, | The TE field-value consists of a list of tokens, each allowing for | |||
| evaluate the If-Match precondition: | optional parameters (as described in Section 5.7.6). | |||
| o if true, continue to step 3 | TE = #t-codings | |||
| t-codings = "trailers" / ( transfer-coding [ t-ranking ] ) | ||||
| t-ranking = OWS ";" OWS "q=" rank | ||||
| rank = ( "0" [ "." 0*3DIGIT ] ) | ||||
| / ( "1" [ "." 0*3("0") ] ) | ||||
| o if false, respond 412 (Precondition Failed) unless it can be | 9.1.5. Trailer | |||
| determined that the state-changing request has already | ||||
| succeeded (see Section 9.2.3) | ||||
| 2. When recipient is the origin server, If-Match is not present, and | The "Trailer" header field provides a list of field names that the | |||
| If-Unmodified-Since is present, evaluate the If-Unmodified-Since | sender anticipates sending as trailer fields within that message. | |||
| precondition: | This allows a recipient to prepare for receipt of the indicated | |||
| metadata before it starts processing the body. | ||||
| o if true, continue to step 3 | Trailer = #field-name | |||
| o if false, respond 412 (Precondition Failed) unless it can be | For example, a sender might indicate that a message integrity check | |||
| determined that the state-changing request has already | will be computed as the payload is being streamed and provide the | |||
| succeeded (see Section 9.2.6) | final signature as a trailer field. This allows a recipient to | |||
| perform the same check on the fly as the payload data is received. | ||||
| 3. When If-None-Match is present, evaluate the If-None-Match | A sender that intends to generate one or more trailer fields in a | |||
| precondition: | message SHOULD generate a Trailer header field in the header section | |||
| of that message to indicate which fields might be present in the | ||||
| trailers. | ||||
| o if true, continue to step 5 | 9.1.6. User-Agent | |||
| o if false for GET/HEAD, respond 304 (Not Modified) | The "User-Agent" header field contains information about the user | |||
| agent originating the request, which is often used by servers to help | ||||
| identify the scope of reported interoperability problems, to work | ||||
| around or tailor responses to avoid particular user agent | ||||
| limitations, and for analytics regarding browser or operating system | ||||
| use. A user agent SHOULD send a User-Agent field in each request | ||||
| unless specifically configured not to do so. | ||||
| o if false for other methods, respond 412 (Precondition Failed) | User-Agent = product *( RWS ( product / comment ) ) | |||
| 4. When the method is GET or HEAD, If-None-Match is not present, and | The User-Agent field value consists of one or more product | |||
| If-Modified-Since is present, evaluate the If-Modified-Since | identifiers, each followed by zero or more comments (Section 5.7.5), | |||
| precondition: | which together identify the user agent software and its significant | |||
| subproducts. By convention, the product identifiers are listed in | ||||
| decreasing order of their significance for identifying the user agent | ||||
| software. Each product identifier consists of a name and optional | ||||
| version. | ||||
| o if true, continue to step 5 | product = token ["/" product-version] | |||
| product-version = token | ||||
| o if false, respond 304 (Not Modified) | A sender SHOULD limit generated product identifiers to what is | |||
| necessary to identify the product; a sender MUST NOT generate | ||||
| advertising or other nonessential information within the product | ||||
| identifier. A sender SHOULD NOT generate information in | ||||
| product-version that is not a version identifier (i.e., successive | ||||
| versions of the same product name ought to differ only in the | ||||
| product-version portion of the product identifier). | ||||
| 5. When the method is GET and both Range and If-Range are present, | Example: | |||
| evaluate the If-Range precondition: | ||||
| o if the validator matches and the Range specification is | User-Agent: CERN-LineMode/2.15 libwww/2.17b3 | |||
| applicable to the selected representation, respond 206 | ||||
| (Partial Content) | ||||
| 6. Otherwise, | A user agent SHOULD NOT generate a User-Agent field containing | |||
| needlessly fine-grained detail and SHOULD limit the addition of | ||||
| subproducts by third parties. Overly long and detailed User-Agent | ||||
| field values increase request latency and the risk of a user being | ||||
| identified against their wishes ("fingerprinting"). | ||||
| o all conditions are met, so perform the requested action and | Likewise, implementations are encouraged not to use the product | |||
| respond according to its success or failure. | tokens of other implementations in order to declare compatibility | |||
| with them, as this circumvents the purpose of the field. If a user | ||||
| agent masquerades as a different user agent, recipients can assume | ||||
| that the user intentionally desires to see responses tailored for | ||||
| that identified user agent, even if they might not work as well for | ||||
| the actual user agent being used. | ||||
| Any extension to HTTP that defines additional conditional request | 9.2. Response Context | |||
| header fields ought to define its own expectations regarding the | ||||
| order for evaluating such fields in relation to those defined in this | ||||
| document and other conditionals that might be found in practice. | ||||
| 9.2.3. If-Match | Response header fields can supply control data that supplements the | |||
| status code, directs caching, or instructs the client where to go | ||||
| next. | ||||
| The "If-Match" header field makes the request method conditional on | The response header fields allow the server to pass additional | |||
| the recipient origin server either having at least one current | information about the response beyond the status code. These header | |||
| representation of the target resource, when the field value is "*", | fields give information about the server, about further access to the | |||
| or having a current representation of the target resource that has an | target resource, or about related resources. | |||
| entity-tag matching a member of the list of entity-tags provided in | ||||
| the field value. | ||||
| An origin server MUST use the strong comparison function when | Although each response header field has a defined meaning, in | |||
| comparing entity-tags for If-Match (Section 11.2.3.2), since the | general, the precise semantics might be further refined by the | |||
| client intends this precondition to prevent the method from being | semantics of the request method and/or response status code. | |||
| applied if there have been any changes to the representation data. | ||||
| If-Match = "*" / #entity-tag | The remaining response header fields provide more information about | |||
| the target resource for potential use in later requests. | ||||
| Examples: | ------------- ------- | |||
| Field Name Ref. | ||||
| ------------- ------- | ||||
| Allow 9.2.1 | ||||
| Date 9.2.2 | ||||
| Location 9.2.3 | ||||
| Retry-After 9.2.4 | ||||
| Server 9.2.5 | ||||
| ------------- ------- | ||||
| If-Match: "xyzzy" | Table 9 | |||
| If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz" | ||||
| If-Match: * | ||||
| If-Match is most often used with state-changing methods (e.g., POST, | 9.2.1. Allow | |||
| PUT, DELETE) to prevent accidental overwrites when multiple user | ||||
| agents might be acting in parallel on the same resource (i.e., to | ||||
| prevent the "lost update" problem). It can also be used with any | ||||
| method to abort a request if the selected representation does not | ||||
| match one that the client has already stored (or partially stored) | ||||
| from a prior request. | ||||
| An origin server that receives an If-Match header field MUST evaluate | The "Allow" header field lists the set of methods advertised as | |||
| the condition as per Section 9.2.1 prior to performing the method. | supported by the target resource. The purpose of this field is | |||
| strictly to inform the recipient of valid request methods associated | ||||
| with the resource. | ||||
| To evaluate a received If-Match header field: | Allow = #method | |||
| 1. If the field value is "*", the condition is true if the origin | Example of use: | |||
| server has a current representation for the target resource. | ||||
| 2. If the field value is a list of entity-tags, the condition is | Allow: GET, HEAD, PUT | |||
| true if any of the listed tags match the entity-tag of the | ||||
| selected representation. | ||||
| 3. Otherwise, the condition is false. | The actual set of allowed methods is defined by the origin server at | |||
| the time of each request. An origin server MUST generate an Allow | ||||
| field in a 405 (Method Not Allowed) response and MAY do so in any | ||||
| other response. An empty Allow field value indicates that the | ||||
| resource allows no methods, which might occur in a 405 response if | ||||
| the resource has been temporarily disabled by configuration. | ||||
| An origin server MUST NOT perform the requested method if a received | A proxy MUST NOT modify the Allow header field - it does not need to | |||
| If-Match condition evaluates to false. Instead, the origin server | understand all of the indicated methods in order to handle them | |||
| MAY indicate that the conditional request failed by responding with a | according to the generic message handling rules. | |||
| 412 (Precondition Failed) status code. Alternatively, if the request | ||||
| is a state-changing operation that appears to have already been | ||||
| applied to the selected representation, the origin server MAY respond | ||||
| with a 2xx (Successful) status code (i.e., the change requested by | ||||
| the user agent has already succeeded, but the user agent might not be | ||||
| aware of it, perhaps because the prior response was lost or an | ||||
| equivalent change was made by some other user agent). | ||||
| Allowing an origin server to send a success response when a change | 9.2.2. Date | |||
| request appears to have already been applied is more efficient for | ||||
| many authoring use cases, but comes with some risk if multiple user | ||||
| agents are making change requests that are very similar but not | ||||
| cooperative. For example, multiple user agents writing to a common | ||||
| resource as a semaphore (e.g., a non-atomic increment) are likely to | ||||
| collide and potentially lose important state transitions. For those | ||||
| kinds of resources, an origin server is better off being stringent in | ||||
| sending 412 for every failed precondition on an unsafe method. In | ||||
| other cases, excluding the ETag field from a success response might | ||||
| encourage the user agent to perform a GET as its next request to | ||||
| eliminate confusion about the resource's current state. | ||||
| The If-Match header field can be ignored by caches and intermediaries | The "Date" header field represents the date and time at which the | |||
| because it is not applicable to a stored response. | message was originated, having the same semantics as the Origination | |||
| Date Field (orig-date) defined in Section 3.6.1 of [RFC5322]. The | ||||
| field value is an HTTP-date, as defined in Section 5.7.7. | ||||
| Note that an If-Match header field with a list value containing "*" | Date = HTTP-date | |||
| and other values (including other instances of "*") is unlikely to be | ||||
| interoperable. | ||||
| 9.2.4. If-None-Match | An example is | |||
| The "If-None-Match" header field makes the request method conditional | Date: Tue, 15 Nov 1994 08:12:31 GMT | |||
| on a recipient cache or origin server either not having any current | ||||
| representation of the target resource, when the field value is "*", | ||||
| or having a selected representation with an entity-tag that does not | ||||
| match any of those listed in the field value. | ||||
| A recipient MUST use the weak comparison function when comparing | When a Date header field is generated, the sender SHOULD generate its | |||
| entity-tags for If-None-Match (Section 11.2.3.2), since weak entity- | field value as the best available approximation of the date and time | |||
| tags can be used for cache validation even if there have been changes | of message generation. In theory, the date ought to represent the | |||
| to the representation data. | moment just before the payload is generated. In practice, the date | |||
| can be generated at any time during message origination. | ||||
| If-None-Match = "*" / #entity-tag | An origin server MUST NOT send a Date header field if it does not | |||
| have a clock capable of providing a reasonable approximation of the | ||||
| current instance in Coordinated Universal Time. An origin server MAY | ||||
| send a Date header field if the response is in the 1xx | ||||
| (Informational) or 5xx (Server Error) class of status codes. An | ||||
| origin server MUST send a Date header field in all other cases. | ||||
| Examples: | A recipient with a clock that receives a response message without a | |||
| Date header field MUST record the time it was received and append a | ||||
| corresponding Date header field to the message's header section if it | ||||
| is cached or forwarded downstream. | ||||
| If-None-Match: "xyzzy" | A user agent MAY send a Date header field in a request, though | |||
| If-None-Match: W/"xyzzy" | generally will not do so unless it is believed to convey useful | |||
| If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz" | information to the server. For example, custom applications of HTTP | |||
| If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz" | might convey a Date if the server is expected to adjust its | |||
| If-None-Match: * | interpretation of the user's request based on differences between the | |||
| user agent and server clocks. | ||||
| If-None-Match is primarily used in conditional GET requests to enable | 9.2.3. Location | |||
| efficient updates of cached information with a minimum amount of | ||||
| transaction overhead. When a client desires to update one or more | ||||
| stored responses that have entity-tags, the client SHOULD generate an | ||||
| If-None-Match header field containing a list of those entity-tags | ||||
| when making a GET request; this allows recipient servers to send a | ||||
| 304 (Not Modified) response to indicate when one of those stored | ||||
| responses matches the selected representation. | ||||
| If-None-Match can also be used with a value of "*" to prevent an | The "Location" header field is used in some responses to refer to a | |||
| unsafe request method (e.g., PUT) from inadvertently modifying an | specific resource in relation to the response. The type of | |||
| existing representation of the target resource when the client | relationship is defined by the combination of request method and | |||
| believes that the resource does not have a current representation | status code semantics. | |||
| (Section 8.2.1). This is a variation on the "lost update" problem | ||||
| that might arise if more than one client attempts to create an | ||||
| initial representation for the target resource. | ||||
| An origin server that receives an If-None-Match header field MUST | Location = URI-reference | |||
| evaluate the condition as per Section 9.2.1 prior to performing the | ||||
| method. | ||||
| To evaluate a received If-None-Match header field: | The field value consists of a single URI-reference. When it has the | |||
| form of a relative reference ([RFC3986], Section 4.2), the final | ||||
| value is computed by resolving it against the target URI ([RFC3986], | ||||
| Section 5). | ||||
| 1. If the field value is "*", the condition is false if the origin | For 201 (Created) responses, the Location value refers to the primary | |||
| server has a current representation for the target resource. | resource created by the request. For 3xx (Redirection) responses, | |||
| the Location value refers to the preferred target resource for | ||||
| automatically redirecting the request. | ||||
| 2. If the field value is a list of entity-tags, the condition is | If the Location value provided in a 3xx (Redirection) response does | |||
| false if one of the listed tags matches the entity-tag of the | not have a fragment component, a user agent MUST process the | |||
| selected representation. | redirection as if the value inherits the fragment component of the | |||
| URI reference used to generate the target URI (i.e., the redirection | ||||
| inherits the original reference's fragment, if any). | ||||
| 3. Otherwise, the condition is true. | For example, a GET request generated for the URI reference | |||
| "http://www.example.org/~tim" might result in a 303 (See Other) | ||||
| response containing the header field: | ||||
| An origin server MUST NOT perform the requested method if the | Location: /People.html#tim | |||
| condition evaluates to false; instead, the origin server MUST respond | ||||
| with either a) the 304 (Not Modified) status code if the request | ||||
| method is GET or HEAD or b) the 412 (Precondition Failed) status code | ||||
| for all other request methods. | ||||
| Requirements on cache handling of a received If-None-Match header | which suggests that the user agent redirect to | |||
| field are defined in Section 4.3.2 of [Caching]. | "http://www.example.org/People.html#tim" | |||
| Note that an If-None-Match header field with a list value containing | Likewise, a GET request generated for the URI reference | |||
| "*" and other values (including other instances of "*") is unlikely | "http://www.example.org/index.html#larry" might result in a 301 | |||
| to be interoperable. | (Moved Permanently) response containing the header field: | |||
| 9.2.5. If-Modified-Since | Location: http://www.example.net/index.html | |||
| The "If-Modified-Since" header field makes a GET or HEAD request | which suggests that the user agent redirect to | |||
| method conditional on the selected representation's modification date | "http://www.example.net/index.html#larry", preserving the original | |||
| being more recent than the date provided in the field value. | fragment identifier. | |||
| Transfer of the selected representation's data is avoided if that | ||||
| data has not changed. | ||||
| If-Modified-Since = HTTP-date | There are circumstances in which a fragment identifier in a Location | |||
| value would not be appropriate. For example, the Location header | ||||
| field in a 201 (Created) response is supposed to provide a URI that | ||||
| is specific to the created resource. | ||||
| An example of the field is: | | *Note:* Some recipients attempt to recover from Location fields | |||
| | that are not valid URI references. This specification does not | ||||
| | mandate or define such processing, but does allow it for the | ||||
| | sake of robustness. A Location field value cannot allow a list | ||||
| | of members because the comma list separator is a valid data | ||||
| | character within a URI-reference. If an invalid message is | ||||
| | sent with multiple Location field instances, a recipient along | ||||
| | the path might combine the field instances into one value. | ||||
| | Recovery of a valid Location field value from that situation is | ||||
| | difficult and not interoperable across implementations. | ||||
| If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT | | *Note:* The Content-Location header field (Section 7.8) differs | |||
| | from Location in that the Content-Location refers to the most | ||||
| | specific resource corresponding to the enclosed representation. | ||||
| | It is therefore possible for a response to contain both the | ||||
| | Location and Content-Location header fields. | ||||
| A recipient MUST ignore If-Modified-Since if the request contains an | 9.2.4. Retry-After | |||
| If-None-Match header field; the condition in If-None-Match is | ||||
| considered to be a more accurate replacement for the condition in If- | ||||
| Modified-Since, and the two are only combined for the sake of | ||||
| interoperating with older intermediaries that might not implement | ||||
| If-None-Match. | ||||
| A recipient MUST ignore the If-Modified-Since header field if the | Servers send the "Retry-After" header field to indicate how long the | |||
| received field value is not a valid HTTP-date, the field value has | user agent ought to wait before making a follow-up request. When | |||
| more than one member, or if the request method is neither GET nor | sent with a 503 (Service Unavailable) response, Retry-After indicates | |||
| HEAD. | how long the service is expected to be unavailable to the client. | |||
| When sent with any 3xx (Redirection) response, Retry-After indicates | ||||
| the minimum time that the user agent is asked to wait before issuing | ||||
| the redirected request. | ||||
| A recipient MUST interpret an If-Modified-Since field value's | The value of this field can be either an HTTP-date or a number of | |||
| timestamp in terms of the origin server's clock. | seconds to delay after the response is received. | |||
| If-Modified-Since is typically used for two distinct purposes: 1) to | Retry-After = HTTP-date / delay-seconds | |||
| allow efficient updates of a cached representation that does not have | ||||
| an entity-tag and 2) to limit the scope of a web traversal to | ||||
| resources that have recently changed. | ||||
| When used for cache updates, a cache will typically use the value of | A delay-seconds value is a non-negative decimal integer, representing | |||
| the cached message's Last-Modified field to generate the field value | time in seconds. | |||
| of If-Modified-Since. This behavior is most interoperable for cases | ||||
| where clocks are poorly synchronized or when the server has chosen to | ||||
| only honor exact timestamp matches (due to a problem with Last- | ||||
| Modified dates that appear to go "back in time" when the origin | ||||
| server's clock is corrected or a representation is restored from an | ||||
| archived backup). However, caches occasionally generate the field | ||||
| value based on other data, such as the Date header field of the | ||||
| cached message or the local clock time that the message was received, | ||||
| particularly when the cached message does not contain a Last-Modified | ||||
| field. | ||||
| When used for limiting the scope of retrieval to a recent time | delay-seconds = 1*DIGIT | |||
| window, a user agent will generate an If-Modified-Since field value | ||||
| based on either its own local clock or a Date header field received | ||||
| from the server in a prior response. Origin servers that choose an | ||||
| exact timestamp match based on the selected representation's | ||||
| Last-Modified field will not be able to help the user agent limit its | ||||
| data transfers to only those changed during the specified window. | ||||
| An origin server that receives an If-Modified-Since header field | Two examples of its use are | |||
| SHOULD evaluate the condition as per Section 9.2.1 prior to | ||||
| performing the method. The origin server SHOULD NOT perform the | ||||
| requested method if the selected representation's last modification | ||||
| date is earlier than or equal to the date provided in the field | ||||
| value; instead, the origin server SHOULD generate a 304 (Not | ||||
| Modified) response, including only those metadata that are useful for | ||||
| identifying or updating a previously cached response. | ||||
| Requirements on cache handling of a received If-Modified-Since header | Retry-After: Fri, 31 Dec 1999 23:59:59 GMT | |||
| field are defined in Section 4.3.2 of [Caching]. | Retry-After: 120 | |||
| 9.2.6. If-Unmodified-Since | In the latter example, the delay is 2 minutes. | |||
| The "If-Unmodified-Since" header field makes the request method | 9.2.5. Server | |||
| conditional on the selected representation's last modification date | ||||
| being earlier than or equal to the date provided in the field value. | ||||
| This field accomplishes the same purpose as If-Match for cases where | ||||
| the user agent does not have an entity-tag for the representation. | ||||
| If-Unmodified-Since = HTTP-date | The "Server" header field contains information about the software | |||
| used by the origin server to handle the request, which is often used | ||||
| by clients to help identify the scope of reported interoperability | ||||
| problems, to work around or tailor requests to avoid particular | ||||
| server limitations, and for analytics regarding server or operating | ||||
| system use. An origin server MAY generate a Server field in its | ||||
| responses. | ||||
| An example of the field is: | Server = product *( RWS ( product / comment ) ) | |||
| If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT | The Server field value consists of one or more product identifiers, | |||
| each followed by zero or more comments (Section 5.7.5), which | ||||
| together identify the origin server software and its significant | ||||
| subproducts. By convention, the product identifiers are listed in | ||||
| decreasing order of their significance for identifying the origin | ||||
| server software. Each product identifier consists of a name and | ||||
| optional version, as defined in Section 9.1.6. | ||||
| A recipient MUST ignore If-Unmodified-Since if the request contains | Example: | |||
| an If-Match header field; the condition in If-Match is considered to | ||||
| be a more accurate replacement for the condition in If-Unmodified- | ||||
| Since, and the two are only combined for the sake of interoperating | ||||
| with older intermediaries that might not implement If-Match. | ||||
| A recipient MUST ignore the If-Unmodified-Since header field if the | Server: CERN/3.0 libwww/2.17 | |||
| received field value is not a valid HTTP-date (including when the | ||||
| field value appears to be a list of dates). | ||||
| A recipient MUST interpret an If-Unmodified-Since field value's | An origin server SHOULD NOT generate a Server field containing | |||
| timestamp in terms of the origin server's clock. | needlessly fine-grained detail and SHOULD limit the addition of | |||
| subproducts by third parties. Overly long and detailed Server field | ||||
| values increase response latency and potentially reveal internal | ||||
| implementation details that might make it (slightly) easier for | ||||
| attackers to find and exploit known security holes. | ||||
| If-Unmodified-Since is most often used with state-changing methods | 10. Authentication | |||
| (e.g., POST, PUT, DELETE) to prevent accidental overwrites when | ||||
| multiple user agents might be acting in parallel on a resource that | ||||
| does not supply entity-tags with its representations (i.e., to | ||||
| prevent the "lost update" problem). It can also be used with any | ||||
| method to abort a request if the selected representation does not | ||||
| match one that the client already stored (or partially stored) from a | ||||
| prior request. | ||||
| An origin server that receives an If-Unmodified-Since header field | 10.1. Authentication Scheme | |||
| MUST evaluate the condition as per Section 9.2.1 prior to performing | ||||
| the method. | ||||
| If the selected representation has a last modification date, the | HTTP provides a general framework for access control and | |||
| origin server MUST NOT perform the requested method if that date is | authentication, via an extensible set of challenge-response | |||
| more recent than the date provided in the field value. Instead, the | authentication schemes, which can be used by a server to challenge a | |||
| origin server MAY indicate that the conditional request failed by | client request and by a client to provide authentication information. | |||
| responding with a 412 (Precondition Failed) status code. | It uses a case-insensitive token to identify the authentication | |||
| Alternatively, if the request is a state-changing operation that | scheme | |||
| appears to have already been applied to the selected representation, | ||||
| the origin server MAY respond with a 2xx (Successful) status code | ||||
| (i.e., the change requested by the user agent has already succeeded, | ||||
| but the user agent might not be aware of it, perhaps because the | ||||
| prior response was lost or an equivalent change was made by some | ||||
| other user agent). | ||||
| Allowing an origin server to send a success response when a change | auth-scheme = token | |||
| request appears to have already been applied is more efficient for | ||||
| many authoring use cases, but comes with some risk if multiple user | ||||
| agents are making change requests that are very similar but not | ||||
| cooperative. In those cases, an origin server is better off being | ||||
| stringent in sending 412 for every failed precondition on an unsafe | ||||
| method. | ||||
| The If-Unmodified-Since header field can be ignored by caches and | Aside from the general framework, this document does not specify any | |||
| intermediaries because it is not applicable to a stored response. | authentication schemes. New and existing authentication schemes are | |||
| specified independently and ought to be registered within the | ||||
| "Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry". | ||||
| For example, the "basic" and "digest" authentication schemes are | ||||
| defined by RFC 7617 and RFC 7616, respectively. | ||||
| 9.2.7. If-Range | 10.2. Authentication Parameters | |||
| The "If-Range" header field provides a special conditional request | The authentication scheme is followed by additional information | |||
| mechanism that is similar to the If-Match and If-Unmodified-Since | necessary for achieving authentication via that scheme as either a | |||
| header fields but that instructs the recipient to ignore the Range | comma-separated list of parameters or a single sequence of characters | |||
| header field if the validator doesn't match, resulting in transfer of | capable of holding base64-encoded information. | |||
| the new selected representation instead of a 412 (Precondition | ||||
| Failed) response. | ||||
| If a client has a partial copy of a representation and wishes to have | token68 = 1*( ALPHA / DIGIT / | |||
| an up-to-date copy of the entire representation, it could use the | "-" / "." / "_" / "~" / "+" / "/" ) *"=" | |||
| Range header field with a conditional GET (using either or both of | ||||
| If-Unmodified-Since and If-Match.) However, if the precondition | ||||
| fails because the representation has been modified, the client would | ||||
| then have to make a second request to obtain the entire current | ||||
| representation. | ||||
| The "If-Range" header field allows a client to "short-circuit" the | The token68 syntax allows the 66 unreserved URI characters | |||
| second request. Informally, its meaning is as follows: if the | ([RFC3986]), plus a few others, so that it can hold a base64, | |||
| representation is unchanged, send me the part(s) that I am requesting | base64url (URL and filename safe alphabet), base32, or base16 (hex) | |||
| in Range; otherwise, send me the entire representation. | encoding, with or without padding, but excluding whitespace | |||
| ([RFC4648]). | ||||
| If-Range = entity-tag / HTTP-date | Authentication parameters are name=value pairs, where the name token | |||
| is matched case-insensitively and each parameter name MUST only occur | ||||
| once per challenge. | ||||
| A client MUST NOT generate an If-Range header field in a request that | auth-param = token BWS "=" BWS ( token / quoted-string ) | |||
| does not contain a Range header field. A server MUST ignore an If- | ||||
| Range header field received in a request that does not contain a | ||||
| Range header field. An origin server MUST ignore an If-Range header | ||||
| field received in a request for a target resource that does not | ||||
| support Range requests. | ||||
| A client MUST NOT generate an If-Range header field containing an | Parameter values can be expressed either as "token" or as "quoted- | |||
| entity-tag that is marked as weak. A client MUST NOT generate an If- | string" (Section 5.7). Authentication scheme definitions need to | |||
| Range header field containing an HTTP-date unless the client has no | accept both notations, both for senders and recipients, to allow | |||
| entity-tag for the corresponding representation and the date is a | recipients to use generic parsing components regardless of the | |||
| strong validator in the sense defined by Section 11.2.2.2. | authentication scheme. | |||
| A server that evaluates an If-Range precondition MUST use the strong | For backwards compatibility, authentication scheme definitions can | |||
| comparison function when comparing entity-tags (Section 11.2.3.2) and | restrict the format for senders to one of the two variants. This can | |||
| MUST evaluate the condition as false if an HTTP-date validator is | be important when it is known that deployed implementations will fail | |||
| provided that is not a strong validator in the sense defined by | when encountering one of the two formats. | |||
| Section 11.2.2.2. A valid entity-tag can be distinguished from a | ||||
| valid HTTP-date by examining the first two characters for a DQUOTE. | ||||
| If the validator given in the If-Range header field matches the | 10.3. Challenge and Response | |||
| current validator for the selected representation of the target | ||||
| resource, then the server SHOULD process the Range header field as | ||||
| requested. If the validator does not match, the server MUST ignore | ||||
| the Range header field. Note that this comparison by exact match, | ||||
| including when the validator is an HTTP-date, differs from the | ||||
| "earlier than or equal to" comparison used when evaluating an | ||||
| If-Unmodified-Since conditional. | ||||
| 9.3. Range | A 401 (Unauthorized) response message is used by an origin server to | |||
| challenge the authorization of a user agent, including a | ||||
| WWW-Authenticate header field containing at least one challenge | ||||
| applicable to the requested resource. | ||||
| The "Range" header field on a GET request modifies the method | A 407 (Proxy Authentication Required) response message is used by a | |||
| semantics to request transfer of only one or more subranges of the | proxy to challenge the authorization of a client, including a | |||
| selected representation data (Section 7.1), rather than the entire | Proxy-Authenticate header field containing at least one challenge | |||
| selected representation. | applicable to the proxy for the requested resource. | |||
| Range = ranges-specifier | challenge = auth-scheme [ 1*SP ( token68 / #auth-param ) ] | |||
| Clients often encounter interrupted data transfers as a result of | | *Note:* Many clients fail to parse a challenge that contains an | |||
| canceled requests or dropped connections. When a client has stored a | | unknown scheme. A workaround for this problem is to list well- | |||
| partial representation, it is desirable to request the remainder of | | supported schemes (such as "basic") first. | |||
| that representation in a subsequent request rather than transfer the | ||||
| entire representation. Likewise, devices with limited local storage | ||||
| might benefit from being able to request only a subset of a larger | ||||
| representation, such as a single page of a very large document, or | ||||
| the dimensions of an embedded image. | ||||
| Range requests are an OPTIONAL feature of HTTP, designed so that | A user agent that wishes to authenticate itself with an origin server | |||
| recipients not implementing this feature (or not supporting it for | - usually, but not necessarily, after receiving a 401 (Unauthorized) | |||
| the target resource) can respond as if it is a normal GET request | - can do so by including an Authorization header field with the | |||
| without impacting interoperability. Partial responses are indicated | request. | |||
| by a distinct status code to not be mistaken for full responses by | ||||
| caches that might not implement the feature. | ||||
| A server MAY ignore the Range header field. However, origin servers | A client that wishes to authenticate itself with a proxy - usually, | |||
| and intermediate caches ought to support byte ranges when possible, | but not necessarily, after receiving a 407 (Proxy Authentication | |||
| since they support efficient recovery from partially failed transfers | Required) - can do so by including a Proxy-Authorization header field | |||
| and partial retrieval of large representations. A server MUST ignore | with the request. | |||
| a Range header field received with a request method other than GET. | ||||
| Although the range request mechanism is designed to allow for | 10.4. Credentials | |||
| extensible range types, this specification only defines requests for | ||||
| byte ranges. | ||||
| An origin server MUST ignore a Range header field that contains a | Both the Authorization field value and the Proxy-Authorization field | |||
| range unit it does not understand. A proxy MAY discard a Range | value contain the client's credentials for the realm of the resource | |||
| header field that contains a range unit it does not understand. | being requested, based upon a challenge received in a response | |||
| (possibly at some point in the past). When creating their values, | ||||
| the user agent ought to do so by selecting the challenge with what it | ||||
| considers to be the most secure auth-scheme that it understands, | ||||
| obtaining credentials from the user as appropriate. Transmission of | ||||
| credentials within header field values implies significant security | ||||
| considerations regarding the confidentiality of the underlying | ||||
| connection, as described in Section 16.15.1. | ||||
| A server that supports range requests MAY ignore or reject a Range | credentials = auth-scheme [ 1*SP ( token68 / #auth-param ) ] | |||
| header field that consists of more than two overlapping ranges, or a | ||||
| set of many small ranges that are not listed in ascending order, | ||||
| since both are indications of either a broken client or a deliberate | ||||
| denial-of-service attack (Section 12.14). A client SHOULD NOT | ||||
| request multiple ranges that are inherently less efficient to process | ||||
| and transfer than a single range that encompasses the same data. | ||||
| A server that supports range requests MAY ignore a Range header field | Upon receipt of a request for a protected resource that omits | |||
| when the selected representation has no body (i.e., the selected | credentials, contains invalid credentials (e.g., a bad password) or | |||
| representation data is of zero length). | partial credentials (e.g., when the authentication scheme requires | |||
| more than one round trip), an origin server SHOULD send a 401 | ||||
| (Unauthorized) response that contains a WWW-Authenticate header field | ||||
| with at least one (possibly new) challenge applicable to the | ||||
| requested resource. | ||||
| A client that is requesting multiple ranges SHOULD list those ranges | Likewise, upon receipt of a request that omits proxy credentials or | |||
| in ascending order (the order in which they would typically be | contains invalid or partial proxy credentials, a proxy that requires | |||
| received in a complete representation) unless there is a specific | authentication SHOULD generate a 407 (Proxy Authentication Required) | |||
| need to request a later part earlier. For example, a user agent | response that contains a Proxy-Authenticate header field with at | |||
| processing a large representation with an internal catalog of parts | least one (possibly new) challenge applicable to the proxy. | |||
| might need to request later parts first, particularly if the | ||||
| representation consists of pages stored in reverse order and the user | ||||
| agent wishes to transfer one page at a time. | ||||
| The Range header field is evaluated after evaluating the precondition | A server that receives valid credentials that are not adequate to | |||
| header fields defined in Section 9.2, and only if the result in | gain access ought to respond with the 403 (Forbidden) status code | |||
| absence of the Range header field would be a 200 (OK) response. In | (Section 14.5.4). | |||
| other words, Range is ignored when a conditional GET would result in | ||||
| a 304 (Not Modified) response. | ||||
| The If-Range header field (Section 9.2.7) can be used as a | HTTP does not restrict applications to this simple challenge-response | |||
| precondition to applying the Range header field. | framework for access authentication. Additional mechanisms can be | |||
| used, such as authentication at the transport level or via message | ||||
| encapsulation, and with additional header fields specifying | ||||
| authentication information. However, such additional mechanisms are | ||||
| not defined by this specification. | ||||
| If all of the preconditions are true, the server supports the Range | Note that various custom mechanisms for user authentication use the | |||
| header field for the target resource, and the specified range(s) are | Set-Cookie and Cookie header fields, defined in [RFC6265], for | |||
| valid and satisfiable (as defined in Section 7.1.4.2), the server | passing tokens related to authentication. | |||
| SHOULD send a 206 (Partial Content) response with a payload | ||||
| containing one or more partial representations that correspond to the | ||||
| satisfiable ranges requested. | ||||
| If all of the preconditions are true, the server supports the Range | 10.5. Protection Space (Realm) | |||
| header field for the target resource, and the specified range(s) are | ||||
| invalid or unsatisfiable, the server SHOULD send a 416 (Range Not | ||||
| Satisfiable) response. | ||||
| 9.4. Negotiation | The "realm" authentication parameter is reserved for use by | |||
| authentication schemes that wish to indicate a scope of protection. | ||||
| A protection space is defined by the canonical root URI (the scheme | ||||
| and authority components of the target URI; see Section 6.1) of the | ||||
| server being accessed, in combination with the realm value if | ||||
| present. These realms allow the protected resources on a server to | ||||
| be partitioned into a set of protection spaces, each with its own | ||||
| authentication scheme and/or authorization database. The realm value | ||||
| is a string, generally assigned by the origin server, that can have | ||||
| additional semantics specific to the authentication scheme. Note | ||||
| that a response can have multiple challenges with the same auth- | ||||
| scheme but with different realms. | ||||
| The protection space determines the domain over which credentials can | ||||
| be automatically applied. If a prior request has been authorized, | ||||
| the user agent MAY reuse the same credentials for all other requests | ||||
| within that protection space for a period of time determined by the | ||||
| authentication scheme, parameters, and/or user preferences (such as a | ||||
| configurable inactivity timeout). Unless specifically allowed by the | ||||
| authentication scheme, a single protection space cannot extend | ||||
| outside the scope of its server. | ||||
| For historical reasons, a sender MUST only generate the quoted-string | ||||
| syntax. Recipients might have to support both token and quoted- | ||||
| string syntax for maximum interoperability with existing clients that | ||||
| have been accepting both notations for a long time. | ||||
| 10.6. Authenticating User to Origin Server | ||||
| 10.6.1. WWW-Authenticate | ||||
| The "WWW-Authenticate" header field indicates the authentication | ||||
| scheme(s) and parameters applicable to the target resource. | ||||
| WWW-Authenticate = #challenge | ||||
| A server generating a 401 (Unauthorized) response MUST send a WWW- | ||||
| Authenticate header field containing at least one challenge. A | ||||
| server MAY generate a WWW-Authenticate header field in other response | ||||
| messages to indicate that supplying credentials (or different | ||||
| credentials) might affect the response. | ||||
| A proxy forwarding a response MUST NOT modify any WWW-Authenticate | ||||
| fields in that response. | ||||
| User agents are advised to take special care in parsing the field | ||||
| value, as it might contain more than one challenge, and each | ||||
| challenge can contain a comma-separated list of authentication | ||||
| parameters. Furthermore, the header field itself can occur multiple | ||||
| times. | ||||
| For instance: | ||||
| WWW-Authenticate: Newauth realm="apps", type=1, | ||||
| title="Login to \"apps\"", Basic realm="simple" | ||||
| This header field contains two challenges; one for the "Newauth" | ||||
| scheme with a realm value of "apps", and two additional parameters | ||||
| "type" and "title", and another one for the "Basic" scheme with a | ||||
| realm value of "simple". | ||||
| Some user agents do not recognise this form, however. As a result, | ||||
| sending a WWW-Authenticate field value with more than one member on | ||||
| the same field line might not be interoperable. | ||||
| | *Note:* The challenge grammar production uses the list syntax | ||||
| | as well. Therefore, a sequence of comma, whitespace, and comma | ||||
| | can be considered either as applying to the preceding | ||||
| | challenge, or to be an empty entry in the list of challenges. | ||||
| | In practice, this ambiguity does not affect the semantics of | ||||
| | the header field value and thus is harmless. | ||||
| 10.6.2. Authorization | ||||
| The "Authorization" header field allows a user agent to authenticate | ||||
| itself with an origin server - usually, but not necessarily, after | ||||
| receiving a 401 (Unauthorized) response. Its value consists of | ||||
| credentials containing the authentication information of the user | ||||
| agent for the realm of the resource being requested. | ||||
| Authorization = credentials | ||||
| If a request is authenticated and a realm specified, the same | ||||
| credentials are presumed to be valid for all other requests within | ||||
| this realm (assuming that the authentication scheme itself does not | ||||
| require otherwise, such as credentials that vary according to a | ||||
| challenge value or using synchronized clocks). | ||||
| A proxy forwarding a request MUST NOT modify any Authorization fields | ||||
| in that request. See Section 3.3 of [Caching] for details of and | ||||
| requirements pertaining to handling of the Authorization field by | ||||
| HTTP caches. | ||||
| 10.6.3. Authentication-Info | ||||
| HTTP authentication schemes can use the Authentication-Info response | ||||
| header field to communicate information after the client's | ||||
| authentication credentials have been accepted. This information can | ||||
| include a finalization message from the server (e.g., it can contain | ||||
| the server authentication). | ||||
| The field value is a list of parameters (name/value pairs), using the | ||||
| "auth-param" syntax defined in Section 10.3. This specification only | ||||
| describes the generic format; authentication schemes using | ||||
| Authentication-Info will define the individual parameters. The | ||||
| "Digest" Authentication Scheme, for instance, defines multiple | ||||
| parameters in Section 3.5 of [RFC7616]. | ||||
| Authentication-Info = #auth-param | ||||
| The Authentication-Info header field can be used in any HTTP | ||||
| response, independently of request method and status code. Its | ||||
| semantics are defined by the authentication scheme indicated by the | ||||
| Authorization header field (Section 10.6.2) of the corresponding | ||||
| request. | ||||
| A proxy forwarding a response is not allowed to modify the field | ||||
| value in any way. | ||||
| Authentication-Info can be sent as a trailer field (Section 5.6) when | ||||
| the authentication scheme explicitly allows this. | ||||
| 10.7. Authenticating Client to Proxy | ||||
| 10.7.1. Proxy-Authenticate | ||||
| The "Proxy-Authenticate" header field consists of at least one | ||||
| challenge that indicates the authentication scheme(s) and parameters | ||||
| applicable to the proxy for this request. A proxy MUST send at least | ||||
| one Proxy-Authenticate header field in each 407 (Proxy Authentication | ||||
| Required) response that it generates. | ||||
| Proxy-Authenticate = #challenge | ||||
| Unlike WWW-Authenticate, the Proxy-Authenticate header field applies | ||||
| only to the next outbound client on the response chain. This is | ||||
| because only the client that chose a given proxy is likely to have | ||||
| the credentials necessary for authentication. However, when multiple | ||||
| proxies are used within the same administrative domain, such as | ||||
| office and regional caching proxies within a large corporate network, | ||||
| it is common for credentials to be generated by the user agent and | ||||
| passed through the hierarchy until consumed. Hence, in such a | ||||
| configuration, it will appear as if Proxy-Authenticate is being | ||||
| forwarded because each proxy will send the same challenge set. | ||||
| Note that the parsing considerations for WWW-Authenticate apply to | ||||
| this header field as well; see Section 10.6.1 for details. | ||||
| 10.7.2. Proxy-Authorization | ||||
| The "Proxy-Authorization" header field allows the client to identify | ||||
| itself (or its user) to a proxy that requires authentication. Its | ||||
| value consists of credentials containing the authentication | ||||
| information of the client for the proxy and/or realm of the resource | ||||
| being requested. | ||||
| Proxy-Authorization = credentials | ||||
| Unlike Authorization, the Proxy-Authorization header field applies | ||||
| only to the next inbound proxy that demanded authentication using the | ||||
| Proxy-Authenticate field. When multiple proxies are used in a chain, | ||||
| the Proxy-Authorization header field is consumed by the first inbound | ||||
| proxy that was expecting to receive credentials. A proxy MAY relay | ||||
| the credentials from the client request to the next proxy if that is | ||||
| the mechanism by which the proxies cooperatively authenticate a given | ||||
| request. | ||||
| 10.7.3. Proxy-Authentication-Info | ||||
| The Proxy-Authentication-Info response header field is equivalent to | ||||
| Authentication-Info, except that it applies to proxy authentication | ||||
| (Section 10.3) and its semantics are defined by the authentication | ||||
| scheme indicated by the Proxy-Authorization header field | ||||
| (Section 10.7.2) of the corresponding request: | ||||
| Proxy-Authentication-Info = #auth-param | ||||
| However, unlike Authentication-Info, the Proxy-Authentication-Info | ||||
| header field applies only to the next outbound client on the response | ||||
| chain. This is because only the client that chose a given proxy is | ||||
| likely to have the credentials necessary for authentication. | ||||
| However, when multiple proxies are used within the same | ||||
| administrative domain, such as office and regional caching proxies | ||||
| within a large corporate network, it is common for credentials to be | ||||
| generated by the user agent and passed through the hierarchy until | ||||
| consumed. Hence, in such a configuration, it will appear as if | ||||
| Proxy-Authentication-Info is being forwarded because each proxy will | ||||
| send the same field value. | ||||
| 11. Content Negotiation | ||||
| When responses convey payload information, whether indicating a | ||||
| success or an error, the origin server often has different ways of | ||||
| representing that information; for example, in different formats, | ||||
| languages, or encodings. Likewise, different users or user agents | ||||
| might have differing capabilities, characteristics, or preferences | ||||
| that could influence which representation, among those available, | ||||
| would be best to deliver. For this reason, HTTP provides mechanisms | ||||
| for content negotiation. | ||||
| This specification defines three patterns of content negotiation that | ||||
| can be made visible within the protocol: "proactive" negotiation, | ||||
| where the server selects the representation based upon the user | ||||
| agent's stated preferences, "reactive" negotiation, where the server | ||||
| provides a list of representations for the user agent to choose from, | ||||
| and "request payload" negotiation, where the user agent selects the | ||||
| representation for a future request based upon the server's stated | ||||
| preferences in past responses. Other patterns of content negotiation | ||||
| include "conditional content", where the representation consists of | ||||
| multiple parts that are selectively rendered based on user agent | ||||
| parameters, "active content", where the representation contains a | ||||
| script that makes additional (more specific) requests based on the | ||||
| user agent characteristics, and "Transparent Content Negotiation" | ||||
| ([RFC2295]), where content selection is performed by an intermediary. | ||||
| These patterns are not mutually exclusive, and each has trade-offs in | ||||
| applicability and practicality. | ||||
| Note that, in all cases, HTTP is not aware of the resource semantics. | ||||
| The consistency with which an origin server responds to requests, | ||||
| over time and over the varying dimensions of content negotiation, and | ||||
| thus the "sameness" of a resource's observed representations over | ||||
| time, is determined entirely by whatever entity or algorithm selects | ||||
| or generates those responses. | ||||
| 11.1. Proactive Negotiation | ||||
| When content negotiation preferences are sent by the user agent in a | ||||
| request to encourage an algorithm located at the server to select the | ||||
| preferred representation, it is called proactive negotiation (a.k.a., | ||||
| server-driven negotiation). Selection is based on the available | ||||
| representations for a response (the dimensions over which it might | ||||
| vary, such as language, content-coding, etc.) compared to various | ||||
| information supplied in the request, including both the explicit | ||||
| negotiation fields below and implicit characteristics, such as the | ||||
| client's network address or parts of the User-Agent field. | ||||
| Proactive negotiation is advantageous when the algorithm for | ||||
| selecting from among the available representations is difficult to | ||||
| describe to a user agent, or when the server desires to send its | ||||
| "best guess" to the user agent along with the first response (hoping | ||||
| to avoid the round trip delay of a subsequent request if the "best | ||||
| guess" is good enough for the user). In order to improve the | ||||
| server's guess, a user agent MAY send request header fields that | ||||
| describe its preferences. | ||||
| Proactive negotiation has serious disadvantages: | ||||
| o It is impossible for the server to accurately determine what might | ||||
| be "best" for any given user, since that would require complete | ||||
| knowledge of both the capabilities of the user agent and the | ||||
| intended use for the response (e.g., does the user want to view it | ||||
| on screen or print it on paper?); | ||||
| o Having the user agent describe its capabilities in every request | ||||
| can be both very inefficient (given that only a small percentage | ||||
| of responses have multiple representations) and a potential risk | ||||
| to the user's privacy; | ||||
| o It complicates the implementation of an origin server and the | ||||
| algorithms for generating responses to a request; and, | ||||
| o It limits the reusability of responses for shared caching. | ||||
| A user agent cannot rely on proactive negotiation preferences being | ||||
| consistently honored, since the origin server might not implement | ||||
| proactive negotiation for the requested resource or might decide that | ||||
| sending a response that doesn't conform to the user agent's | ||||
| preferences is better than sending a 406 (Not Acceptable) response. | ||||
| A Vary header field (Section 11.2.1) is often sent in a response | ||||
| subject to proactive negotiation to indicate what parts of the | ||||
| request information were used in the selection algorithm. | ||||
| The following request header fields can be sent by a user agent to | The following request header fields can be sent by a user agent to | |||
| engage in proactive negotiation of the response content, as defined | engage in proactive negotiation of the response content, as defined | |||
| in Section 7.4.1. The preferences sent in these fields apply to any | in Section 11.1. The preferences sent in these fields apply to any | |||
| content in the response, including representations of the target | content in the response, including representations of the target | |||
| resource, representations of error or processing status, and | resource, representations of error or processing status, and | |||
| potentially even the miscellaneous text strings that might appear | potentially even the miscellaneous text strings that might appear | |||
| within the protocol. | within the protocol. | |||
| ----------------- ------- | ----------------- -------- | |||
| Field Name Ref. | Field Name Ref. | |||
| ----------------- ------- | ----------------- -------- | |||
| Accept 9.4.1 | Accept 11.1.2 | |||
| Accept-Charset 9.4.2 | Accept-Charset 11.1.3 | |||
| Accept-Encoding 9.4.3 | Accept-Encoding 11.1.4 | |||
| Accept-Language 9.4.4 | Accept-Language 11.1.5 | |||
| ----------------- ------- | ----------------- -------- | |||
| Table 14 | Table 10 | |||
| For each of these header fields, a request that does not contain it | 11.1.1. Shared Negotiation Features | |||
| implies that the user agent has no preference on that axis of | 11.1.1.1. Absence | |||
| For each of these header fields, a request that does not contain the | ||||
| field implies that the user agent has no preference on that axis of | ||||
| negotiation. If the header field is present in a request and none of | negotiation. If the header field is present in a request and none of | |||
| the available representations for the response can be considered | the available representations for the response can be considered | |||
| acceptable according to it, the origin server can either honor the | acceptable according to it, the origin server can either honor the | |||
| header field by sending a 406 (Not Acceptable) response or disregard | header field by sending a 406 (Not Acceptable) response or disregard | |||
| the header field by treating the response as if it is not subject to | the header field by treating the response as if it is not subject to | |||
| content negotiation for that request header field. This does not | content negotiation for that request header field. This does not | |||
| imply, however, that the client will be able to use the | imply, however, that the client will be able to use the | |||
| representation. | representation. | |||
| *Note:* Sending these header fields makes it easier for a server to | *Note:* Sending these header fields makes it easier for a server to | |||
| identify an individual by virtue of the user agent's request | identify an individual by virtue of the user agent's request | |||
| characteristics (Section 12.12). | characteristics (Section 16.12). | |||
| Each of these header fields defines a wildcard value (often, "*") to | 11.1.1.2. Quality Values | |||
| select unspecified values. If no wildcard is present, all values not | ||||
| explicitly mentioned in the field are considered "not acceptable" to | The content negotiation fields defined by this specification use a | |||
| the client. | common parameter, named "q" (case-insensitive), to assign a relative | |||
| "weight" to the preference for that associated kind of content. This | ||||
| weight is referred to as a "quality value" (or "qvalue") because the | ||||
| same parameter name is often used within server configurations to | ||||
| assign a weight to the relative quality of the various | ||||
| representations that can be selected for a resource. | ||||
| The weight is normalized to a real number in the range 0 through 1, | ||||
| where 0.001 is the least preferred and 1 is the most preferred; a | ||||
| value of 0 means "not acceptable". If no "q" parameter is present, | ||||
| the default weight is 1. | ||||
| weight = OWS ";" OWS "q=" qvalue | ||||
| qvalue = ( "0" [ "." 0*3DIGIT ] ) | ||||
| / ( "1" [ "." 0*3("0") ] ) | ||||
| A sender of qvalue MUST NOT generate more than three digits after the | ||||
| decimal point. User configuration of these values ought to be | ||||
| limited in the same fashion. | ||||
| 11.1.1.3. Wildcard Values | ||||
| Most of these header fields, where indicated, define a wildcard value | ||||
| ("*") to select unspecified values. If no wildcard is present, all | ||||
| values not explicitly mentioned in the field are considered "not | ||||
| acceptable" to the client. | ||||
| *Note:* In practice, using wildcards in content negotiation has | *Note:* In practice, using wildcards in content negotiation has | |||
| limited practical value, because it is seldom useful to say, for | limited practical value, because it is seldom useful to say, for | |||
| example, "I prefer image/* more or less than (some other specific | example, "I prefer image/* more or less than (some other specific | |||
| value)". Clients can explicitly request a 406 (Not Acceptable) | value)". Clients can explicitly request a 406 (Not Acceptable) | |||
| response if a more preferred format is not available by sending | response if a more preferred format is not available by sending | |||
| Accept: */*;q=0, but they still need to be able to handle a different | Accept: */*;q=0, but they still need to be able to handle a different | |||
| response, since the server is allowed to ignore their preference. | response, since the server is allowed to ignore their preference. | |||
| 9.4.1. Accept | 11.1.2. Accept | |||
| The "Accept" header field can be used by user agents to specify their | The "Accept" header field can be used by user agents to specify their | |||
| preferences regarding response media types. For example, Accept | preferences regarding response media types. For example, Accept | |||
| header fields can be used to indicate that the request is | header fields can be used to indicate that the request is | |||
| specifically limited to a small set of desired types, as in the case | specifically limited to a small set of desired types, as in the case | |||
| of a request for an in-line image. | of a request for an in-line image. | |||
| When sent by a server in a response, Accept provides information | When sent by a server in a response, Accept provides information | |||
| about what content types are preferred in the payload of a subsequent | about what content types are preferred in the payload of a subsequent | |||
| request to the same resource. | request to the same resource. | |||
| skipping to change at page 118, line 7 ¶ | skipping to change at page 113, line 41 ¶ | |||
| accept-params = weight *( accept-ext ) | accept-params = weight *( accept-ext ) | |||
| accept-ext = OWS ";" OWS token [ "=" ( token / quoted-string ) ] | accept-ext = OWS ";" OWS token [ "=" ( token / quoted-string ) ] | |||
| The asterisk "*" character is used to group media types into ranges, | The asterisk "*" character is used to group media types into ranges, | |||
| with "*/*" indicating all media types and "type/*" indicating all | with "*/*" indicating all media types and "type/*" indicating all | |||
| subtypes of that type. The media-range can include media type | subtypes of that type. The media-range can include media type | |||
| parameters that are applicable to that range. | parameters that are applicable to that range. | |||
| Each media-range might be followed by zero or more applicable media | Each media-range might be followed by zero or more applicable media | |||
| type parameters (e.g., charset), an optional "q" parameter for | type parameters (e.g., charset), an optional "q" parameter for | |||
| indicating a relative weight (Section 7.4.4), and then zero or more | indicating a relative weight (Section 11.1.1.2), and then zero or | |||
| extension parameters. The "q" parameter is necessary if any | more extension parameters. The "q" parameter is necessary if any | |||
| extensions (accept-ext) are present, since it acts as a separator | extensions (accept-ext) are present, since it acts as a separator | |||
| between the two parameter sets. | between the two parameter sets. | |||
| | *Note:* Use of the "q" parameter name to separate media type | | *Note:* Use of the "q" parameter name to separate media type | |||
| | parameters from Accept extension parameters is due to | | parameters from Accept extension parameters is due to | |||
| | historical practice. Although this prevents any media type | | historical practice. Although this prevents any media type | |||
| | parameter named "q" from being used with a media range, such an | | parameter named "q" from being used with a media range, such an | |||
| | event is believed to be unlikely given the lack of any "q" | | event is believed to be unlikely given the lack of any "q" | |||
| | parameters in the IANA media type registry and the rare usage | | parameters in the IANA media type registry and the rare usage | |||
| | of any media type parameters in Accept. Future media types are | | of any media type parameters in Accept. Future media types are | |||
| skipping to change at page 119, line 4 ¶ | skipping to change at page 114, line 46 ¶ | |||
| have the following precedence: | have the following precedence: | |||
| 1. text/plain;format=flowed | 1. text/plain;format=flowed | |||
| 2. text/plain | 2. text/plain | |||
| 3. text/* | 3. text/* | |||
| 4. */* | 4. */* | |||
| The media type quality factor associated with a given type is | The media type quality factor associated with a given type is | |||
| determined by finding the media range with the highest precedence | determined by finding the media range with the highest precedence | |||
| that matches the type. For example, | that matches the type. For example, | |||
| Accept: text/*;q=0.3, text/plain;q=0.7, text/plain;format=flowed, | Accept: text/*;q=0.3, text/plain;q=0.7, text/plain;format=flowed, | |||
| text/plain;format=fixed;q=0.4, */*;q=0.5 | text/plain;format=fixed;q=0.4, */*;q=0.5 | |||
| would cause the following values to be associated: | would cause the following values to be associated: | |||
| -------------------------- --------------- | -------------------------- --------------- | |||
| Media Type Quality Value | Media Type Quality Value | |||
| -------------------------- --------------- | -------------------------- --------------- | |||
| text/plain;format=flowed 1 | text/plain;format=flowed 1 | |||
| text/plain 0.7 | text/plain 0.7 | |||
| text/html 0.3 | text/html 0.3 | |||
| image/jpeg 0.5 | image/jpeg 0.5 | |||
| text/plain;format=fixed 0.4 | text/plain;format=fixed 0.4 | |||
| text/html;level=3 0.7 | text/html;level=3 0.7 | |||
| -------------------------- --------------- | -------------------------- --------------- | |||
| Table 15 | Table 11 | |||
| *Note:* A user agent might be provided with a default set of quality | *Note:* A user agent might be provided with a default set of quality | |||
| values for certain media ranges. However, unless the user agent is a | values for certain media ranges. However, unless the user agent is a | |||
| closed system that cannot interact with other rendering agents, this | closed system that cannot interact with other rendering agents, this | |||
| default set ought to be configurable by the user. | default set ought to be configurable by the user. | |||
| 9.4.2. Accept-Charset | 11.1.3. Accept-Charset | |||
| The "Accept-Charset" header field can be sent by a user agent to | The "Accept-Charset" header field can be sent by a user agent to | |||
| indicate its preferences for charsets in textual response content. | indicate its preferences for charsets in textual response content. | |||
| For example, this field allows user agents capable of understanding | For example, this field allows user agents capable of understanding | |||
| more comprehensive or special-purpose charsets to signal that | more comprehensive or special-purpose charsets to signal that | |||
| capability to an origin server that is capable of representing | capability to an origin server that is capable of representing | |||
| information in those charsets. | information in those charsets. | |||
| Accept-Charset = #( ( charset / "*" ) [ weight ] ) | Accept-Charset = #( ( charset / "*" ) [ weight ] ) | |||
| Charset names are defined in Section 7.1.1.1. A user agent MAY | Charset names are defined in Section 7.4.2. A user agent MAY | |||
| associate a quality value with each charset to indicate the user's | associate a quality value with each charset to indicate the user's | |||
| relative preference for that charset, as defined in Section 7.4.4. | relative preference for that charset, as defined in Section 11.1.1.2. | |||
| An example is | An example is | |||
| Accept-Charset: iso-8859-5, unicode-1-1;q=0.8 | Accept-Charset: iso-8859-5, unicode-1-1;q=0.8 | |||
| The special value "*", if present in the Accept-Charset field, | The special value "*", if present in the Accept-Charset field, | |||
| matches every charset that is not mentioned elsewhere in the Accept- | matches every charset that is not mentioned elsewhere in the Accept- | |||
| Charset field. | Charset field. | |||
| *Note:* Accept-Charset is deprecated because UTF-8 has become nearly | *Note:* Accept-Charset is deprecated because UTF-8 has become nearly | |||
| ubiquitous and sending a detailed list of user-preferred charsets | ubiquitous and sending a detailed list of user-preferred charsets | |||
| wastes bandwidth, increases latency, and makes passive fingerprinting | wastes bandwidth, increases latency, and makes passive fingerprinting | |||
| far too easy (Section 12.12). Most general-purpose user agents do | far too easy (Section 16.12). Most general-purpose user agents do | |||
| not send Accept-Charset, unless specifically configured to do so. | not send Accept-Charset, unless specifically configured to do so. | |||
| 9.4.3. Accept-Encoding | 11.1.4. Accept-Encoding | |||
| The "Accept-Encoding" header field can be used to indicate | The "Accept-Encoding" header field can be used to indicate | |||
| preferences regarding the use of content codings (Section 7.1.2). | preferences regarding the use of content codings (Section 7.5.1). | |||
| When sent by a user agent in a request, Accept-Encoding indicates the | When sent by a user agent in a request, Accept-Encoding indicates the | |||
| content codings acceptable in a response. | content codings acceptable in a response. | |||
| When sent by a server in a response, Accept-Encoding provides | When sent by a server in a response, Accept-Encoding provides | |||
| information about what content codings are preferred in the payload | information about what content codings are preferred in the payload | |||
| of a subsequent request to the same resource. | of a subsequent request to the same resource. | |||
| An "identity" token is used as a synonym for "no encoding" in order | An "identity" token is used as a synonym for "no encoding" in order | |||
| to communicate when no encoding is preferred. | to communicate when no encoding is preferred. | |||
| Accept-Encoding = #( codings [ weight ] ) | Accept-Encoding = #( codings [ weight ] ) | |||
| codings = content-coding / "identity" / "*" | codings = content-coding / "identity" / "*" | |||
| Each codings value MAY be given an associated quality value | Each codings value MAY be given an associated quality value | |||
| representing the preference for that encoding, as defined in | representing the preference for that encoding, as defined in | |||
| Section 7.4.4. The asterisk "*" symbol in an Accept-Encoding field | Section 11.1.1.2. The asterisk "*" symbol in an Accept-Encoding | |||
| matches any available content-coding not explicitly listed in the | field matches any available content-coding not explicitly listed in | |||
| header field. | the header field. | |||
| For example, | For example, | |||
| Accept-Encoding: compress, gzip | Accept-Encoding: compress, gzip | |||
| Accept-Encoding: | Accept-Encoding: | |||
| Accept-Encoding: * | Accept-Encoding: * | |||
| Accept-Encoding: compress;q=0.5, gzip;q=1.0 | Accept-Encoding: compress;q=0.5, gzip;q=1.0 | |||
| Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0 | Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0 | |||
| A server tests whether a content-coding for a given representation is | A server tests whether a content-coding for a given representation is | |||
| skipping to change at page 121, line 8 ¶ | skipping to change at page 116, line 51 ¶ | |||
| is considered acceptable by the user agent. | is considered acceptable by the user agent. | |||
| 2. If the representation has no content-coding, then it is | 2. If the representation has no content-coding, then it is | |||
| acceptable by default unless specifically excluded by the Accept- | acceptable by default unless specifically excluded by the Accept- | |||
| Encoding field stating either "identity;q=0" or "*;q=0" without a | Encoding field stating either "identity;q=0" or "*;q=0" without a | |||
| more specific entry for "identity". | more specific entry for "identity". | |||
| 3. If the representation's content-coding is one of the content- | 3. If the representation's content-coding is one of the content- | |||
| codings listed in the Accept-Encoding field value, then it is | codings listed in the Accept-Encoding field value, then it is | |||
| acceptable unless it is accompanied by a qvalue of 0. (As | acceptable unless it is accompanied by a qvalue of 0. (As | |||
| defined in Section 7.4.4, a qvalue of 0 means "not acceptable".) | defined in Section 11.1.1.2, a qvalue of 0 means "not | |||
| acceptable".) | ||||
| 4. If multiple content-codings are acceptable, then the acceptable | 4. If multiple content-codings are acceptable, then the acceptable | |||
| content-coding with the highest non-zero qvalue is preferred. | content-coding with the highest non-zero qvalue is preferred. | |||
| An Accept-Encoding header field with a field value that is empty | An Accept-Encoding header field with a field value that is empty | |||
| implies that the user agent does not want any content-coding in | implies that the user agent does not want any content-coding in | |||
| response. If an Accept-Encoding header field is present in a request | response. If an Accept-Encoding header field is present in a request | |||
| and none of the available representations for the response have a | and none of the available representations for the response have a | |||
| content-coding that is listed as acceptable, the origin server SHOULD | content-coding that is listed as acceptable, the origin server SHOULD | |||
| send a response without any content-coding. | send a response without any content-coding. | |||
| skipping to change at page 122, line 5 ¶ | skipping to change at page 117, line 48 ¶ | |||
| optimize future interactions. For example, a resource might include | optimize future interactions. For example, a resource might include | |||
| it in a 2xx (Successful) response when the request payload was big | it in a 2xx (Successful) response when the request payload was big | |||
| enough to justify use of a compression coding but the client failed | enough to justify use of a compression coding but the client failed | |||
| do so. | do so. | |||
| | *Note:* Most HTTP/1.0 applications do not recognize or obey | | *Note:* Most HTTP/1.0 applications do not recognize or obey | |||
| | qvalues associated with content-codings. This means that | | qvalues associated with content-codings. This means that | |||
| | qvalues might not work and are not permitted with x-gzip or | | qvalues might not work and are not permitted with x-gzip or | |||
| | x-compress. | | x-compress. | |||
| 9.4.4. Accept-Language | 11.1.5. Accept-Language | |||
| The "Accept-Language" header field can be used by user agents to | The "Accept-Language" header field can be used by user agents to | |||
| indicate the set of natural languages that are preferred in the | indicate the set of natural languages that are preferred in the | |||
| response. Language tags are defined in Section 7.1.3. | response. Language tags are defined in Section 7.6.1. | |||
| Accept-Language = #( language-range [ weight ] ) | Accept-Language = #( language-range [ weight ] ) | |||
| language-range = | language-range = | |||
| <language-range, see [RFC4647], Section 2.1> | <language-range, see [RFC4647], Section 2.1> | |||
| Each language-range can be given an associated quality value | Each language-range can be given an associated quality value | |||
| representing an estimate of the user's preference for the languages | representing an estimate of the user's preference for the languages | |||
| specified by that range, as defined in Section 7.4.4. For example, | specified by that range, as defined in Section 11.1.1.2. For | |||
| example, | ||||
| Accept-Language: da, en-gb;q=0.8, en;q=0.7 | Accept-Language: da, en-gb;q=0.8, en;q=0.7 | |||
| would mean: "I prefer Danish, but will accept British English and | would mean: "I prefer Danish, but will accept British English and | |||
| other types of English". | other types of English". | |||
| Note that some recipients treat the order in which language tags are | Note that some recipients treat the order in which language tags are | |||
| listed as an indication of descending priority, particularly for tags | listed as an indication of descending priority, particularly for tags | |||
| that are assigned equal quality values (no value is the same as q=1). | that are assigned equal quality values (no value is the same as q=1). | |||
| However, this behavior cannot be relied upon. For consistency and to | However, this behavior cannot be relied upon. For consistency and to | |||
| skipping to change at page 122, line 41 ¶ | skipping to change at page 118, line 36 ¶ | |||
| found in Section 2.3 of [RFC4647]. | found in Section 2.3 of [RFC4647]. | |||
| For matching, Section 3 of [RFC4647] defines several matching | For matching, Section 3 of [RFC4647] defines several matching | |||
| schemes. Implementations can offer the most appropriate matching | schemes. Implementations can offer the most appropriate matching | |||
| scheme for their requirements. The "Basic Filtering" scheme | scheme for their requirements. The "Basic Filtering" scheme | |||
| ([RFC4647], Section 3.3.1) is identical to the matching scheme that | ([RFC4647], Section 3.3.1) is identical to the matching scheme that | |||
| was previously defined for HTTP in Section 14.4 of [RFC2616]. | was previously defined for HTTP in Section 14.4 of [RFC2616]. | |||
| It might be contrary to the privacy expectations of the user to send | It might be contrary to the privacy expectations of the user to send | |||
| an Accept-Language header field with the complete linguistic | an Accept-Language header field with the complete linguistic | |||
| preferences of the user in every request (Section 12.12). | preferences of the user in every request (Section 16.12). | |||
| Since intelligibility is highly dependent on the individual user, | Since intelligibility is highly dependent on the individual user, | |||
| user agents need to allow user control over the linguistic preference | user agents need to allow user control over the linguistic preference | |||
| (either through configuration of the user agent itself or by | (either through configuration of the user agent itself or by | |||
| defaulting to a user controllable system setting). A user agent that | defaulting to a user controllable system setting). A user agent that | |||
| does not provide such control to the user MUST NOT send an Accept- | does not provide such control to the user MUST NOT send an Accept- | |||
| Language header field. | Language header field. | |||
| | *Note:* User agents ought to provide guidance to users when | | *Note:* User agents ought to provide guidance to users when | |||
| | setting a preference, since users are rarely familiar with the | | setting a preference, since users are rarely familiar with the | |||
| | details of language matching as described above. For example, | | details of language matching as described above. For example, | |||
| | users might assume that on selecting "en-gb", they will be | | users might assume that on selecting "en-gb", they will be | |||
| | served any kind of English document if British English is not | | served any kind of English document if British English is not | |||
| | available. A user agent might suggest, in such a case, to add | | available. A user agent might suggest, in such a case, to add | |||
| | "en" to the list for better matching behavior. | | "en" to the list for better matching behavior. | |||
| 9.5. Authentication Credentials | 11.2. Reactive Negotiation | |||
| HTTP provides a general framework for access control and | With reactive negotiation (a.k.a., agent-driven negotiation), | |||
| authentication, via an extensible set of challenge-response | selection of the best response representation (regardless of the | |||
| authentication schemes, which can be used by a server to challenge a | status code) is performed by the user agent after receiving an | |||
| client request and by a client to provide authentication information. | initial response from the origin server that contains a list of | |||
| resources for alternative representations. If the user agent is not | ||||
| satisfied by the initial response representation, it can perform a | ||||
| GET request on one or more of the alternative resources, selected | ||||
| based on metadata included in the list, to obtain a different form of | ||||
| representation for that response. Selection of alternatives might be | ||||
| performed automatically by the user agent or manually by the user | ||||
| selecting from a generated (possibly hypertext) menu. | ||||
| Two header fields are used for carrying authentication credentials. | Note that the above refers to representations of the response, in | |||
| Note that various custom mechanisms for user authentication use the | general, not representations of the resource. The alternative | |||
| Cookie header field for this purpose, as defined in [RFC6265]. | representations are only considered representations of the target | |||
| resource if the response in which those alternatives are provided has | ||||
| the semantics of being a representation of the target resource (e.g., | ||||
| a 200 (OK) response to a GET request) or has the semantics of | ||||
| providing links to alternative representations for the target | ||||
| resource (e.g., a 300 (Multiple Choices) response to a GET request). | ||||
| --------------------- ------- | A server might choose not to send an initial representation, other | |||
| than the list of alternatives, and thereby indicate that reactive | ||||
| negotiation by the user agent is preferred. For example, the | ||||
| alternatives listed in responses with the 300 (Multiple Choices) and | ||||
| 406 (Not Acceptable) status codes include information about the | ||||
| available representations so that the user or user agent can react by | ||||
| making a selection. | ||||
| Reactive negotiation is advantageous when the response would vary | ||||
| over commonly used dimensions (such as type, language, or encoding), | ||||
| when the origin server is unable to determine a user agent's | ||||
| capabilities from examining the request, and generally when public | ||||
| caches are used to distribute server load and reduce network usage. | ||||
| Reactive negotiation suffers from the disadvantages of transmitting a | ||||
| list of alternatives to the user agent, which degrades user-perceived | ||||
| latency if transmitted in the header section, and needing a second | ||||
| request to obtain an alternate representation. Furthermore, this | ||||
| specification does not define a mechanism for supporting automatic | ||||
| selection, though it does not prevent such a mechanism from being | ||||
| developed as an extension. | ||||
| 11.2.1. Vary | ||||
| The "Vary" header field in a response describes what parts of a | ||||
| request message, aside from the method and target URI, might | ||||
| influence the origin server's process for selecting and representing | ||||
| this response. | ||||
| Vary = #( "*" / field-name ) | ||||
| A Vary field value is a list of request field names, known as the | ||||
| selecting header fields, that might have a role in selecting the | ||||
| representation for this response. Potential selecting header fields | ||||
| are not limited to those defined by this specification. | ||||
| If the list contains "*", it signals that other aspects of the | ||||
| request might play a role in selecting the response representation, | ||||
| possibly including elements outside the message syntax (e.g., the | ||||
| client's network address). A recipient will not be able to determine | ||||
| whether this response is appropriate for a later request without | ||||
| forwarding the request to the origin server. A proxy MUST NOT | ||||
| generate "*" in a Vary field value. | ||||
| For example, a response that contains | ||||
| Vary: accept-encoding, accept-language | ||||
| indicates that the origin server might have used the request's | ||||
| Accept-Encoding and Accept-Language fields (or lack thereof) as | ||||
| determining factors while choosing the content for this response. | ||||
| An origin server might send Vary with a list of fields for two | ||||
| purposes: | ||||
| 1. To inform cache recipients that they MUST NOT use this response | ||||
| to satisfy a later request unless the later request has the same | ||||
| values for the listed fields as the original request (Section 4.1 | ||||
| of [Caching]). In other words, Vary expands the cache key | ||||
| required to match a new request to the stored cache entry. | ||||
| 2. To inform user agent recipients that this response is subject to | ||||
| content negotiation (Section 11) and that a different | ||||
| representation might be sent in a subsequent request if | ||||
| additional parameters are provided in the listed header fields | ||||
| (proactive negotiation). | ||||
| An origin server SHOULD send a Vary header field when its algorithm | ||||
| for selecting a representation varies based on aspects of the request | ||||
| message other than the method and target URI, unless the variance | ||||
| cannot be crossed or the origin server has been deliberately | ||||
| configured to prevent cache transparency. For example, there is no | ||||
| need to send the Authorization field name in Vary because reuse | ||||
| across users is constrained by the field definition (Section 10.6.2). | ||||
| Likewise, an origin server might use Cache-Control response | ||||
| directives (Section 5.2 of [Caching]) to supplant Vary if it | ||||
| considers the variance less significant than the performance cost of | ||||
| Vary's impact on caching. | ||||
| 11.3. Request Payload Negotiation | ||||
| When content negotiation preferences are sent in a server's response, | ||||
| the listed preferences are called request payload negotiation because | ||||
| they intend to influence selection of an appropriate payload for | ||||
| subsequent requests to that resource. For example, the | ||||
| Accept-Encoding field (Section 11.1.4) can be sent in a response to | ||||
| indicate preferred content codings for subsequent requests to that | ||||
| resource [RFC7694]. | ||||
| | Similarly, Section 3.1 of [RFC5789] defines the "Accept-Patch" | ||||
| | response header field which allows discovery of which content | ||||
| | types are accepted in PATCH requests. | ||||
| 12. Conditional Requests | ||||
| A conditional request is an HTTP request with one or more request | ||||
| header fields that indicate a precondition to be tested before | ||||
| applying the request method to the target resource. Section 12.2 | ||||
| defines when preconditions are applied. Section 12.3 defines the | ||||
| order of evaluation when more than one precondition is present. | ||||
| Conditional GET requests are the most efficient mechanism for HTTP | ||||
| cache updates [Caching]. Conditionals can also be applied to state- | ||||
| changing methods, such as PUT and DELETE, to prevent the "lost | ||||
| update" problem: one client accidentally overwriting the work of | ||||
| another client that has been acting in parallel. | ||||
| Conditional request preconditions are based on the state of the | ||||
| target resource as a whole (its current value set) or the state as | ||||
| observed in a previously obtained representation (one value in that | ||||
| set). A resource might have multiple current representations, each | ||||
| with its own observable state. The conditional request mechanisms | ||||
| assume that the mapping of requests to a selected representation | ||||
| (Section 7) will be consistent over time if the server intends to | ||||
| take advantage of conditionals. Regardless, if the mapping is | ||||
| inconsistent and the server is unable to select the appropriate | ||||
| representation, then no harm will result when the precondition | ||||
| evaluates to false. | ||||
| 12.1. Preconditions | ||||
| The following request header fields allow a client to place a | ||||
| precondition on the state of the target resource, so that the action | ||||
| corresponding to the method semantics will not be applied if the | ||||
| precondition evaluates to false. Each precondition defined by this | ||||
| specification consists of a comparison between a set of validators | ||||
| obtained from prior representations of the target resource to the | ||||
| current state of validators for the selected representation | ||||
| (Section 7.9). Hence, these preconditions evaluate whether the state | ||||
| of the target resource has changed since a given state known by the | ||||
| client. The effect of such an evaluation depends on the method | ||||
| semantics and choice of conditional, as defined in Section 12.2. | ||||
| --------------------- -------- | ||||
| Field Name Ref. | Field Name Ref. | |||
| --------------------- ------- | --------------------- -------- | |||
| Authorization 9.5.3 | If-Match 12.1.1 | |||
| Proxy-Authorization 9.5.4 | If-None-Match 12.1.2 | |||
| --------------------- ------- | If-Modified-Since 12.1.3 | |||
| If-Unmodified-Since 12.1.4 | ||||
| If-Range 12.1.5 | ||||
| --------------------- -------- | ||||
| Table 16 | Table 12 | |||
| 9.5.1. Challenge and Response | 12.1.1. If-Match | |||
| HTTP provides a simple challenge-response authentication framework | The "If-Match" header field makes the request method conditional on | |||
| that can be used by a server to challenge a client request and by a | the recipient origin server either having at least one current | |||
| client to provide authentication information. It uses a case- | representation of the target resource, when the field value is "*", | |||
| insensitive token as a means to identify the authentication scheme, | or having a current representation of the target resource that has an | |||
| followed by additional information necessary for achieving | entity-tag matching a member of the list of entity-tags provided in | |||
| authentication via that scheme. The latter can be either a comma- | the field value. | |||
| separated list of parameters or a single sequence of characters | ||||
| capable of holding base64-encoded information. | ||||
| Authentication parameters are name=value pairs, where the name token | An origin server MUST use the strong comparison function when | |||
| is matched case-insensitively, and each parameter name MUST only | comparing entity-tags for If-Match (Section 7.9.3.2), since the | |||
| occur once per challenge. | client intends this precondition to prevent the method from being | |||
| applied if there have been any changes to the representation data. | ||||
| auth-scheme = token | If-Match = "*" / #entity-tag | |||
| auth-param = token BWS "=" BWS ( token / quoted-string ) | Examples: | |||
| token68 = 1*( ALPHA / DIGIT / | If-Match: "xyzzy" | |||
| "-" / "." / "_" / "~" / "+" / "/" ) *"=" | If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz" | |||
| If-Match: * | ||||
| The token68 syntax allows the 66 unreserved URI characters | If-Match is most often used with state-changing methods (e.g., POST, | |||
| ([RFC3986]), plus a few others, so that it can hold a base64, | PUT, DELETE) to prevent accidental overwrites when multiple user | |||
| base64url (URL and filename safe alphabet), base32, or base16 (hex) | agents might be acting in parallel on the same resource (i.e., to | |||
| encoding, with or without padding, but excluding whitespace | prevent the "lost update" problem). It can also be used with any | |||
| ([RFC4648]). | method to abort a request if the selected representation does not | |||
| match one that the client has already stored (or partially stored) | ||||
| from a prior request. | ||||
| A 401 (Unauthorized) response message is used by an origin server to | An origin server that receives an If-Match header field MUST evaluate | |||
| challenge the authorization of a user agent, including a | the condition as per Section 12.2 prior to performing the method. | |||
| WWW-Authenticate header field containing at least one challenge | ||||
| applicable to the requested resource. | ||||
| A 407 (Proxy Authentication Required) response message is used by a | To evaluate a received If-Match header field: | |||
| proxy to challenge the authorization of a client, including a | ||||
| Proxy-Authenticate header field containing at least one challenge | ||||
| applicable to the proxy for the requested resource. | ||||
| challenge = auth-scheme [ 1*SP ( token68 / #auth-param ) ] | 1. If the field value is "*", the condition is true if the origin | |||
| server has a current representation for the target resource. | ||||
| | *Note:* Many clients fail to parse a challenge that contains an | 2. If the field value is a list of entity-tags, the condition is | |||
| | unknown scheme. A workaround for this problem is to list well- | true if any of the listed tags match the entity-tag of the | |||
| | supported schemes (such as "basic") first. | selected representation. | |||
| A user agent that wishes to authenticate itself with an origin server | 3. Otherwise, the condition is false. | |||
| - usually, but not necessarily, after receiving a 401 (Unauthorized) | ||||
| - can do so by including an Authorization header field with the | ||||
| request. | ||||
| A client that wishes to authenticate itself with a proxy - usually, | An origin server MUST NOT perform the requested method if a received | |||
| but not necessarily, after receiving a 407 (Proxy Authentication | If-Match condition evaluates to false. Instead, the origin server | |||
| Required) - can do so by including a Proxy-Authorization header field | MAY indicate that the conditional request failed by responding with a | |||
| with the request. | 412 (Precondition Failed) status code. Alternatively, if the request | |||
| is a state-changing operation that appears to have already been | ||||
| applied to the selected representation, the origin server MAY respond | ||||
| with a 2xx (Successful) status code (i.e., the change requested by | ||||
| the user agent has already succeeded, but the user agent might not be | ||||
| aware of it, perhaps because the prior response was lost or an | ||||
| equivalent change was made by some other user agent). | ||||
| Both the Authorization field value and the Proxy-Authorization field | Allowing an origin server to send a success response when a change | |||
| value contain the client's credentials for the realm of the resource | request appears to have already been applied is more efficient for | |||
| being requested, based upon a challenge received in a response | many authoring use cases, but comes with some risk if multiple user | |||
| (possibly at some point in the past). When creating their values, | agents are making change requests that are very similar but not | |||
| the user agent ought to do so by selecting the challenge with what it | cooperative. For example, multiple user agents writing to a common | |||
| considers to be the most secure auth-scheme that it understands, | resource as a semaphore (e.g., a non-atomic increment) are likely to | |||
| obtaining credentials from the user as appropriate. Transmission of | collide and potentially lose important state transitions. For those | |||
| credentials within header field values implies significant security | kinds of resources, an origin server is better off being stringent in | |||
| considerations regarding the confidentiality of the underlying | sending 412 for every failed precondition on an unsafe method. In | |||
| connection, as described in Section 12.15.1. | other cases, excluding the ETag field from a success response might | |||
| encourage the user agent to perform a GET as its next request to | ||||
| eliminate confusion about the resource's current state. | ||||
| credentials = auth-scheme [ 1*SP ( token68 / #auth-param ) ] | The If-Match header field can be ignored by caches and intermediaries | |||
| because it is not applicable to a stored response. | ||||
| Upon receipt of a request for a protected resource that omits | Note that an If-Match header field with a list value containing "*" | |||
| credentials, contains invalid credentials (e.g., a bad password) or | and other values (including other instances of "*") is unlikely to be | |||
| partial credentials (e.g., when the authentication scheme requires | interoperable. | |||
| more than one round trip), an origin server SHOULD send a 401 | ||||
| (Unauthorized) response that contains a WWW-Authenticate header field | ||||
| with at least one (possibly new) challenge applicable to the | ||||
| requested resource. | ||||
| Likewise, upon receipt of a request that omits proxy credentials or | 12.1.2. If-None-Match | |||
| contains invalid or partial proxy credentials, a proxy that requires | ||||
| authentication SHOULD generate a 407 (Proxy Authentication Required) | ||||
| response that contains a Proxy-Authenticate header field with at | ||||
| least one (possibly new) challenge applicable to the proxy. | ||||
| A server that receives valid credentials that are not adequate to | The "If-None-Match" header field makes the request method conditional | |||
| gain access ought to respond with the 403 (Forbidden) status code | on a recipient cache or origin server either not having any current | |||
| (Section 10.5.4). | representation of the target resource, when the field value is "*", | |||
| or having a selected representation with an entity-tag that does not | ||||
| match any of those listed in the field value. | ||||
| HTTP does not restrict applications to this simple challenge-response | A recipient MUST use the weak comparison function when comparing | |||
| framework for access authentication. Additional mechanisms can be | entity-tags for If-None-Match (Section 7.9.3.2), since weak entity- | |||
| used, such as authentication at the transport level or via message | tags can be used for cache validation even if there have been changes | |||
| encapsulation, and with additional header fields specifying | to the representation data. | |||
| authentication information. However, such additional mechanisms are | ||||
| not defined by this specification. | ||||
| 9.5.2. Protection Space (Realm) | If-None-Match = "*" / #entity-tag | |||
| The "realm" authentication parameter is reserved for use by | Examples: | |||
| authentication schemes that wish to indicate a scope of protection. | ||||
| A protection space is defined by the canonical root URI (the scheme | If-None-Match: "xyzzy" | |||
| and authority components of the target URI; see Section 6.1) of the | If-None-Match: W/"xyzzy" | |||
| server being accessed, in combination with the realm value if | If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz" | |||
| present. These realms allow the protected resources on a server to | If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz" | |||
| be partitioned into a set of protection spaces, each with its own | If-None-Match: * | |||
| authentication scheme and/or authorization database. The realm value | ||||
| is a string, generally assigned by the origin server, that can have | ||||
| additional semantics specific to the authentication scheme. Note | ||||
| that a response can have multiple challenges with the same auth- | ||||
| scheme but with different realms. | ||||
| The protection space determines the domain over which credentials can | If-None-Match is primarily used in conditional GET requests to enable | |||
| be automatically applied. If a prior request has been authorized, | efficient updates of cached information with a minimum amount of | |||
| the user agent MAY reuse the same credentials for all other requests | transaction overhead. When a client desires to update one or more | |||
| within that protection space for a period of time determined by the | stored responses that have entity-tags, the client SHOULD generate an | |||
| authentication scheme, parameters, and/or user preferences (such as a | If-None-Match header field containing a list of those entity-tags | |||
| configurable inactivity timeout). Unless specifically allowed by the | when making a GET request; this allows recipient servers to send a | |||
| authentication scheme, a single protection space cannot extend | 304 (Not Modified) response to indicate when one of those stored | |||
| outside the scope of its server. | responses matches the selected representation. | |||
| For historical reasons, a sender MUST only generate the quoted-string | If-None-Match can also be used with a value of "*" to prevent an | |||
| syntax. Recipients might have to support both token and quoted- | unsafe request method (e.g., PUT) from inadvertently modifying an | |||
| string syntax for maximum interoperability with existing clients that | existing representation of the target resource when the client | |||
| have been accepting both notations for a long time. | believes that the resource does not have a current representation | |||
| (Section 8.2.1). This is a variation on the "lost update" problem | ||||
| that might arise if more than one client attempts to create an | ||||
| initial representation for the target resource. | ||||
| 9.5.3. Authorization | An origin server that receives an If-None-Match header field MUST | |||
| evaluate the condition as per Section 12.2 prior to performing the | ||||
| method. | ||||
| The "Authorization" header field allows a user agent to authenticate | To evaluate a received If-None-Match header field: | |||
| itself with an origin server - usually, but not necessarily, after | ||||
| receiving a 401 (Unauthorized) response. Its value consists of | ||||
| credentials containing the authentication information of the user | ||||
| agent for the realm of the resource being requested. | ||||
| Authorization = credentials | 1. If the field value is "*", the condition is false if the origin | |||
| server has a current representation for the target resource. | ||||
| If a request is authenticated and a realm specified, the same | 2. If the field value is a list of entity-tags, the condition is | |||
| credentials are presumed to be valid for all other requests within | false if one of the listed tags matches the entity-tag of the | |||
| this realm (assuming that the authentication scheme itself does not | selected representation. | |||
| require otherwise, such as credentials that vary according to a | ||||
| challenge value or using synchronized clocks). | ||||
| A proxy forwarding a request MUST NOT modify any Authorization fields | 3. Otherwise, the condition is true. | |||
| in that request. See Section 3.3 of [Caching] for details of and | ||||
| requirements pertaining to handling of the Authorization field by | ||||
| HTTP caches. | ||||
| 9.5.4. Proxy-Authorization | An origin server MUST NOT perform the requested method if the | |||
| condition evaluates to false; instead, the origin server MUST respond | ||||
| with either a) the 304 (Not Modified) status code if the request | ||||
| method is GET or HEAD or b) the 412 (Precondition Failed) status code | ||||
| for all other request methods. | ||||
| The "Proxy-Authorization" header field allows the client to identify | Requirements on cache handling of a received If-None-Match header | |||
| itself (or its user) to a proxy that requires authentication. Its | field are defined in Section 4.3.2 of [Caching]. | |||
| value consists of credentials containing the authentication | ||||
| information of the client for the proxy and/or realm of the resource | ||||
| being requested. | ||||
| Proxy-Authorization = credentials | Note that an If-None-Match header field with a list value containing | |||
| "*" and other values (including other instances of "*") is unlikely | ||||
| to be interoperable. | ||||
| Unlike Authorization, the Proxy-Authorization header field applies | 12.1.3. If-Modified-Since | |||
| only to the next inbound proxy that demanded authentication using the | ||||
| Proxy-Authenticate field. When multiple proxies are used in a chain, | ||||
| the Proxy-Authorization header field is consumed by the first inbound | ||||
| proxy that was expecting to receive credentials. A proxy MAY relay | ||||
| the credentials from the client request to the next proxy if that is | ||||
| the mechanism by which the proxies cooperatively authenticate a given | ||||
| request. | ||||
| 9.5.5. Authentication Scheme Extensibility | The "If-Modified-Since" header field makes a GET or HEAD request | |||
| method conditional on the selected representation's modification date | ||||
| being more recent than the date provided in the field value. | ||||
| Transfer of the selected representation's data is avoided if that | ||||
| data has not changed. | ||||
| Aside from the general framework, this document does not specify any | If-Modified-Since = HTTP-date | |||
| authentication schemes. New and existing authentication schemes are | ||||
| specified independently and ought to be registered within the | ||||
| "Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry". | ||||
| For example, the "basic" and "digest" authentication schemes are | ||||
| defined by RFC 7617 and RFC 7616, respectively. | ||||
| 9.5.5.1. Authentication Scheme Registry | An example of the field is: | |||
| The "Hypertext Transfer Protocol (HTTP) Authentication Scheme | If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT | |||
| Registry" defines the namespace for the authentication schemes in | ||||
| challenges and credentials. It is maintained at | ||||
| <https://www.iana.org/assignments/http-authschemes>. | ||||
| Registrations MUST include the following fields: | A recipient MUST ignore If-Modified-Since if the request contains an | |||
| If-None-Match header field; the condition in If-None-Match is | ||||
| considered to be a more accurate replacement for the condition in If- | ||||
| Modified-Since, and the two are only combined for the sake of | ||||
| interoperating with older intermediaries that might not implement | ||||
| If-None-Match. | ||||
| o Authentication Scheme Name | A recipient MUST ignore the If-Modified-Since header field if the | |||
| received field value is not a valid HTTP-date, the field value has | ||||
| more than one member, or if the request method is neither GET nor | ||||
| HEAD. | ||||
| o Pointer to specification text | A recipient MUST interpret an If-Modified-Since field value's | |||
| timestamp in terms of the origin server's clock. | ||||
| o Notes (optional) | If-Modified-Since is typically used for two distinct purposes: 1) to | |||
| allow efficient updates of a cached representation that does not have | ||||
| an entity-tag and 2) to limit the scope of a web traversal to | ||||
| resources that have recently changed. | ||||
| Values to be added to this namespace require IETF Review (see | When used for cache updates, a cache will typically use the value of | |||
| [RFC8126], Section 4.8). | the cached message's Last-Modified field to generate the field value | |||
| of If-Modified-Since. This behavior is most interoperable for cases | ||||
| where clocks are poorly synchronized or when the server has chosen to | ||||
| only honor exact timestamp matches (due to a problem with Last- | ||||
| Modified dates that appear to go "back in time" when the origin | ||||
| server's clock is corrected or a representation is restored from an | ||||
| archived backup). However, caches occasionally generate the field | ||||
| value based on other data, such as the Date header field of the | ||||
| cached message or the local clock time that the message was received, | ||||
| particularly when the cached message does not contain a Last-Modified | ||||
| field. | ||||
| 9.5.5.2. Considerations for New Authentication Schemes | When used for limiting the scope of retrieval to a recent time | |||
| window, a user agent will generate an If-Modified-Since field value | ||||
| based on either its own local clock or a Date header field received | ||||
| from the server in a prior response. Origin servers that choose an | ||||
| exact timestamp match based on the selected representation's | ||||
| Last-Modified field will not be able to help the user agent limit its | ||||
| data transfers to only those changed during the specified window. | ||||
| There are certain aspects of the HTTP Authentication framework that | An origin server that receives an If-Modified-Since header field | |||
| put constraints on how new authentication schemes can work: | SHOULD evaluate the condition as per Section 12.2 prior to performing | |||
| the method. The origin server SHOULD NOT perform the requested | ||||
| method if the selected representation's last modification date is | ||||
| earlier than or equal to the date provided in the field value; | ||||
| instead, the origin server SHOULD generate a 304 (Not Modified) | ||||
| response, including only those metadata that are useful for | ||||
| identifying or updating a previously cached response. | ||||
| o HTTP authentication is presumed to be stateless: all of the | Requirements on cache handling of a received If-Modified-Since header | |||
| information necessary to authenticate a request MUST be provided | field are defined in Section 4.3.2 of [Caching]. | |||
| in the request, rather than be dependent on the server remembering | ||||
| prior requests. Authentication based on, or bound to, the | ||||
| underlying connection is outside the scope of this specification | ||||
| and inherently flawed unless steps are taken to ensure that the | ||||
| connection cannot be used by any party other than the | ||||
| authenticated user (see Section 2.2). | ||||
| o The authentication parameter "realm" is reserved for defining | 12.1.4. If-Unmodified-Since | |||
| protection spaces as described in Section 9.5.2. New schemes MUST | ||||
| NOT use it in a way incompatible with that definition. | ||||
| o The "token68" notation was introduced for compatibility with | The "If-Unmodified-Since" header field makes the request method | |||
| existing authentication schemes and can only be used once per | conditional on the selected representation's last modification date | |||
| challenge or credential. Thus, new schemes ought to use the auth- | being earlier than or equal to the date provided in the field value. | |||
| param syntax instead, because otherwise future extensions will be | This field accomplishes the same purpose as If-Match for cases where | |||
| impossible. | the user agent does not have an entity-tag for the representation. | |||
| o The parsing of challenges and credentials is defined by this | If-Unmodified-Since = HTTP-date | |||
| specification and cannot be modified by new authentication | ||||
| schemes. When the auth-param syntax is used, all parameters ought | ||||
| to support both token and quoted-string syntax, and syntactical | ||||
| constraints ought to be defined on the field value after parsing | ||||
| (i.e., quoted-string processing). This is necessary so that | ||||
| recipients can use a generic parser that applies to all | ||||
| authentication schemes. | ||||
| *Note:* The fact that the value syntax for the "realm" parameter | An example of the field is: | |||
| is restricted to quoted-string was a bad design choice not to be | ||||
| repeated for new parameters. | ||||
| o Definitions of new schemes ought to define the treatment of | If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT | |||
| unknown extension parameters. In general, a "must-ignore" rule is | ||||
| preferable to a "must-understand" rule, because otherwise it will | ||||
| be hard to introduce new parameters in the presence of legacy | ||||
| recipients. Furthermore, it's good to describe the policy for | ||||
| defining new parameters (such as "update the specification" or | ||||
| "use this registry"). | ||||
| o Authentication schemes need to document whether they are usable in | A recipient MUST ignore If-Unmodified-Since if the request contains | |||
| origin-server authentication (i.e., using WWW-Authenticate), and/ | an If-Match header field; the condition in If-Match is considered to | |||
| or proxy authentication (i.e., using Proxy-Authenticate). | be a more accurate replacement for the condition in If-Unmodified- | |||
| Since, and the two are only combined for the sake of interoperating | ||||
| with older intermediaries that might not implement If-Match. | ||||
| o The credentials carried in an Authorization header field are | A recipient MUST ignore the If-Unmodified-Since header field if the | |||
| specific to the user agent and, therefore, have the same effect on | received field value is not a valid HTTP-date (including when the | |||
| HTTP caches as the "private" Cache-Control response directive | field value appears to be a list of dates). | |||
| (Section 5.2.2.7 of [Caching]), within the scope of the request in | ||||
| which they appear. | ||||
| Therefore, new authentication schemes that choose not to carry | A recipient MUST interpret an If-Unmodified-Since field value's | |||
| credentials in the Authorization header field (e.g., using a newly | timestamp in terms of the origin server's clock. | |||
| defined header field) will need to explicitly disallow caching, by | ||||
| mandating the use of Cache-Control response directives (e.g., | ||||
| "private"). | ||||
| o Schemes using Authentication-Info, Proxy-Authentication-Info, or | If-Unmodified-Since is most often used with state-changing methods | |||
| any other authentication related response header field need to | (e.g., POST, PUT, DELETE) to prevent accidental overwrites when | |||
| consider and document the related security considerations (see | multiple user agents might be acting in parallel on a resource that | |||
| Section 12.15.4). | does not supply entity-tags with its representations (i.e., to | |||
| prevent the "lost update" problem). It can also be used with any | ||||
| method to abort a request if the selected representation does not | ||||
| match one that the client already stored (or partially stored) from a | ||||
| prior request. | ||||
| 9.6. Request Context | An origin server that receives an If-Unmodified-Since header field | |||
| MUST evaluate the condition as per Section 12.2 prior to performing | ||||
| the method. | ||||
| The following request header fields provide additional information | If the selected representation has a last modification date, the | |||
| about the request context, including information about the user, user | origin server MUST NOT perform the requested method if that date is | |||
| agent, and resource behind the request. | more recent than the date provided in the field value. Instead, the | |||
| origin server MAY indicate that the conditional request failed by | ||||
| responding with a 412 (Precondition Failed) status code. | ||||
| Alternatively, if the request is a state-changing operation that | ||||
| appears to have already been applied to the selected representation, | ||||
| the origin server MAY respond with a 2xx (Successful) status code | ||||
| (i.e., the change requested by the user agent has already succeeded, | ||||
| but the user agent might not be aware of it, perhaps because the | ||||
| prior response was lost or an equivalent change was made by some | ||||
| other user agent). | ||||
| ------------ ------- | Allowing an origin server to send a success response when a change | |||
| Field Name Ref. | request appears to have already been applied is more efficient for | |||
| ------------ ------- | many authoring use cases, but comes with some risk if multiple user | |||
| From 9.6.1 | agents are making change requests that are very similar but not | |||
| Referer 9.6.2 | cooperative. In those cases, an origin server is better off being | |||
| User-Agent 9.6.3 | stringent in sending 412 for every failed precondition on an unsafe | |||
| ------------ ------- | method. | |||
| Table 17 | The If-Unmodified-Since header field can be ignored by caches and | |||
| intermediaries because it is not applicable to a stored response. | ||||
| 9.6.1. From | 12.1.5. If-Range | |||
| The "From" header field contains an Internet email address for a | The "If-Range" header field provides a special conditional request | |||
| human user who controls the requesting user agent. The address ought | mechanism that is similar to the If-Match and If-Unmodified-Since | |||
| to be machine-usable, as defined by "mailbox" in Section 3.4 of | header fields but that instructs the recipient to ignore the Range | |||
| [RFC5322]: | header field if the validator doesn't match, resulting in transfer of | |||
| the new selected representation instead of a 412 (Precondition | ||||
| Failed) response. | ||||
| From = mailbox | If a client has a partial copy of a representation and wishes to have | |||
| an up-to-date copy of the entire representation, it could use the | ||||
| Range header field with a conditional GET (using either or both of | ||||
| If-Unmodified-Since and If-Match.) However, if the precondition | ||||
| fails because the representation has been modified, the client would | ||||
| then have to make a second request to obtain the entire current | ||||
| representation. | ||||
| mailbox = <mailbox, see [RFC5322], Section 3.4> | The "If-Range" header field allows a client to "short-circuit" the | |||
| second request. Informally, its meaning is as follows: if the | ||||
| representation is unchanged, send me the part(s) that I am requesting | ||||
| in Range; otherwise, send me the entire representation. | ||||
| An example is: | If-Range = entity-tag / HTTP-date | |||
| From: webmaster@example.org | A client MUST NOT generate an If-Range header field in a request that | |||
| does not contain a Range header field. A server MUST ignore an If- | ||||
| Range header field received in a request that does not contain a | ||||
| Range header field. An origin server MUST ignore an If-Range header | ||||
| field received in a request for a target resource that does not | ||||
| support Range requests. | ||||
| The From header field is rarely sent by non-robotic user agents. A | A client MUST NOT generate an If-Range header field containing an | |||
| user agent SHOULD NOT send a From header field without explicit | entity-tag that is marked as weak. A client MUST NOT generate an If- | |||
| configuration by the user, since that might conflict with the user's | Range header field containing an HTTP-date unless the client has no | |||
| privacy interests or their site's security policy. | entity-tag for the corresponding representation and the date is a | |||
| strong validator in the sense defined by Section 7.9.2.2. | ||||
| A robotic user agent SHOULD send a valid From header field so that | A server that evaluates an If-Range precondition MUST use the strong | |||
| the person responsible for running the robot can be contacted if | comparison function when comparing entity-tags (Section 7.9.3.2) and | |||
| problems occur on servers, such as if the robot is sending excessive, | MUST evaluate the condition as false if an HTTP-date validator is | |||
| unwanted, or invalid requests. | provided that is not a strong validator in the sense defined by | |||
| Section 7.9.2.2. A valid entity-tag can be distinguished from a | ||||
| valid HTTP-date by examining the first two characters for a DQUOTE. | ||||
| A server SHOULD NOT use the From header field for access control or | If the validator given in the If-Range header field matches the | |||
| authentication, since most recipients will assume that the field | current validator for the selected representation of the target | |||
| value is public information. | resource, then the server SHOULD process the Range header field as | |||
| requested. If the validator does not match, the server MUST ignore | ||||
| the Range header field. Note that this comparison by exact match, | ||||
| including when the validator is an HTTP-date, differs from the | ||||
| "earlier than or equal to" comparison used when evaluating an | ||||
| If-Unmodified-Since conditional. | ||||
| 9.6.2. Referer | 12.2. Evaluation | |||
| The "Referer" [sic] header field allows the user agent to specify a | Except when excluded below, a recipient cache or origin server MUST | |||
| URI reference for the resource from which the target URI was obtained | evaluate received request preconditions after it has successfully | |||
| (i.e., the "referrer", though the field name is misspelled). A user | performed its normal request checks and just before it would process | |||
| agent MUST NOT include the fragment and userinfo components of the | the request body (if any) or perform the action associated with the | |||
| URI reference [RFC3986], if any, when generating the Referer field | request method. A server MUST ignore all received preconditions if | |||
| value. | its response to the same request without those conditions, prior to | |||
| processing the request body, would have been a status code other than | ||||
| a 2xx (Successful) or 412 (Precondition Failed). In other words, | ||||
| redirects and failures that can be detected before significant | ||||
| processing occurs take precedence over the evaluation of | ||||
| preconditions. | ||||
| Referer = absolute-URI / partial-URI | A server that is not the origin server for the target resource and | |||
| cannot act as a cache for requests on the target resource MUST NOT | ||||
| evaluate the conditional request header fields defined by this | ||||
| specification, and it MUST forward them if the request is forwarded, | ||||
| since the generating client intends that they be evaluated by a | ||||
| server that can provide a current representation. Likewise, a server | ||||
| MUST ignore the conditional request header fields defined by this | ||||
| specification when received with a request method that does not | ||||
| involve the selection or modification of a selected representation, | ||||
| such as CONNECT, OPTIONS, or TRACE. | ||||
| The field value is either an absolute-URI or a partial-URI. In the | Note that protocol extensions can modify the conditions under which | |||
| latter case (Section 2.4), the referenced URI is relative to the | revalidation is triggered. For example, the "immutable" cache | |||
| target URI ([RFC3986], Section 5). | directive (defined by [RFC8246]) instructs caches to forgo | |||
| revalidation of fresh responses even when requested by the client. | ||||
| The Referer header field allows servers to generate back-links to | Conditional request header fields that are defined by extensions to | |||
| other resources for simple analytics, logging, optimized caching, | HTTP might place conditions on all recipients, on the state of the | |||
| etc. It also allows obsolete or mistyped links to be found for | target resource in general, or on a group of resources. For | |||
| maintenance. Some servers use the Referer header field as a means of | instance, the "If" header field in WebDAV can make a request | |||
| denying links from other sites (so-called "deep linking") or | conditional on various aspects of multiple resources, such as locks, | |||
| restricting cross-site request forgery (CSRF), but not all requests | if the recipient understands and implements that field ([RFC4918], | |||
| contain it. | Section 10.4). | |||
| Example: | Although conditional request header fields are defined as being | |||
| usable with the HEAD method (to keep HEAD's semantics consistent with | ||||
| those of GET), there is no point in sending a conditional HEAD | ||||
| because a successful response is around the same size as a 304 (Not | ||||
| Modified) response and more useful than a 412 (Precondition Failed) | ||||
| response. | ||||
| Referer: http://www.example.org/hypertext/Overview.html | 12.3. Precedence | |||
| If the target URI was obtained from a source that does not have its | When more than one conditional request header field is present in a | |||
| own URI (e.g., input from the user keyboard, or an entry within the | request, the order in which the fields are evaluated becomes | |||
| user's bookmarks/favorites), the user agent MUST either exclude the | important. In practice, the fields defined in this document are | |||
| Referer field or send it with a value of "about:blank". | consistently implemented in a single, logical order, since "lost | |||
| update" preconditions have more strict requirements than cache | ||||
| validation, a validated cache is more efficient than a partial | ||||
| response, and entity tags are presumed to be more accurate than date | ||||
| validators. | ||||
| The Referer field has the potential to reveal information about the | A recipient cache or origin server MUST evaluate the request | |||
| request context or browsing history of the user, which is a privacy | preconditions defined by this specification in the following order: | |||
| concern if the referring resource's identifier reveals personal | ||||
| information (such as an account name) or a resource that is supposed | ||||
| to be confidential (such as behind a firewall or internal to a | ||||
| secured service). Most general-purpose user agents do not send the | ||||
| Referer header field when the referring resource is a local "file" or | ||||
| "data" URI. A user agent MUST NOT send a Referer header field in an | ||||
| unsecured HTTP request if the referring page was received with a | ||||
| secure protocol. See Section 12.9 for additional security | ||||
| considerations. | ||||
| Some intermediaries have been known to indiscriminately remove | 1. When recipient is the origin server and If-Match is present, | |||
| Referer header fields from outgoing requests. This has the | evaluate the If-Match precondition: | |||
| unfortunate side effect of interfering with protection against CSRF | ||||
| attacks, which can be far more harmful to their users. | ||||
| Intermediaries and user agent extensions that wish to limit | o if true, continue to step 3 | |||
| information disclosure in Referer ought to restrict their changes to | ||||
| specific edits, such as replacing internal domain names with | ||||
| pseudonyms or truncating the query and/or path components. An | ||||
| intermediary SHOULD NOT modify or delete the Referer header field | ||||
| when the field value shares the same scheme and host as the target | ||||
| URI. | ||||
| 9.6.3. User-Agent | o if false, respond 412 (Precondition Failed) unless it can be | |||
| determined that the state-changing request has already | ||||
| succeeded (see Section 12.1.1) | ||||
| The "User-Agent" header field contains information about the user | 2. When recipient is the origin server, If-Match is not present, and | |||
| agent originating the request, which is often used by servers to help | If-Unmodified-Since is present, evaluate the If-Unmodified-Since | |||
| identify the scope of reported interoperability problems, to work | precondition: | |||
| around or tailor responses to avoid particular user agent | ||||
| limitations, and for analytics regarding browser or operating system | ||||
| use. A user agent SHOULD send a User-Agent field in each request | ||||
| unless specifically configured not to do so. | ||||
| User-Agent = product *( RWS ( product / comment ) ) | o if true, continue to step 3 | |||
| o if false, respond 412 (Precondition Failed) unless it can be | ||||
| determined that the state-changing request has already | ||||
| succeeded (see Section 12.1.4) | ||||
| The User-Agent field value consists of one or more product | 3. When If-None-Match is present, evaluate the If-None-Match | |||
| identifiers, each followed by zero or more comments | precondition: | |||
| (Section 5.4.1.3), which together identify the user agent software | ||||
| and its significant subproducts. By convention, the product | ||||
| identifiers are listed in decreasing order of their significance for | ||||
| identifying the user agent software. Each product identifier | ||||
| consists of a name and optional version. | ||||
| product = token ["/" product-version] | o if true, continue to step 5 | |||
| product-version = token | ||||
| A sender SHOULD limit generated product identifiers to what is | o if false for GET/HEAD, respond 304 (Not Modified) | |||
| necessary to identify the product; a sender MUST NOT generate | ||||
| advertising or other nonessential information within the product | ||||
| identifier. A sender SHOULD NOT generate information in | ||||
| product-version that is not a version identifier (i.e., successive | ||||
| versions of the same product name ought to differ only in the | ||||
| product-version portion of the product identifier). | ||||
| Example: | o if false for other methods, respond 412 (Precondition Failed) | |||
| User-Agent: CERN-LineMode/2.15 libwww/2.17b3 | 4. When the method is GET or HEAD, If-None-Match is not present, and | |||
| If-Modified-Since is present, evaluate the If-Modified-Since | ||||
| precondition: | ||||
| A user agent SHOULD NOT generate a User-Agent field containing | o if true, continue to step 5 | |||
| needlessly fine-grained detail and SHOULD limit the addition of | ||||
| subproducts by third parties. Overly long and detailed User-Agent | ||||
| field values increase request latency and the risk of a user being | ||||
| identified against their wishes ("fingerprinting"). | ||||
| Likewise, implementations are encouraged not to use the product | o if false, respond 304 (Not Modified) | |||
| tokens of other implementations in order to declare compatibility | ||||
| with them, as this circumvents the purpose of the field. If a user | ||||
| agent masquerades as a different user agent, recipients can assume | ||||
| that the user intentionally desires to see responses tailored for | ||||
| that identified user agent, even if they might not work as well for | ||||
| the actual user agent being used. | ||||
| 10. Response Status Codes | 5. When the method is GET and both Range and If-Range are present, | |||
| evaluate the If-Range precondition: | ||||
| o if the validator matches and the Range specification is | ||||
| applicable to the selected representation, respond 206 | ||||
| (Partial Content) | ||||
| 6. Otherwise, | ||||
| o all conditions are met, so perform the requested action and | ||||
| respond according to its success or failure. | ||||
| Any extension to HTTP that defines additional conditional request | ||||
| header fields ought to define its own expectations regarding the | ||||
| order for evaluating such fields in relation to those defined in this | ||||
| document and other conditionals that might be found in practice. | ||||
| 13. Range Requests | ||||
| Clients often encounter interrupted data transfers as a result of | ||||
| canceled requests or dropped connections. When a client has stored a | ||||
| partial representation, it is desirable to request the remainder of | ||||
| that representation in a subsequent request rather than transfer the | ||||
| entire representation. Likewise, devices with limited local storage | ||||
| might benefit from being able to request only a subset of a larger | ||||
| representation, such as a single page of a very large document, or | ||||
| the dimensions of an embedded image. | ||||
| Range requests are an OPTIONAL feature of HTTP, designed so that | ||||
| recipients not implementing this feature (or not supporting it for | ||||
| the target resource) can respond as if it is a normal GET request | ||||
| without impacting interoperability. Partial responses are indicated | ||||
| by a distinct status code to not be mistaken for full responses by | ||||
| caches that might not implement the feature. | ||||
| 13.1. Range Units | ||||
| Representation data can be partitioned into subranges when there are | ||||
| addressable structural units inherent to that data's content coding | ||||
| or media type. For example, octet (a.k.a., byte) boundaries are a | ||||
| structural unit common to all representation data, allowing | ||||
| partitions of the data to be identified as a range of bytes at some | ||||
| offset from the start or end of that data. | ||||
| This general notion of a "range unit" is used in the Accept-Ranges | ||||
| (Section 13.3) response header field to advertise support for range | ||||
| requests, the Range (Section 13.2) request header field to delineate | ||||
| the parts of a representation that are requested, and the | ||||
| Content-Range (Section 13.4) payload header field to describe which | ||||
| part of a representation is being transferred. | ||||
| range-unit = token | ||||
| All range unit names are case-insensitive and ought to be registered | ||||
| within the "HTTP Range Unit Registry", as defined in Section 15.5.1 | ||||
| Range units are intended to be extensible, as described in | ||||
| Section 15.5. The following range unit names are defined by this | ||||
| document: | ||||
| ----------------- ---------------------------------- -------- | ||||
| Range Unit Name Description Ref. | ||||
| ----------------- ---------------------------------- -------- | ||||
| bytes a range of octets 13.1.2 | ||||
| none reserved as keyword to indicate 13.3 | ||||
| range requests are not supported | ||||
| ----------------- ---------------------------------- -------- | ||||
| Table 13 | ||||
| 13.1.1. Range Specifiers | ||||
| Ranges are expressed in terms of a range unit paired with a set of | ||||
| range specifiers. The range unit name determines what kinds of | ||||
| range-spec are applicable to its own specifiers. Hence, the | ||||
| following gramar is generic: each range unit is expected to specify | ||||
| requirements on when int-range, suffix-range, and other-range are | ||||
| allowed. | ||||
| A range request can specify a single range or a set of ranges within | ||||
| a single representation. | ||||
| ranges-specifier = range-unit "=" range-set | ||||
| range-set = 1#range-spec | ||||
| range-spec = int-range | ||||
| / suffix-range | ||||
| / other-range | ||||
| An int-range is a range expressed as two non-negative integers or as | ||||
| one non-negative integer through to the end of the representation | ||||
| data. The range unit specifies what the integers mean (e.g., they | ||||
| might indicate unit offsets from the beginning, inclusive numbered | ||||
| parts, etc.). | ||||
| int-range = first-pos "-" [ last-pos ] | ||||
| first-pos = 1*DIGIT | ||||
| last-pos = 1*DIGIT | ||||
| An int-range is invalid if the last-pos value is present and less | ||||
| than the first-pos. | ||||
| A suffix-range is a range expressed as a suffix of the representation | ||||
| data with the provided non-negative integer maximum length (in range | ||||
| units). In other words, the last N units of the representation data. | ||||
| suffix-range = "-" suffix-length | ||||
| suffix-length = 1*DIGIT | ||||
| To provide for extensibility, the other-range rule is a mostly | ||||
| unconstrained grammar that allows application-specific or future | ||||
| range units to define additional range specifiers. | ||||
| other-range = 1*( %x21-2B / %x2D-7E ) | ||||
| ; 1*(VCHAR excluding comma) | ||||
| 13.1.2. Byte Ranges | ||||
| The "bytes" range unit is used to express subranges of a | ||||
| representation data's octet sequence. Each byte range is expressed | ||||
| as an integer range at some offset, relative to either the beginning | ||||
| (int-range) or end (suffix-range) of the representation data. Byte | ||||
| ranges do not use the other-range specifier. | ||||
| The first-pos value in a bytes int-range gives the offset of the | ||||
| first byte in a range. The last-pos value gives the offset of the | ||||
| last byte in the range; that is, the byte positions specified are | ||||
| inclusive. Byte offsets start at zero. | ||||
| If the representation data has a content coding applied, each byte | ||||
| range is calculated with respect to the encoded sequence of bytes, | ||||
| not the sequence of underlying bytes that would be obtained after | ||||
| decoding. | ||||
| Examples of bytes range specifiers: | ||||
| o The first 500 bytes (byte offsets 0-499, inclusive): | ||||
| bytes=0-499 | ||||
| o The second 500 bytes (byte offsets 500-999, inclusive): | ||||
| bytes=500-999 | ||||
| A client can limit the number of bytes requested without knowing the | ||||
| size of the selected representation. If the last-pos value is | ||||
| absent, or if the value is greater than or equal to the current | ||||
| length of the representation data, the byte range is interpreted as | ||||
| the remainder of the representation (i.e., the server replaces the | ||||
| value of last-pos with a value that is one less than the current | ||||
| length of the selected representation). | ||||
| A client can request the last N bytes (N > 0) of the selected | ||||
| representation using a suffix-range. If the selected representation | ||||
| is shorter than the specified suffix-length, the entire | ||||
| representation is used. | ||||
| Additional examples, assuming a representation of length 10000: | ||||
| o The final 500 bytes (byte offsets 9500-9999, inclusive): | ||||
| bytes=-500 | ||||
| Or: | ||||
| bytes=9500- | ||||
| o The first and last bytes only (bytes 0 and 9999): | ||||
| bytes=0-0,-1 | ||||
| o The first, middle, and last 1000 bytes: | ||||
| bytes= 0-999, 4500-5499, -1000 | ||||
| o Other valid (but not canonical) specifications of the second 500 | ||||
| bytes (byte offsets 500-999, inclusive): | ||||
| bytes=500-600,601-999 | ||||
| bytes=500-700,601-999 | ||||
| If a valid bytes range-set includes at least one range-spec with a | ||||
| first-pos that is less than the current length of the representation, | ||||
| or at least one suffix-range with a non-zero suffix-length, then the | ||||
| bytes range-set is satisfiable. Otherwise, the bytes range-set is | ||||
| unsatisfiable. | ||||
| If the selected representation has zero length, the only satisfiable | ||||
| form of range-spec is a suffix-range with a non-zero suffix-length. | ||||
| In the byte-range syntax, first-pos, last-pos, and suffix-length are | ||||
| expressed as decimal number of octets. Since there is no predefined | ||||
| limit to the length of a payload, recipients MUST anticipate | ||||
| potentially large decimal numerals and prevent parsing errors due to | ||||
| integer conversion overflows. | ||||
| 13.2. Range | ||||
| The "Range" header field on a GET request modifies the method | ||||
| semantics to request transfer of only one or more subranges of the | ||||
| selected representation data (Section 7.2), rather than the entire | ||||
| selected representation. | ||||
| Range = ranges-specifier | ||||
| A server MAY ignore the Range header field. However, origin servers | ||||
| and intermediate caches ought to support byte ranges when possible, | ||||
| since they support efficient recovery from partially failed transfers | ||||
| and partial retrieval of large representations. A server MUST ignore | ||||
| a Range header field received with a request method other than GET. | ||||
| An origin server MUST ignore a Range header field that contains a | ||||
| range unit it does not understand. A proxy MAY discard a Range | ||||
| header field that contains a range unit it does not understand. | ||||
| A server that supports range requests MAY ignore or reject a Range | ||||
| header field that consists of more than two overlapping ranges, or a | ||||
| set of many small ranges that are not listed in ascending order, | ||||
| since both are indications of either a broken client or a deliberate | ||||
| denial-of-service attack (Section 16.14). A client SHOULD NOT | ||||
| request multiple ranges that are inherently less efficient to process | ||||
| and transfer than a single range that encompasses the same data. | ||||
| A server that supports range requests MAY ignore a Range header field | ||||
| when the selected representation has no body (i.e., the selected | ||||
| representation data is of zero length). | ||||
| A client that is requesting multiple ranges SHOULD list those ranges | ||||
| in ascending order (the order in which they would typically be | ||||
| received in a complete representation) unless there is a specific | ||||
| need to request a later part earlier. For example, a user agent | ||||
| processing a large representation with an internal catalog of parts | ||||
| might need to request later parts first, particularly if the | ||||
| representation consists of pages stored in reverse order and the user | ||||
| agent wishes to transfer one page at a time. | ||||
| The Range header field is evaluated after evaluating the precondition | ||||
| header fields defined in Section 12.1, and only if the result in | ||||
| absence of the Range header field would be a 200 (OK) response. In | ||||
| other words, Range is ignored when a conditional GET would result in | ||||
| a 304 (Not Modified) response. | ||||
| The If-Range header field (Section 12.1.5) can be used as a | ||||
| precondition to applying the Range header field. | ||||
| If all of the preconditions are true, the server supports the Range | ||||
| header field for the target resource, and the specified range(s) are | ||||
| valid and satisfiable (as defined in Section 13.1.2), the server | ||||
| SHOULD send a 206 (Partial Content) response with a payload | ||||
| containing one or more partial representations that correspond to the | ||||
| satisfiable ranges requested. | ||||
| If all of the preconditions are true, the server supports the Range | ||||
| header field for the target resource, and the specified range(s) are | ||||
| invalid or unsatisfiable, the server SHOULD send a 416 (Range Not | ||||
| Satisfiable) response. | ||||
| 13.3. Accept-Ranges | ||||
| The "Accept-Ranges" header field allows a server to indicate that it | ||||
| supports range requests for the target resource. | ||||
| Accept-Ranges = acceptable-ranges | ||||
| acceptable-ranges = 1#range-unit / "none" | ||||
| An origin server that supports byte-range requests for a given target | ||||
| resource MAY send | ||||
| Accept-Ranges: bytes | ||||
| to indicate what range units are supported. A client MAY generate | ||||
| range requests without having received this header field for the | ||||
| resource involved. Range units are defined in Section 13.1. | ||||
| A server that does not support any kind of range request for the | ||||
| target resource MAY send | ||||
| Accept-Ranges: none | ||||
| to advise the client not to attempt a range request. | ||||
| 13.4. Content-Range | ||||
| The "Content-Range" header field is sent in a single part 206 | ||||
| (Partial Content) response to indicate the partial range of the | ||||
| selected representation enclosed as the message payload, sent in each | ||||
| part of a multipart 206 response to indicate the range enclosed | ||||
| within each body part, and sent in 416 (Range Not Satisfiable) | ||||
| responses to provide information about the selected representation. | ||||
| Content-Range = range-unit SP | ||||
| ( range-resp / unsatisfied-range ) | ||||
| range-resp = incl-range "/" ( complete-length / "*" ) | ||||
| incl-range = first-pos "-" last-pos | ||||
| unsatisfied-range = "*/" complete-length | ||||
| complete-length = 1*DIGIT | ||||
| If a 206 (Partial Content) response contains a Content-Range header | ||||
| field with a range unit (Section 13.1) that the recipient does not | ||||
| understand, the recipient MUST NOT attempt to recombine it with a | ||||
| stored representation. A proxy that receives such a message SHOULD | ||||
| forward it downstream. | ||||
| For byte ranges, a sender SHOULD indicate the complete length of the | ||||
| representation from which the range has been extracted, unless the | ||||
| complete length is unknown or difficult to determine. An asterisk | ||||
| character ("*") in place of the complete-length indicates that the | ||||
| representation length was unknown when the header field was | ||||
| generated. | ||||
| The following example illustrates when the complete length of the | ||||
| selected representation is known by the sender to be 1234 bytes: | ||||
| Content-Range: bytes 42-1233/1234 | ||||
| and this second example illustrates when the complete length is | ||||
| unknown: | ||||
| Content-Range: bytes 42-1233/* | ||||
| A Content-Range field value is invalid if it contains a range-resp | ||||
| that has a last-pos value less than its first-pos value, or a | ||||
| complete-length value less than or equal to its last-pos value. The | ||||
| recipient of an invalid Content-Range MUST NOT attempt to recombine | ||||
| the received content with a stored representation. | ||||
| A server generating a 416 (Range Not Satisfiable) response to a byte- | ||||
| range request SHOULD send a Content-Range header field with an | ||||
| unsatisfied-range value, as in the following example: | ||||
| Content-Range: bytes */1234 | ||||
| The complete-length in a 416 response indicates the current length of | ||||
| the selected representation. | ||||
| The Content-Range header field has no meaning for status codes that | ||||
| do not explicitly describe its semantic. For this specification, | ||||
| only the 206 (Partial Content) and 416 (Range Not Satisfiable) status | ||||
| codes describe a meaning for Content-Range. | ||||
| The following are examples of Content-Range values in which the | ||||
| selected representation contains a total of 1234 bytes: | ||||
| o The first 500 bytes: | ||||
| Content-Range: bytes 0-499/1234 | ||||
| o The second 500 bytes: | ||||
| Content-Range: bytes 500-999/1234 | ||||
| o All except for the first 500 bytes: | ||||
| Content-Range: bytes 500-1233/1234 | ||||
| o The last 500 bytes: | ||||
| Content-Range: bytes 734-1233/1234 | ||||
| 13.5. Media Type multipart/byteranges | ||||
| When a 206 (Partial Content) response message includes the content of | ||||
| multiple ranges, they are transmitted as body parts in a multipart | ||||
| message body ([RFC2046], Section 5.1) with the media type of | ||||
| "multipart/byteranges". | ||||
| The multipart/byteranges media type includes one or more body parts, | ||||
| each with its own Content-Type and Content-Range fields. The | ||||
| required boundary parameter specifies the boundary string used to | ||||
| separate each body part. | ||||
| Implementation Notes: | ||||
| 1. Additional CRLFs might precede the first boundary string in the | ||||
| body. | ||||
| 2. Although [RFC2046] permits the boundary string to be quoted, some | ||||
| existing implementations handle a quoted boundary string | ||||
| incorrectly. | ||||
| 3. A number of clients and servers were coded to an early draft of | ||||
| the byteranges specification that used a media type of multipart/ | ||||
| x-byteranges , which is almost (but not quite) compatible with | ||||
| this type. | ||||
| Despite the name, the "multipart/byteranges" media type is not | ||||
| limited to byte ranges. The following example uses an "exampleunit" | ||||
| range unit: | ||||
| HTTP/1.1 206 Partial Content | ||||
| Date: Tue, 14 Nov 1995 06:25:24 GMT | ||||
| Last-Modified: Tue, 14 July 04:58:08 GMT | ||||
| Content-Length: 2331785 | ||||
| Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES | ||||
| --THIS_STRING_SEPARATES | ||||
| Content-Type: video/example | ||||
| Content-Range: exampleunit 1.2-4.3/25 | ||||
| ...the first range... | ||||
| --THIS_STRING_SEPARATES | ||||
| Content-Type: video/example | ||||
| Content-Range: exampleunit 11.2-14.3/25 | ||||
| ...the second range | ||||
| --THIS_STRING_SEPARATES-- | ||||
| The following information serves as the registration form for the | ||||
| multipart/byteranges media type. | ||||
| Type name: multipart | ||||
| Subtype name: byteranges | ||||
| Required parameters: boundary | ||||
| Optional parameters: N/A | ||||
| Encoding considerations: only "7bit", "8bit", or "binary" are | ||||
| permitted | ||||
| Security considerations: see Section 16 | ||||
| Interoperability considerations: N/A | ||||
| Published specification: This specification (see Section 13.5). | ||||
| Applications that use this media type: HTTP components supporting | ||||
| multiple ranges in a single request. | ||||
| Fragment identifier considerations: N/A | ||||
| Additional information: Deprecated alias names for this type: N/A | ||||
| Magic number(s): N/A | ||||
| File extension(s): N/A | ||||
| Macintosh file type code(s): N/A | ||||
| Person and email address to contact for further information: See Aut | ||||
| hors' Addresses section. | ||||
| Intended usage: COMMON | ||||
| Restrictions on usage: N/A | ||||
| Author: See Authors' Addresses section. | ||||
| Change controller: IESG | ||||
| 14. Status Codes | ||||
| The (response) status code is a three-digit integer code giving the | The (response) status code is a three-digit integer code giving the | |||
| result of the attempt to understand and satisfy the request. | result of the attempt to understand and satisfy the request. | |||
| HTTP status codes are extensible. HTTP clients are not required to | HTTP status codes are extensible. HTTP clients are not required to | |||
| understand the meaning of all registered status codes, though such | understand the meaning of all registered status codes, though such | |||
| understanding is obviously desirable. However, a client MUST | understanding is obviously desirable. However, a client MUST | |||
| understand the class of any status code, as indicated by the first | understand the class of any status code, as indicated by the first | |||
| digit, and treat an unrecognized status code as being equivalent to | digit, and treat an unrecognized status code as being equivalent to | |||
| the x00 status code of that class. | the x00 status code of that class. | |||
| skipping to change at page 133, line 5 ¶ | skipping to change at page 142, line 10 ¶ | |||
| fulfilled | fulfilled | |||
| o 5xx (Server Error): The server failed to fulfill an apparently | o 5xx (Server Error): The server failed to fulfill an apparently | |||
| valid request | valid request | |||
| A single request can have multiple associated responses: zero or more | A single request can have multiple associated responses: zero or more | |||
| interim (non-final) responses with status codes in the | interim (non-final) responses with status codes in the | |||
| "informational" (1xx) range, followed by exactly one final response | "informational" (1xx) range, followed by exactly one final response | |||
| with a status code in one of the other ranges. | with a status code in one of the other ranges. | |||
| 10.1. Overview of Status Codes | 14.1. Overview of Status Codes | |||
| The status codes listed below are defined in this specification. The | The status codes listed below are defined in this specification. The | |||
| reason phrases listed here are only recommendations - they can be | reason phrases listed here are only recommendations - they can be | |||
| replaced by local equivalents without affecting the protocol. | replaced by local equivalents without affecting the protocol. | |||
| Responses with status codes that are defined as heuristically | Responses with status codes that are defined as heuristically | |||
| cacheable (e.g., 200, 203, 204, 206, 300, 301, 308, 404, 405, 410, | cacheable (e.g., 200, 203, 204, 206, 300, 301, 308, 404, 405, 410, | |||
| 414, and 501 in this specification) can be reused by a cache with | 414, and 501 in this specification) can be reused by a cache with | |||
| heuristic expiration unless otherwise indicated by the method | heuristic expiration unless otherwise indicated by the method | |||
| definition or explicit cache controls [Caching]; all other status | definition or explicit cache controls [Caching]; all other status | |||
| codes are not heuristically cacheable. | codes are not heuristically cacheable. | |||
| ------- ------------------------------- --------- | Additional status codes, outside the scope of this specification, | |||
| Value Description Ref. | have been specified for use in HTTP. All such status codes ought to | |||
| ------- ------------------------------- --------- | be registered within the "Hypertext Transfer Protocol (HTTP) Status | |||
| 100 Continue 10.2.1 | Code Registry", as described in Section 15.2. | |||
| 101 Switching Protocols 10.2.2 | ||||
| 200 OK 10.3.1 | ||||
| 201 Created 10.3.2 | ||||
| 202 Accepted 10.3.3 | ||||
| 203 Non-Authoritative Information 10.3.4 | ||||
| 204 No Content 10.3.5 | ||||
| 205 Reset Content 10.3.6 | ||||
| 206 Partial Content 10.3.7 | ||||
| 300 Multiple Choices 10.4.1 | ||||
| 301 Moved Permanently 10.4.2 | ||||
| 302 Found 10.4.3 | ||||
| 303 See Other 10.4.4 | ||||
| 304 Not Modified 10.4.5 | ||||
| 305 Use Proxy 10.4.6 | ||||
| 306 (Unused) 10.4.7 | ||||
| 307 Temporary Redirect 10.4.8 | ||||
| 308 Permanent Redirect 10.4.9 | ||||
| 400 Bad Request 10.5.1 | ||||
| 401 Unauthorized 10.5.2 | ||||
| 402 Payment Required 10.5.3 | ||||
| 403 Forbidden 10.5.4 | ||||
| 404 Not Found 10.5.5 | ||||
| 405 Method Not Allowed 10.5.6 | ||||
| 406 Not Acceptable 10.5.7 | ||||
| 407 Proxy Authentication Required 10.5.8 | ||||
| 408 Request Timeout 10.5.9 | ||||
| 409 Conflict 10.5.10 | ||||
| 410 Gone 10.5.11 | ||||
| 411 Length Required 10.5.12 | ||||
| 412 Precondition Failed 10.5.13 | ||||
| 413 Payload Too Large 10.5.14 | ||||
| 414 URI Too Long 10.5.15 | ||||
| 415 Unsupported Media Type 10.5.16 | ||||
| 416 Range Not Satisfiable 10.5.17 | ||||
| 417 Expectation Failed 10.5.18 | ||||
| 418 (Unused) 10.5.19 | ||||
| 422 Unprocessable Payload 10.5.20 | ||||
| 426 Upgrade Required 10.5.21 | ||||
| 500 Internal Server Error 10.6.1 | ||||
| 501 Not Implemented 10.6.2 | ||||
| 502 Bad Gateway 10.6.3 | ||||
| 503 Service Unavailable 10.6.4 | ||||
| 504 Gateway Timeout 10.6.5 | ||||
| 505 HTTP Version Not Supported 10.6.6 | ||||
| ------- ------------------------------- --------- | ||||
| Table 18 | ||||
| Note that this list is not exhaustive - it does not include extension | ||||
| status codes defined in other specifications (Section 10.7). | ||||
| 10.2. Informational 1xx | 14.2. Informational 1xx | |||
| The 1xx (Informational) class of status code indicates an interim | The 1xx (Informational) class of status code indicates an interim | |||
| response for communicating connection status or request progress | response for communicating connection status or request progress | |||
| prior to completing the requested action and sending a final | prior to completing the requested action and sending a final | |||
| response. 1xx responses are terminated by the end of the header | response. 1xx responses are terminated by the end of the header | |||
| section. Since HTTP/1.0 did not define any 1xx status codes, a | section. Since HTTP/1.0 did not define any 1xx status codes, a | |||
| server MUST NOT send a 1xx response to an HTTP/1.0 client. | server MUST NOT send a 1xx response to an HTTP/1.0 client. | |||
| A client MUST be able to parse one or more 1xx responses received | A client MUST be able to parse one or more 1xx responses received | |||
| prior to a final response, even if the client does not expect one. A | prior to a final response, even if the client does not expect one. A | |||
| user agent MAY ignore unexpected 1xx responses. | user agent MAY ignore unexpected 1xx responses. | |||
| A proxy MUST forward 1xx responses unless the proxy itself requested | A proxy MUST forward 1xx responses unless the proxy itself requested | |||
| the generation of the 1xx response. For example, if a proxy adds an | the generation of the 1xx response. For example, if a proxy adds an | |||
| "Expect: 100-continue" field when it forwards a request, then it need | "Expect: 100-continue" field when it forwards a request, then it need | |||
| not forward the corresponding 100 (Continue) response(s). | not forward the corresponding 100 (Continue) response(s). | |||
| 10.2.1. 100 Continue | 14.2.1. 100 Continue | |||
| The 100 (Continue) status code indicates that the initial part of a | The 100 (Continue) status code indicates that the initial part of a | |||
| request has been received and has not yet been rejected by the | request has been received and has not yet been rejected by the | |||
| server. The server intends to send a final response after the | server. The server intends to send a final response after the | |||
| request has been fully received and acted upon. | request has been fully received and acted upon. | |||
| When the request contains an Expect header field that includes a | When the request contains an Expect header field that includes a | |||
| 100-continue expectation, the 100 response indicates that the server | 100-continue expectation, the 100 response indicates that the server | |||
| wishes to receive the request payload body, as described in | wishes to receive the request payload body, as described in | |||
| Section 9.1.1. The client ought to continue sending the request and | Section 9.1.1. The client ought to continue sending the request and | |||
| discard the 100 response. | discard the 100 response. | |||
| If the request did not contain an Expect header field containing the | If the request did not contain an Expect header field containing the | |||
| 100-continue expectation, the client can simply discard this interim | 100-continue expectation, the client can simply discard this interim | |||
| response. | response. | |||
| 10.2.2. 101 Switching Protocols | 14.2.2. 101 Switching Protocols | |||
| The 101 (Switching Protocols) status code indicates that the server | The 101 (Switching Protocols) status code indicates that the server | |||
| understands and is willing to comply with the client's request, via | understands and is willing to comply with the client's request, via | |||
| the Upgrade header field (Section 6.7), for a change in the | the Upgrade header field (Section 6.6), for a change in the | |||
| application protocol being used on this connection. The server MUST | application protocol being used on this connection. The server MUST | |||
| generate an Upgrade header field in the response that indicates which | generate an Upgrade header field in the response that indicates which | |||
| protocol(s) will be switched to immediately after the empty line that | protocol(s) will be switched to immediately after the empty line that | |||
| terminates the 101 response. | terminates the 101 response. | |||
| It is assumed that the server will only agree to switch protocols | It is assumed that the server will only agree to switch protocols | |||
| when it is advantageous to do so. For example, switching to a newer | when it is advantageous to do so. For example, switching to a newer | |||
| version of HTTP might be advantageous over older versions, and | version of HTTP might be advantageous over older versions, and | |||
| switching to a real-time, synchronous protocol might be advantageous | switching to a real-time, synchronous protocol might be advantageous | |||
| when delivering resources that use such features. | when delivering resources that use such features. | |||
| 10.3. Successful 2xx | 14.3. Successful 2xx | |||
| The 2xx (Successful) class of status code indicates that the client's | The 2xx (Successful) class of status code indicates that the client's | |||
| request was successfully received, understood, and accepted. | request was successfully received, understood, and accepted. | |||
| 10.3.1. 200 OK | 14.3.1. 200 OK | |||
| The 200 (OK) status code indicates that the request has succeeded. | The 200 (OK) status code indicates that the request has succeeded. | |||
| The payload sent in a 200 response depends on the request method. | The payload sent in a 200 response depends on the request method. | |||
| For the methods defined by this specification, the intended meaning | For the methods defined by this specification, the intended meaning | |||
| of the payload can be summarized as: | of the payload can be summarized as: | |||
| GET a representation of the target resource; | GET a representation of the target resource; | |||
| HEAD the same representation as GET, but without the representation | HEAD the same representation as GET, but without the representation | |||
| data; | data; | |||
| skipping to change at page 136, line 20 ¶ | skipping to change at page 144, line 20 ¶ | |||
| though an origin server MAY generate a payload body of zero length. | though an origin server MAY generate a payload body of zero length. | |||
| If no payload is desired, an origin server ought to send 204 (No | If no payload is desired, an origin server ought to send 204 (No | |||
| Content) instead. For CONNECT, no payload is allowed because the | Content) instead. For CONNECT, no payload is allowed because the | |||
| successful result is a tunnel, which begins immediately after the 200 | successful result is a tunnel, which begins immediately after the 200 | |||
| response header section. | response header section. | |||
| A 200 response is heuristically cacheable; i.e., unless otherwise | A 200 response is heuristically cacheable; i.e., unless otherwise | |||
| indicated by the method definition or explicit cache controls (see | indicated by the method definition or explicit cache controls (see | |||
| Section 4.2.2 of [Caching]). | Section 4.2.2 of [Caching]). | |||
| 10.3.2. 201 Created | 14.3.2. 201 Created | |||
| The 201 (Created) status code indicates that the request has been | The 201 (Created) status code indicates that the request has been | |||
| fulfilled and has resulted in one or more new resources being | fulfilled and has resulted in one or more new resources being | |||
| created. The primary resource created by the request is identified | created. The primary resource created by the request is identified | |||
| by either a Location header field in the response or, if no Location | by either a Location header field in the response or, if no Location | |||
| field is received, by the target URI. | field is received, by the target URI. | |||
| The 201 response payload typically describes and links to the | The 201 response payload typically describes and links to the | |||
| resource(s) created. See Section 11.2 for a discussion of the | resource(s) created. See Section 7.9 for a discussion of the meaning | |||
| meaning and purpose of validator header fields, such as ETag and | and purpose of validator header fields, such as ETag and | |||
| Last-Modified, in a 201 response. | Last-Modified, in a 201 response. | |||
| 10.3.3. 202 Accepted | 14.3.3. 202 Accepted | |||
| The 202 (Accepted) status code indicates that the request has been | The 202 (Accepted) status code indicates that the request has been | |||
| accepted for processing, but the processing has not been completed. | accepted for processing, but the processing has not been completed. | |||
| The request might or might not eventually be acted upon, as it might | The request might or might not eventually be acted upon, as it might | |||
| be disallowed when processing actually takes place. There is no | be disallowed when processing actually takes place. There is no | |||
| facility in HTTP for re-sending a status code from an asynchronous | facility in HTTP for re-sending a status code from an asynchronous | |||
| operation. | operation. | |||
| The 202 response is intentionally noncommittal. Its purpose is to | The 202 response is intentionally noncommittal. Its purpose is to | |||
| allow a server to accept a request for some other process (perhaps a | allow a server to accept a request for some other process (perhaps a | |||
| batch-oriented process that is only run once per day) without | batch-oriented process that is only run once per day) without | |||
| requiring that the user agent's connection to the server persist | requiring that the user agent's connection to the server persist | |||
| until the process is completed. The representation sent with this | until the process is completed. The representation sent with this | |||
| response ought to describe the request's current status and point to | response ought to describe the request's current status and point to | |||
| (or embed) a status monitor that can provide the user with an | (or embed) a status monitor that can provide the user with an | |||
| estimate of when the request will be fulfilled. | estimate of when the request will be fulfilled. | |||
| 10.3.4. 203 Non-Authoritative Information | 14.3.4. 203 Non-Authoritative Information | |||
| The 203 (Non-Authoritative Information) status code indicates that | The 203 (Non-Authoritative Information) status code indicates that | |||
| the request was successful but the enclosed payload has been modified | the request was successful but the enclosed payload has been modified | |||
| from that of the origin server's 200 (OK) response by a transforming | from that of the origin server's 200 (OK) response by a transforming | |||
| proxy (Section 6.6.2). This status code allows the proxy to notify | proxy (Section 6.5). This status code allows the proxy to notify | |||
| recipients when a transformation has been applied, since that | recipients when a transformation has been applied, since that | |||
| knowledge might impact later decisions regarding the content. For | knowledge might impact later decisions regarding the content. For | |||
| example, future cache validation requests for the content might only | example, future cache validation requests for the content might only | |||
| be applicable along the same request path (through the same proxies). | be applicable along the same request path (through the same proxies). | |||
| The 203 response is similar to the Warning code of 214 Transformation | The 203 response is similar to the Warning code of 214 Transformation | |||
| Applied (Section 5.5 of [Caching]), which has the advantage of being | Applied (Section 5.5 of [Caching]), which has the advantage of being | |||
| applicable to responses with any status code. | applicable to responses with any status code. | |||
| A 203 response is heuristically cacheable; i.e., unless otherwise | A 203 response is heuristically cacheable; i.e., unless otherwise | |||
| indicated by the method definition or explicit cache controls (see | indicated by the method definition or explicit cache controls (see | |||
| Section 4.2.2 of [Caching]). | Section 4.2.2 of [Caching]). | |||
| 10.3.5. 204 No Content | 14.3.5. 204 No Content | |||
| The 204 (No Content) status code indicates that the server has | The 204 (No Content) status code indicates that the server has | |||
| successfully fulfilled the request and that there is no additional | successfully fulfilled the request and that there is no additional | |||
| content to send in the response payload body. Metadata in the | content to send in the response payload body. Metadata in the | |||
| response header fields refer to the target resource and its selected | response header fields refer to the target resource and its selected | |||
| representation after the requested action was applied. | representation after the requested action was applied. | |||
| For example, if a 204 status code is received in response to a PUT | For example, if a 204 status code is received in response to a PUT | |||
| request and the response contains an ETag field, then the PUT was | request and the response contains an ETag field, then the PUT was | |||
| successful and the ETag field value contains the entity-tag for the | successful and the ETag field value contains the entity-tag for the | |||
| skipping to change at page 138, line 9 ¶ | skipping to change at page 146, line 9 ¶ | |||
| frequently used with interfaces that expect automated data transfers | frequently used with interfaces that expect automated data transfers | |||
| to be prevalent, such as within distributed version control systems. | to be prevalent, such as within distributed version control systems. | |||
| A 204 response is terminated by the first empty line after the header | A 204 response is terminated by the first empty line after the header | |||
| fields because it cannot contain a message body. | fields because it cannot contain a message body. | |||
| A 204 response is heuristically cacheable; i.e., unless otherwise | A 204 response is heuristically cacheable; i.e., unless otherwise | |||
| indicated by the method definition or explicit cache controls (see | indicated by the method definition or explicit cache controls (see | |||
| Section 4.2.2 of [Caching]). | Section 4.2.2 of [Caching]). | |||
| 10.3.6. 205 Reset Content | 14.3.6. 205 Reset Content | |||
| The 205 (Reset Content) status code indicates that the server has | The 205 (Reset Content) status code indicates that the server has | |||
| fulfilled the request and desires that the user agent reset the | fulfilled the request and desires that the user agent reset the | |||
| "document view", which caused the request to be sent, to its original | "document view", which caused the request to be sent, to its original | |||
| state as received from the origin server. | state as received from the origin server. | |||
| This response is intended to support a common data entry use case | This response is intended to support a common data entry use case | |||
| where the user receives content that supports data entry (a form, | where the user receives content that supports data entry (a form, | |||
| notepad, canvas, etc.), enters or manipulates data in that space, | notepad, canvas, etc.), enters or manipulates data in that space, | |||
| causes the entered data to be submitted in a request, and then the | causes the entered data to be submitted in a request, and then the | |||
| data entry mechanism is reset for the next entry so that the user can | data entry mechanism is reset for the next entry so that the user can | |||
| easily initiate another input action. | easily initiate another input action. | |||
| Since the 205 status code implies that no additional content will be | Since the 205 status code implies that no additional content will be | |||
| provided, a server MUST NOT generate a payload in a 205 response. | provided, a server MUST NOT generate a payload in a 205 response. | |||
| 10.3.7. 206 Partial Content | 14.3.7. 206 Partial Content | |||
| The 206 (Partial Content) status code indicates that the server is | The 206 (Partial Content) status code indicates that the server is | |||
| successfully fulfilling a range request for the target resource by | successfully fulfilling a range request for the target resource by | |||
| transferring one or more parts of the selected representation. | transferring one or more parts of the selected representation. | |||
| When a 206 response is generated, the server MUST generate the | When a 206 response is generated, the server MUST generate the | |||
| following header fields, in addition to those required in the | following header fields, in addition to those required in the | |||
| subsections below, if the field would have been sent in a 200 (OK) | subsections below, if the field would have been sent in a 200 (OK) | |||
| response to the same request: Date, Cache-Control, ETag, Expires, | response to the same request: Date, Cache-Control, ETag, Expires, | |||
| Content-Location, and Vary. | Content-Location, and Vary. | |||
| skipping to change at page 139, line 9 ¶ | skipping to change at page 147, line 9 ¶ | |||
| header fields beyond those required, because the client is understood | header fields beyond those required, because the client is understood | |||
| to already have a prior response containing those header fields. | to already have a prior response containing those header fields. | |||
| Otherwise, the sender MUST generate all of the representation header | Otherwise, the sender MUST generate all of the representation header | |||
| fields that would have been sent in a 200 (OK) response to the same | fields that would have been sent in a 200 (OK) response to the same | |||
| request. | request. | |||
| A 206 response is heuristically cacheable; i.e., unless otherwise | A 206 response is heuristically cacheable; i.e., unless otherwise | |||
| indicated by explicit cache controls (see Section 4.2.2 of | indicated by explicit cache controls (see Section 4.2.2 of | |||
| [Caching]). | [Caching]). | |||
| 10.3.7.1. Single Part | 14.3.7.1. Single Part | |||
| If a single part is being transferred, the server generating the 206 | If a single part is being transferred, the server generating the 206 | |||
| response MUST generate a Content-Range header field, describing what | response MUST generate a Content-Range header field, describing what | |||
| range of the selected representation is enclosed, and a payload | range of the selected representation is enclosed, and a payload | |||
| consisting of the range. For example: | consisting of the range. For example: | |||
| HTTP/1.1 206 Partial Content | HTTP/1.1 206 Partial Content | |||
| Date: Wed, 15 Nov 1995 06:25:24 GMT | Date: Wed, 15 Nov 1995 06:25:24 GMT | |||
| Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT | Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT | |||
| Content-Range: bytes 21010-47021/47022 | Content-Range: bytes 21010-47021/47022 | |||
| Content-Length: 26012 | Content-Length: 26012 | |||
| Content-Type: image/gif | Content-Type: image/gif | |||
| ... 26012 bytes of partial image data ... | ... 26012 bytes of partial image data ... | |||
| 10.3.7.2. Multiple Parts | 14.3.7.2. Multiple Parts | |||
| If multiple parts are being transferred, the server generating the | If multiple parts are being transferred, the server generating the | |||
| 206 response MUST generate a "multipart/byteranges" payload, as | 206 response MUST generate a "multipart/byteranges" payload, as | |||
| defined in Section 7.3.5, and a Content-Type header field containing | defined in Section 13.5, and a Content-Type header field containing | |||
| the multipart/byteranges media type and its required boundary | the multipart/byteranges media type and its required boundary | |||
| parameter. To avoid confusion with single-part responses, a server | parameter. To avoid confusion with single-part responses, a server | |||
| MUST NOT generate a Content-Range header field in the HTTP header | MUST NOT generate a Content-Range header field in the HTTP header | |||
| section of a multiple part response (this field will be sent in each | section of a multiple part response (this field will be sent in each | |||
| part instead). | part instead). | |||
| Within the header area of each body part in the multipart payload, | Within the header area of each body part in the multipart payload, | |||
| the server MUST generate a Content-Range header field corresponding | the server MUST generate a Content-Range header field corresponding | |||
| to the range being enclosed in that body part. If the selected | to the range being enclosed in that body part. If the selected | |||
| representation would have had a Content-Type header field in a 200 | representation would have had a Content-Type header field in a 200 | |||
| skipping to change at page 141, line 5 ¶ | skipping to change at page 149, line 5 ¶ | |||
| When a multipart response payload is generated, the server SHOULD | When a multipart response payload is generated, the server SHOULD | |||
| send the parts in the same order that the corresponding range-spec | send the parts in the same order that the corresponding range-spec | |||
| appeared in the received Range header field, excluding those ranges | appeared in the received Range header field, excluding those ranges | |||
| that were deemed unsatisfiable or that were coalesced into other | that were deemed unsatisfiable or that were coalesced into other | |||
| ranges. A client that receives a multipart response MUST inspect the | ranges. A client that receives a multipart response MUST inspect the | |||
| Content-Range header field present in each body part in order to | Content-Range header field present in each body part in order to | |||
| determine which range is contained in that body part; a client cannot | determine which range is contained in that body part; a client cannot | |||
| rely on receiving the same ranges that it requested, nor the same | rely on receiving the same ranges that it requested, nor the same | |||
| order that it requested. | order that it requested. | |||
| 10.3.7.3. Combining Parts | 14.3.7.3. Combining Parts | |||
| A response might transfer only a subrange of a representation if the | A response might transfer only a subrange of a 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 specifications. After several such transfers, a client might | Range specifications. After several such transfers, a client might | |||
| have received several ranges of the same representation. These | have received several ranges of the same representation. These | |||
| ranges can only be safely combined if they all have in common the | ranges can only be safely combined if they all have in common the | |||
| same strong validator (Section 11.2.1). | same strong validator (Section 7.9.1). | |||
| A client that has received multiple partial responses to GET requests | A client that has received multiple partial responses to GET requests | |||
| on a target resource MAY combine those responses into a larger | on a target resource MAY combine those responses into a larger | |||
| continuous range if they share the same strong validator. | continuous range if they share the same strong validator. | |||
| If the most recent response is an incomplete 200 (OK) response, then | If the most recent response is an incomplete 200 (OK) response, then | |||
| the header fields of that response are used for any combined response | the header fields of that response are used for any combined response | |||
| and replace those of the matching stored responses. | and replace those of the matching stored responses. | |||
| If the most recent response is a 206 (Partial Content) response and | If the most recent response is a 206 (Partial Content) response and | |||
| skipping to change at page 141, line 46 ¶ | skipping to change at page 149, line 46 ¶ | |||
| representation, then the client MUST process the combined response as | representation, then the client MUST process the combined response as | |||
| if it were a complete 200 (OK) response, including a Content-Length | if it were a complete 200 (OK) response, including a Content-Length | |||
| header field that reflects the complete length. Otherwise, the | header field that reflects the complete length. Otherwise, the | |||
| client MUST process the set of continuous ranges as one of the | client MUST process the set of continuous ranges as one of the | |||
| following: an incomplete 200 (OK) response if the combined response | following: an incomplete 200 (OK) response if the combined response | |||
| is a prefix of the representation, a single 206 (Partial Content) | is a prefix of the representation, a single 206 (Partial Content) | |||
| response containing a multipart/byteranges body, or multiple 206 | response containing a multipart/byteranges body, or multiple 206 | |||
| (Partial Content) responses, each with one continuous range that is | (Partial Content) responses, each with one continuous range that is | |||
| indicated by a Content-Range header field. | indicated by a Content-Range header field. | |||
| 10.4. Redirection 3xx | 14.4. Redirection 3xx | |||
| The 3xx (Redirection) class of status code indicates that further | The 3xx (Redirection) class of status code indicates that further | |||
| action needs to be taken by the user agent in order to fulfill the | action needs to be taken by the user agent in order to fulfill the | |||
| request. There are several types of redirects: | request. There are several types of redirects: | |||
| 1. Redirects that indicate this resource might be available at a | 1. Redirects that indicate this resource might be available at a | |||
| different URI, as provided by the Location field, as in the | different URI, as provided by the Location field, as in the | |||
| status codes 301 (Moved Permanently), 302 (Found), 307 (Temporary | status codes 301 (Moved Permanently), 302 (Found), 307 (Temporary | |||
| Redirect), and 308 (Permanent Redirect). | Redirect), and 308 (Permanent Redirect). | |||
| skipping to change at page 142, line 21 ¶ | skipping to change at page 150, line 21 ¶ | |||
| of representing this resource, as in the 300 (Multiple Choices) | of representing this resource, as in the 300 (Multiple Choices) | |||
| status code. | status code. | |||
| 3. Redirection to a different resource, identified by the Location | 3. Redirection to a different resource, identified by the Location | |||
| field, that can represent an indirect response to the request, as | field, that can represent an indirect response to the request, as | |||
| in the 303 (See Other) status code. | in the 303 (See Other) status code. | |||
| 4. Redirection to a previously stored result, as in the 304 (Not | 4. Redirection to a previously stored result, as in the 304 (Not | |||
| Modified) status code. | Modified) status code. | |||
| If a Location header field (Section 11.1.2) is provided, the user | If a Location header field (Section 9.2.3) is provided, the user | |||
| agent MAY automatically redirect its request to the URI referenced by | agent MAY automatically redirect its request to the URI referenced by | |||
| the Location field value, even if the specific status code is not | the Location field value, even if the specific status code is not | |||
| understood. Automatic redirection needs to be done with care for | understood. Automatic redirection needs to be done with care for | |||
| methods not known to be safe, as defined in Section 8.2.1, since the | methods not known to be safe, as defined in Section 8.2.1, since the | |||
| user might not wish to redirect an unsafe request. | user might not wish to redirect an unsafe request. | |||
| When automatically following a redirected request, the user agent | When automatically following a redirected request, the user agent | |||
| SHOULD resend the original request message with the following | SHOULD resend the original request message with the following | |||
| modifications: | modifications: | |||
| 1. Replace the target URI with the URI referenced by the redirection | 1. Replace the target URI with the URI referenced by the redirection | |||
| response's Location header field value after resolving it | response's Location header field value after resolving it | |||
| relative to the original request's target URI. | relative to the original request's target URI. | |||
| 2. Remove header fields that were automatically generated by the | 2. Remove header fields that were automatically generated by the | |||
| implementation, replacing them with updated values as appropriate | implementation, replacing them with updated values as appropriate | |||
| to the new request. This includes: | to the new request. This includes: | |||
| 1. Connection-specific header fields (see Section 6.8), | 1. Connection-specific header fields (see Section 6.4.1), | |||
| 2. Header fields specific to the client's proxy configuration, | 2. Header fields specific to the client's proxy configuration, | |||
| including (but not limited to) Proxy-Authorization, | including (but not limited to) Proxy-Authorization, | |||
| 3. Origin-specific header fields (if any), including (but not | 3. Origin-specific header fields (if any), including (but not | |||
| limited to) Host, | limited to) Host, | |||
| 4. Validating header fields that were added by the | 4. Validating header fields that were added by the | |||
| implementation's cache (e.g., If-None-Match, | implementation's cache (e.g., If-None-Match, | |||
| If-Modified-Since), | If-Modified-Since), | |||
| skipping to change at page 144, line 5 ¶ | skipping to change at page 152, line 5 ¶ | |||
| | behavior conformant when the original request is POST. | | behavior conformant when the original request is POST. | |||
| A client SHOULD detect and intervene in cyclical redirections (i.e., | A client SHOULD detect and intervene in cyclical redirections (i.e., | |||
| "infinite" redirection loops). | "infinite" redirection loops). | |||
| | *Note:* An earlier version of this specification recommended a | | *Note:* An earlier version of this specification recommended a | |||
| | maximum of five redirections ([RFC2068], Section 10.3). | | maximum of five redirections ([RFC2068], Section 10.3). | |||
| | Content developers need to be aware that some clients might | | Content developers need to be aware that some clients might | |||
| | implement such a fixed limitation. | | implement such a fixed limitation. | |||
| 10.4.1. 300 Multiple Choices | 14.4.1. 300 Multiple Choices | |||
| The 300 (Multiple Choices) status code indicates that the target | The 300 (Multiple Choices) status code indicates that the target | |||
| resource has more than one representation, each with its own more | resource has more than one representation, each with its own more | |||
| specific identifier, and information about the alternatives is being | specific identifier, and information about the alternatives is being | |||
| provided so that the user (or user agent) can select a preferred | provided so that the user (or user agent) can select a preferred | |||
| representation by redirecting its request to one or more of those | representation by redirecting its request to one or more of those | |||
| identifiers. In other words, the server desires that the user agent | identifiers. In other words, the server desires that the user agent | |||
| engage in reactive negotiation to select the most appropriate | engage in reactive negotiation to select the most appropriate | |||
| representation(s) for its needs (Section 7.4). | representation(s) for its needs (Section 11). | |||
| If the server has a preferred choice, the server SHOULD generate a | If the server has a preferred choice, the server SHOULD generate a | |||
| Location header field containing a preferred choice's URI reference. | Location header field containing a preferred choice's URI reference. | |||
| The user agent MAY use the Location field value for automatic | The user agent MAY use the Location field value for automatic | |||
| redirection. | redirection. | |||
| For request methods other than HEAD, the server SHOULD generate a | For request methods other than HEAD, the server SHOULD generate a | |||
| payload in the 300 response containing a list of representation | payload in the 300 response containing a list of representation | |||
| metadata and URI reference(s) from which the user or user agent can | metadata and URI reference(s) from which the user or user agent can | |||
| choose the one most preferred. The user agent MAY make a selection | choose the one most preferred. The user agent MAY make a selection | |||
| skipping to change at page 145, line 5 ¶ | skipping to change at page 153, line 5 ¶ | |||
| | the URI header field as providing a list of alternative | | the URI header field as providing a list of alternative | |||
| | representations, such that it would be usable for 200, 300, and | | representations, such that it would be usable for 200, 300, and | |||
| | 406 responses and be transferred in responses to the HEAD | | 406 responses and be transferred in responses to the HEAD | |||
| | method. However, lack of deployment and disagreement over | | method. However, lack of deployment and disagreement over | |||
| | syntax led to both URI and Alternates (a subsequent proposal) | | syntax led to both URI and Alternates (a subsequent proposal) | |||
| | being dropped from this specification. It is possible to | | being dropped from this specification. It is possible to | |||
| | communicate the list as a Link header field value [RFC8288] | | communicate the list as a Link header field value [RFC8288] | |||
| | whose members have a relationship of "alternate", though | | whose members have a relationship of "alternate", though | |||
| | deployment is a chicken-and-egg problem. | | deployment is a chicken-and-egg problem. | |||
| 10.4.2. 301 Moved Permanently | 14.4.2. 301 Moved Permanently | |||
| The 301 (Moved Permanently) status code indicates that the target | The 301 (Moved Permanently) status code indicates that the target | |||
| resource has been assigned a new permanent URI and any future | resource has been assigned a new permanent URI and any future | |||
| references to this resource ought to use one of the enclosed URIs. | references to this resource ought to use one of the enclosed URIs. | |||
| Clients with link-editing capabilities ought to automatically re-link | Clients with link-editing capabilities ought to automatically re-link | |||
| references to the target URI to one or more of the new references | references to the target URI to one or more of the new references | |||
| sent by the server, where possible. | sent by the server, where possible. | |||
| The server SHOULD generate a Location header field in the response | The server SHOULD generate a Location header field in the response | |||
| containing a preferred URI reference for the new permanent URI. The | containing a preferred URI reference for the new permanent URI. The | |||
| skipping to change at page 145, line 29 ¶ | skipping to change at page 153, line 29 ¶ | |||
| | *Note:* For historical reasons, a user agent MAY change the | | *Note:* For historical reasons, a user agent MAY change the | |||
| | request method from POST to GET for the subsequent request. If | | request method from POST to GET for the subsequent request. If | |||
| | this behavior is undesired, the 308 (Permanent Redirect) status | | this behavior is undesired, the 308 (Permanent Redirect) status | |||
| | code can be used instead. | | code can be used instead. | |||
| A 301 response is heuristically cacheable; i.e., unless otherwise | A 301 response is heuristically cacheable; i.e., unless otherwise | |||
| indicated by the method definition or explicit cache controls (see | indicated by the method definition or explicit cache controls (see | |||
| Section 4.2.2 of [Caching]). | Section 4.2.2 of [Caching]). | |||
| 10.4.3. 302 Found | 14.4.3. 302 Found | |||
| The 302 (Found) status code indicates that the target resource | The 302 (Found) status code indicates that the target resource | |||
| resides temporarily under a different URI. Since the redirection | resides temporarily under a different URI. Since the redirection | |||
| might be altered on occasion, the client ought to continue to use the | might be altered on occasion, the client ought to continue to use the | |||
| target URI for future requests. | target URI for future requests. | |||
| The server SHOULD generate a Location header field in the response | The server SHOULD generate a Location header field in the response | |||
| containing a URI reference for the different URI. The user agent MAY | containing a URI reference for the different URI. The user agent MAY | |||
| use the Location field value for automatic redirection. The server's | use the Location field value for automatic redirection. The server's | |||
| response payload usually contains a short hypertext note with a | response payload usually contains a short hypertext note with a | |||
| hyperlink to the different URI(s). | hyperlink to the different URI(s). | |||
| | *Note:* For historical reasons, a user agent MAY change the | | *Note:* For historical reasons, a user agent MAY change the | |||
| | request method from POST to GET for the subsequent request. If | | request method from POST to GET for the subsequent request. If | |||
| | this behavior is undesired, the 307 (Temporary Redirect) status | | this behavior is undesired, the 307 (Temporary Redirect) status | |||
| | code can be used instead. | | code can be used instead. | |||
| 10.4.4. 303 See Other | 14.4.4. 303 See Other | |||
| The 303 (See Other) status code indicates that the server is | The 303 (See Other) status code indicates that the server is | |||
| redirecting the user agent to a different resource, as indicated by a | redirecting the user agent to a different resource, as indicated by a | |||
| URI in the Location header field, which is intended to provide an | URI in the Location header field, which is intended to provide an | |||
| indirect response to the original request. A user agent can perform | indirect response to the original request. A user agent can perform | |||
| a retrieval request targeting that URI (a GET or HEAD request if | a retrieval request targeting that URI (a GET or HEAD request if | |||
| using HTTP), which might also be redirected, and present the eventual | using HTTP), which might also be redirected, and present the eventual | |||
| result as an answer to the original request. Note that the new URI | result as an answer to the original request. Note that the new URI | |||
| in the Location header field is not considered equivalent to the | in the Location header field is not considered equivalent to the | |||
| target URI. | target URI. | |||
| skipping to change at page 146, line 39 ¶ | skipping to change at page 154, line 39 ¶ | |||
| might result in a representation that is useful to recipients without | might result in a representation that is useful to recipients without | |||
| implying that it represents the original target resource. Note that | implying that it represents the original target resource. Note that | |||
| answers to the questions of what can be represented, what | answers to the questions of what can be represented, what | |||
| representations are adequate, and what might be a useful description | representations are adequate, and what might be a useful description | |||
| are outside the scope of HTTP. | are outside the scope of HTTP. | |||
| Except for responses to a HEAD request, the representation of a 303 | Except for responses to a HEAD request, the representation of a 303 | |||
| response ought to contain a short hypertext note with a hyperlink to | response ought to contain a short hypertext note with a hyperlink to | |||
| the same URI reference provided in the Location header field. | the same URI reference provided in the Location header field. | |||
| 10.4.5. 304 Not Modified | 14.4.5. 304 Not Modified | |||
| The 304 (Not Modified) status code indicates that a conditional GET | The 304 (Not Modified) status code indicates that a conditional GET | |||
| or HEAD request has been received and would have resulted in a 200 | or HEAD request has been received and would have resulted in a 200 | |||
| (OK) response if it were not for the fact that the condition | (OK) response if it were not for the fact that the condition | |||
| evaluated to false. In other words, there is no need for the server | evaluated to false. In other words, there is no need for the server | |||
| to transfer a representation of the target resource because the | to transfer a representation of the target resource because the | |||
| request indicates that the client, which made the request | request indicates that the client, which made the request | |||
| conditional, already has a valid representation; the server is | conditional, already has a valid representation; the server is | |||
| therefore redirecting the client to make use of that stored | therefore redirecting the client to make use of that stored | |||
| representation as if it were the payload of a 200 (OK) response. | representation as if it were the payload of a 200 (OK) response. | |||
| skipping to change at page 147, line 26 ¶ | skipping to change at page 155, line 26 ¶ | |||
| Requirements on a cache that receives a 304 response are defined in | Requirements on a cache that receives a 304 response are defined in | |||
| Section 4.3.4 of [Caching]. If the conditional request originated | Section 4.3.4 of [Caching]. If the conditional request originated | |||
| with an outbound client, such as a user agent with its own cache | with an outbound client, such as a user agent with its own cache | |||
| sending a conditional GET to a shared proxy, then the proxy SHOULD | sending a conditional GET to a shared proxy, then the proxy SHOULD | |||
| forward the 304 response to that client. | forward the 304 response to that client. | |||
| A 304 response cannot contain a message-body; it is always terminated | A 304 response cannot contain a message-body; it is always terminated | |||
| by the first empty line after the header fields. | by the first empty line after the header fields. | |||
| 10.4.6. 305 Use Proxy | 14.4.6. 305 Use Proxy | |||
| The 305 (Use Proxy) status code was defined in a previous version of | The 305 (Use Proxy) status code was defined in a previous version of | |||
| this specification and is now deprecated (Appendix B of [RFC7231]). | this specification and is now deprecated (Appendix B of [RFC7231]). | |||
| 10.4.7. 306 (Unused) | 14.4.7. 306 (Unused) | |||
| The 306 status code was defined in a previous version of this | The 306 status code was defined in a previous version of this | |||
| specification, is no longer used, and the code is reserved. | specification, is no longer used, and the code is reserved. | |||
| 10.4.8. 307 Temporary Redirect | 14.4.8. 307 Temporary Redirect | |||
| The 307 (Temporary Redirect) status code indicates that the target | The 307 (Temporary Redirect) status code indicates that the target | |||
| resource resides temporarily under a different URI and the user agent | resource resides temporarily under a different URI and the user agent | |||
| MUST NOT change the request method if it performs an automatic | MUST NOT change the request method if it performs an automatic | |||
| redirection to that URI. Since the redirection can change over time, | redirection to that URI. Since the redirection can change over time, | |||
| the client ought to continue using the original target URI for future | the client ought to continue using the original target URI for future | |||
| requests. | requests. | |||
| The server SHOULD generate a Location header field in the response | The server SHOULD generate a Location header field in the response | |||
| containing a URI reference for the different URI. The user agent MAY | containing a URI reference for the different URI. The user agent MAY | |||
| use the Location field value for automatic redirection. The server's | use the Location field value for automatic redirection. The server's | |||
| response payload usually contains a short hypertext note with a | response payload usually contains a short hypertext note with a | |||
| hyperlink to the different URI(s). | hyperlink to the different URI(s). | |||
| 10.4.9. 308 Permanent Redirect | 14.4.9. 308 Permanent Redirect | |||
| The 308 (Permanent Redirect) status code indicates that the target | The 308 (Permanent Redirect) status code indicates that the target | |||
| resource has been assigned a new permanent URI and any future | resource has been assigned a new permanent URI and any future | |||
| references to this resource ought to use one of the enclosed URIs. | references to this resource ought to use one of the enclosed URIs. | |||
| Clients with link editing capabilities ought to automatically re-link | Clients with link editing capabilities ought to automatically re-link | |||
| references to the target URI to one or more of the new references | references to the target URI to one or more of the new references | |||
| sent by the server, where possible. | sent by the server, where possible. | |||
| The server SHOULD generate a Location header field in the response | The server SHOULD generate a Location header field in the response | |||
| containing a preferred URI reference for the new permanent URI. The | containing a preferred URI reference for the new permanent URI. The | |||
| skipping to change at page 148, line 28 ¶ | skipping to change at page 156, line 28 ¶ | |||
| hypertext note with a hyperlink to the new URI(s). | hypertext note with a hyperlink to the new URI(s). | |||
| A 308 response is heuristically cacheable; i.e., unless otherwise | A 308 response is heuristically cacheable; i.e., unless otherwise | |||
| indicated by the method definition or explicit cache controls (see | indicated by the method definition or explicit cache controls (see | |||
| Section 4.2.2 of [Caching]). | Section 4.2.2 of [Caching]). | |||
| | *Note:* This status code is much younger (June 2014) than its | | *Note:* This status code is much younger (June 2014) than its | |||
| | sibling codes, and thus might not be recognized everywhere. | | sibling codes, and thus might not be recognized everywhere. | |||
| | See Section 4 of [RFC7538] for deployment considerations. | | See Section 4 of [RFC7538] for deployment considerations. | |||
| 10.5. Client Error 4xx | 14.5. Client Error 4xx | |||
| The 4xx (Client Error) class of status code indicates that the client | The 4xx (Client Error) class of status code indicates that the client | |||
| seems to have erred. Except when responding to a HEAD request, the | seems to have erred. Except when responding to a HEAD request, the | |||
| server SHOULD send a representation containing an explanation of the | server SHOULD send a representation containing an explanation of the | |||
| error situation, and whether it is a temporary or permanent | error situation, and whether it is a temporary or permanent | |||
| condition. These status codes are applicable to any request method. | condition. These status codes are applicable to any request method. | |||
| User agents SHOULD display any included representation to the user. | User agents SHOULD display any included representation to the user. | |||
| 10.5.1. 400 Bad Request | 14.5.1. 400 Bad Request | |||
| The 400 (Bad Request) status code indicates that the server cannot or | The 400 (Bad Request) status code indicates that the server cannot or | |||
| will not process the request due to something that is perceived to be | will not process the request due to something that is perceived to be | |||
| a client error (e.g., malformed request syntax, invalid request | a client error (e.g., malformed request syntax, invalid request | |||
| message framing, or deceptive request routing). | message framing, or deceptive request routing). | |||
| 10.5.2. 401 Unauthorized | 14.5.2. 401 Unauthorized | |||
| The 401 (Unauthorized) status code indicates that the request has not | The 401 (Unauthorized) status code indicates that the request has not | |||
| been applied because it lacks valid authentication credentials for | been applied because it lacks valid authentication credentials for | |||
| the target resource. The server generating a 401 response MUST send | the target resource. The server generating a 401 response MUST send | |||
| a WWW-Authenticate header field (Section 11.3.1) containing at least | a WWW-Authenticate header field (Section 10.6.1) containing at least | |||
| one challenge applicable to the target resource. | one challenge applicable to the target resource. | |||
| If the request included authentication credentials, then the 401 | If the request included authentication credentials, then the 401 | |||
| response indicates that authorization has been refused for those | response indicates that authorization has been refused for those | |||
| credentials. The user agent MAY repeat the request with a new or | credentials. The user agent MAY repeat the request with a new or | |||
| replaced Authorization header field (Section 9.5.3). If the 401 | replaced Authorization header field (Section 10.6.2). If the 401 | |||
| response contains the same challenge as the prior response, and the | response contains the same challenge as the prior response, and the | |||
| user agent has already attempted authentication at least once, then | user agent has already attempted authentication at least once, then | |||
| the user agent SHOULD present the enclosed representation to the | the user agent SHOULD present the enclosed representation to the | |||
| user, since it usually contains relevant diagnostic information. | user, since it usually contains relevant diagnostic information. | |||
| 10.5.3. 402 Payment Required | 14.5.3. 402 Payment Required | |||
| The 402 (Payment Required) status code is reserved for future use. | The 402 (Payment Required) status code is reserved for future use. | |||
| 10.5.4. 403 Forbidden | 14.5.4. 403 Forbidden | |||
| The 403 (Forbidden) status code indicates that the server understood | The 403 (Forbidden) status code indicates that the server understood | |||
| the request but refuses to fulfill it. A server that wishes to make | the request but refuses to fulfill it. A server that wishes to make | |||
| public why the request has been forbidden can describe that reason in | public why the request has been forbidden can describe that reason in | |||
| the response payload (if any). | the response payload (if any). | |||
| If authentication credentials were provided in the request, the | If authentication credentials were provided in the request, the | |||
| server considers them insufficient to grant access. The client | server considers them insufficient to grant access. The client | |||
| SHOULD NOT automatically repeat the request with the same | SHOULD NOT automatically repeat the request with the same | |||
| credentials. The client MAY repeat the request with new or different | credentials. The client MAY repeat the request with new or different | |||
| credentials. However, a request might be forbidden for reasons | credentials. However, a request might be forbidden for reasons | |||
| unrelated to the credentials. | unrelated to the credentials. | |||
| An origin server that wishes to "hide" the current existence of a | An origin server that wishes to "hide" the current existence of a | |||
| forbidden target resource MAY instead respond with a status code of | forbidden target resource MAY instead respond with a status code of | |||
| 404 (Not Found). | 404 (Not Found). | |||
| 10.5.5. 404 Not Found | 14.5.5. 404 Not Found | |||
| The 404 (Not Found) status code indicates that the origin server did | The 404 (Not Found) status code indicates that the origin server did | |||
| not find a current representation for the target resource or is not | not find a current representation for the target resource or is not | |||
| willing to disclose that one exists. A 404 status code does not | willing to disclose that one exists. A 404 status code does not | |||
| indicate whether this lack of representation is temporary or | indicate whether this lack of representation is temporary or | |||
| permanent; the 410 (Gone) status code is preferred over 404 if the | permanent; the 410 (Gone) status code is preferred over 404 if the | |||
| origin server knows, presumably through some configurable means, that | origin server knows, presumably through some configurable means, that | |||
| the condition is likely to be permanent. | the condition is likely to be permanent. | |||
| A 404 response is heuristically cacheable; i.e., unless otherwise | A 404 response is heuristically cacheable; i.e., unless otherwise | |||
| indicated by the method definition or explicit cache controls (see | indicated by the method definition or explicit cache controls (see | |||
| Section 4.2.2 of [Caching]). | Section 4.2.2 of [Caching]). | |||
| 10.5.6. 405 Method Not Allowed | 14.5.6. 405 Method Not Allowed | |||
| The 405 (Method Not Allowed) status code indicates that the method | The 405 (Method Not Allowed) status code indicates that the method | |||
| received in the request-line is known by the origin server but not | received in the request-line is known by the origin server but not | |||
| supported by the target resource. The origin server MUST generate an | supported by the target resource. The origin server MUST generate an | |||
| Allow header field in a 405 response containing a list of the target | Allow header field in a 405 response containing a list of the target | |||
| resource's currently supported methods. | resource's currently supported methods. | |||
| A 405 response is heuristically cacheable; i.e., unless otherwise | A 405 response is heuristically cacheable; i.e., unless otherwise | |||
| indicated by the method definition or explicit cache controls (see | indicated by the method definition or explicit cache controls (see | |||
| Section 4.2.2 of [Caching]). | Section 4.2.2 of [Caching]). | |||
| 10.5.7. 406 Not Acceptable | 14.5.7. 406 Not Acceptable | |||
| The 406 (Not Acceptable) status code indicates that the target | The 406 (Not Acceptable) status code indicates that the target | |||
| resource does not have a current representation that would be | resource does not have a current representation that would be | |||
| acceptable to the user agent, according to the proactive negotiation | acceptable to the user agent, according to the proactive negotiation | |||
| header fields received in the request (Section 9.4), and the server | header fields received in the request (Section 11.1), and the server | |||
| is unwilling to supply a default representation. | is unwilling to supply a default representation. | |||
| The server SHOULD generate a payload containing a list of available | The server SHOULD generate a payload containing a list of available | |||
| representation characteristics and corresponding resource identifiers | representation characteristics and corresponding resource identifiers | |||
| from which the user or user agent can choose the one most | from which the user or user agent can choose the one most | |||
| appropriate. A user agent MAY automatically select the most | appropriate. A user agent MAY automatically select the most | |||
| appropriate choice from that list. However, this specification does | appropriate choice from that list. However, this specification does | |||
| not define any standard for such automatic selection, as described in | not define any standard for such automatic selection, as described in | |||
| Section 10.4.1. | Section 14.4.1. | |||
| 10.5.8. 407 Proxy Authentication Required | 14.5.8. 407 Proxy Authentication Required | |||
| The 407 (Proxy Authentication Required) status code is similar to 401 | The 407 (Proxy Authentication Required) status code is similar to 401 | |||
| (Unauthorized), but it indicates that the client needs to | (Unauthorized), but it indicates that the client needs to | |||
| authenticate itself in order to use a proxy for this request. The | authenticate itself in order to use a proxy for this request. The | |||
| proxy MUST send a Proxy-Authenticate header field (Section 11.3.2) | proxy MUST send a Proxy-Authenticate header field (Section 10.7.1) | |||
| containing a challenge applicable to that proxy for the request. The | containing a challenge applicable to that proxy for the request. The | |||
| client MAY repeat the request with a new or replaced | client MAY repeat the request with a new or replaced | |||
| Proxy-Authorization header field (Section 9.5.4). | Proxy-Authorization header field (Section 10.7.2). | |||
| 10.5.9. 408 Request Timeout | 14.5.9. 408 Request Timeout | |||
| The 408 (Request Timeout) status code indicates that the server did | The 408 (Request Timeout) status code indicates that the server did | |||
| not receive a complete request message within the time that it was | not receive a complete request message within the time that it was | |||
| prepared to wait. If the client has an outstanding request in | prepared to wait. If the client has an outstanding request in | |||
| transit, the client MAY repeat that request on a new connection. | transit, the client MAY repeat that request on a new connection. | |||
| 10.5.10. 409 Conflict | 14.5.10. 409 Conflict | |||
| The 409 (Conflict) status code indicates that the request could not | The 409 (Conflict) status code indicates that the request could not | |||
| be completed due to a conflict with the current state of the target | be completed due to a conflict with the current state of the target | |||
| resource. This code is used in situations where the user might be | resource. This code is used in situations where the user might be | |||
| able to resolve the conflict and resubmit the request. The server | able to resolve the conflict and resubmit the request. The server | |||
| SHOULD generate a payload that includes enough information for a user | SHOULD generate a payload that includes enough information for a user | |||
| to recognize the source of the conflict. | to recognize the source of the conflict. | |||
| Conflicts are most likely to occur in response to a PUT request. For | Conflicts are most likely to occur in response to a PUT request. For | |||
| example, if versioning were being used and the representation being | example, if versioning were being used and the representation being | |||
| PUT included changes to a resource that conflict with those made by | PUT included changes to a resource that conflict with those made by | |||
| an earlier (third-party) request, the origin server might use a 409 | an earlier (third-party) request, the origin server might use a 409 | |||
| response to indicate that it can't complete the request. In this | response to indicate that it can't complete the request. In this | |||
| case, the response representation would likely contain information | case, the response representation would likely contain information | |||
| useful for merging the differences based on the revision history. | useful for merging the differences based on the revision history. | |||
| 10.5.11. 410 Gone | 14.5.11. 410 Gone | |||
| The 410 (Gone) status code indicates that access to the target | The 410 (Gone) status code indicates that access to the target | |||
| resource is no longer available at the origin server and that this | resource is no longer available at the origin server and that this | |||
| condition is likely to be permanent. If the origin server does not | condition is likely to be permanent. If the origin server does not | |||
| know, or has no facility to determine, whether or not the condition | know, or has no facility to determine, whether or not the condition | |||
| is permanent, the status code 404 (Not Found) ought to be used | is permanent, the status code 404 (Not Found) ought to be used | |||
| instead. | instead. | |||
| The 410 response is primarily intended to assist the task of web | The 410 response is primarily intended to assist the task of web | |||
| maintenance by notifying the recipient that the resource is | maintenance by notifying the recipient that the resource is | |||
| skipping to change at page 151, line 45 ¶ | skipping to change at page 159, line 45 ¶ | |||
| for limited-time, promotional services and for resources belonging to | for limited-time, promotional services and for resources belonging to | |||
| individuals no longer associated with the origin server's site. It | individuals no longer associated with the origin server's site. It | |||
| is not necessary to mark all permanently unavailable resources as | is not necessary to mark all permanently unavailable resources as | |||
| "gone" or to keep the mark for any length of time - that is left to | "gone" or to keep the mark for any length of time - that is left to | |||
| the discretion of the server owner. | the discretion of the server owner. | |||
| A 410 response is heuristically cacheable; i.e., unless otherwise | A 410 response is heuristically cacheable; i.e., unless otherwise | |||
| indicated by the method definition or explicit cache controls (see | indicated by the method definition or explicit cache controls (see | |||
| Section 4.2.2 of [Caching]). | Section 4.2.2 of [Caching]). | |||
| 10.5.12. 411 Length Required | 14.5.12. 411 Length Required | |||
| The 411 (Length Required) status code indicates that the server | The 411 (Length Required) status code indicates that the server | |||
| refuses to accept the request without a defined Content-Length | refuses to accept the request without a defined Content-Length | |||
| (Section 7.2.4). The client MAY repeat the request if it adds a | (Section 7.7). The client MAY repeat the request if it adds a valid | |||
| valid Content-Length header field containing the length of the | Content-Length header field containing the length of the message body | |||
| message body in the request message. | in the request message. | |||
| 10.5.13. 412 Precondition Failed | 14.5.13. 412 Precondition Failed | |||
| The 412 (Precondition Failed) status code indicates that one or more | The 412 (Precondition Failed) status code indicates that one or more | |||
| conditions given in the request header fields evaluated to false when | conditions given in the request header fields evaluated to false when | |||
| tested on the server. This response status code allows the client to | tested on the server. This response status code allows the client to | |||
| place preconditions on the current resource state (its current | place preconditions on the current resource state (its current | |||
| representations and metadata) and, thus, prevent the request method | representations and metadata) and, thus, prevent the request method | |||
| from being applied if the target resource is in an unexpected state. | from being applied if the target resource is in an unexpected state. | |||
| 10.5.14. 413 Payload Too Large | 14.5.14. 413 Payload Too Large | |||
| The 413 (Payload Too Large) status code indicates that the server is | The 413 (Payload Too Large) status code indicates that the server is | |||
| refusing to process a request because the request payload is larger | refusing to process a request because the request payload is larger | |||
| than the server is willing or able to process. The server MAY | than the server is willing or able to process. The server MAY | |||
| terminate the request, if the protocol version in use allows it; | terminate the request, if the protocol version in use allows it; | |||
| otherwise, the server MAY close the connection. | otherwise, the server MAY close the connection. | |||
| If the condition is temporary, the server SHOULD generate a | If the condition is temporary, the server SHOULD generate a | |||
| Retry-After header field to indicate that it is temporary and after | Retry-After header field to indicate that it is temporary and after | |||
| what time the client MAY try again. | what time the client MAY try again. | |||
| 10.5.15. 414 URI Too Long | 14.5.15. 414 URI Too Long | |||
| The 414 (URI Too Long) status code indicates that the server is | The 414 (URI Too Long) status code indicates that the server is | |||
| refusing to service the request because the target URI is longer than | refusing to service the request because the target URI is longer than | |||
| the server is willing to interpret. This rare condition is only | the server is willing to interpret. This rare condition is only | |||
| likely to occur when a client has improperly converted a POST request | likely to occur when a client has improperly converted a POST request | |||
| to a GET request with long query information, when the client has | to a GET request with long query information, when the client has | |||
| descended into a "black hole" of redirection (e.g., a redirected URI | descended into a "black hole" of redirection (e.g., a redirected URI | |||
| prefix that points to a suffix of itself) or when the server is under | prefix that points to a suffix of itself) or when the server is under | |||
| attack by a client attempting to exploit potential security holes. | attack by a client attempting to exploit potential security holes. | |||
| A 414 response is heuristically cacheable; i.e., unless otherwise | A 414 response is heuristically cacheable; i.e., unless otherwise | |||
| indicated by the method definition or explicit cache controls (see | indicated by the method definition or explicit cache controls (see | |||
| Section 4.2.2 of [Caching]). | Section 4.2.2 of [Caching]). | |||
| 10.5.16. 415 Unsupported Media Type | 14.5.16. 415 Unsupported Media Type | |||
| The 415 (Unsupported Media Type) status code indicates that the | The 415 (Unsupported Media Type) status code indicates that the | |||
| origin server is refusing to service the request because the payload | origin server is refusing to service the request because the payload | |||
| is in a format not supported by this method on the target resource. | is in a format not supported by this method on the target resource. | |||
| The format problem might be due to the request's indicated | The format problem might be due to the request's indicated | |||
| Content-Type or Content-Encoding, or as a result of inspecting the | Content-Type or Content-Encoding, or as a result of inspecting the | |||
| data directly. | data directly. | |||
| If the problem was caused by an unsupported content coding, the | If the problem was caused by an unsupported content coding, the | |||
| Accept-Encoding response header field (Section 9.4.3) ought to be | Accept-Encoding response header field (Section 11.1.4) ought to be | |||
| used to indicate what (if any) content codings would have been | used to indicate what (if any) content codings would have been | |||
| accepted in the request. | accepted in the request. | |||
| On the other hand, if the cause was an unsupported media type, the | On the other hand, if the cause was an unsupported media type, the | |||
| Accept response header field (Section 9.4.1) can be used to indicate | Accept response header field (Section 11.1.2) can be used to indicate | |||
| what media types would have been accepted in the request. | what media types would have been accepted in the request. | |||
| 10.5.17. 416 Range Not Satisfiable | 14.5.17. 416 Range Not Satisfiable | |||
| The 416 (Range Not Satisfiable) status code indicates that the set of | The 416 (Range Not Satisfiable) status code indicates that the set of | |||
| ranges in the request's Range header field (Section 9.3) has been | ranges in the request's Range header field (Section 13.2) has been | |||
| rejected either because none of the requested ranges are satisfiable | rejected either because none of the requested ranges are satisfiable | |||
| or because the client has requested an excessive number of small or | or because the client has requested an excessive number of small or | |||
| overlapping ranges (a potential denial of service attack). | overlapping ranges (a potential denial of service attack). | |||
| Each range unit defines what is required for its own range sets to be | Each range unit defines what is required for its own range sets to be | |||
| satisfiable. For example, Section 7.1.4.2 defines what makes a bytes | satisfiable. For example, Section 13.1.2 defines what makes a bytes | |||
| range set satisfiable. | range set satisfiable. | |||
| When this status code is generated in response to a byte-range | When this status code is generated in response to a byte-range | |||
| request, the sender SHOULD generate a Content-Range header field | request, the sender SHOULD generate a Content-Range header field | |||
| specifying the current length of the selected representation | specifying the current length of the selected representation | |||
| (Section 7.3.4). | (Section 13.4). | |||
| For example: | For example: | |||
| HTTP/1.1 416 Range Not Satisfiable | HTTP/1.1 416 Range Not Satisfiable | |||
| Date: Fri, 20 Jan 2012 15:41:54 GMT | Date: Fri, 20 Jan 2012 15:41:54 GMT | |||
| Content-Range: bytes */47022 | Content-Range: bytes */47022 | |||
| | *Note:* Because servers are free to ignore Range, many | | *Note:* Because servers are free to ignore Range, many | |||
| | implementations will respond with the entire selected | | implementations will respond with the entire selected | |||
| | representation in a 200 (OK) response. That is partly because | | representation in a 200 (OK) response. That is partly because | |||
| | most clients are prepared to receive a 200 (OK) to complete the | | most clients are prepared to receive a 200 (OK) to complete the | |||
| | task (albeit less efficiently) and partly because clients might | | task (albeit less efficiently) and partly because clients might | |||
| | not stop making an invalid partial request until they have | | not stop making an invalid partial request until they have | |||
| | received a complete representation. Thus, clients cannot | | received a complete representation. Thus, clients cannot | |||
| | depend on receiving a 416 (Range Not Satisfiable) response even | | depend on receiving a 416 (Range Not Satisfiable) response even | |||
| | when it is most appropriate. | | when it is most appropriate. | |||
| 10.5.18. 417 Expectation Failed | 14.5.18. 417 Expectation Failed | |||
| The 417 (Expectation Failed) status code indicates that the | The 417 (Expectation Failed) status code indicates that the | |||
| expectation given in the request's Expect header field | expectation given in the request's Expect header field | |||
| (Section 9.1.1) could not be met by at least one of the inbound | (Section 9.1.1) could not be met by at least one of the inbound | |||
| servers. | servers. | |||
| 10.5.19. 418 (Unused) | 14.5.19. 418 (Unused) | |||
| [RFC2324] was an April 1 RFC that lampooned the various ways HTTP was | [RFC2324] was an April 1 RFC that lampooned the various ways HTTP was | |||
| abused; one such abuse was the definition of an application-specific | abused; one such abuse was the definition of an application-specific | |||
| 418 status code. In the intervening years, this status code has been | 418 status code. In the intervening years, this status code has been | |||
| widely implemented as an "Easter Egg", and therefore is effectively | widely implemented as an "Easter Egg", and therefore is effectively | |||
| consumed by this use. | consumed by this use. | |||
| Therefore, the 418 status code is reserved in the IANA HTTP Status | Therefore, the 418 status code is reserved in the IANA HTTP Status | |||
| Code Registry. This indicates that the status code cannot be | Code Registry. This indicates that the status code cannot be | |||
| assigned to other applications currently. If future circumstances | assigned to other applications currently. If future circumstances | |||
| require its use (e.g., exhaustion of 4NN status codes), it can be re- | require its use (e.g., exhaustion of 4NN status codes), it can be re- | |||
| assigned to another use. | assigned to another use. | |||
| 10.5.20. 422 Unprocessable Payload | 14.5.20. 422 Unprocessable Payload | |||
| The 422 (Unprocessable Payload) status code indicates that the server | The 422 (Unprocessable Payload) status code indicates that the server | |||
| understands the content type of the request payload (hence a 415 | understands the content type of the request payload (hence a 415 | |||
| (Unsupported Media Type) status code is inappropriate), and the | (Unsupported Media Type) status code is inappropriate), and the | |||
| syntax of the request payload is correct, but was unable to process | syntax of the request payload is correct, but was unable to process | |||
| the contained instructions. For example, this status code can be | the contained instructions. For example, this status code can be | |||
| sent if an XML request payload contains well-formed (i.e., | sent if an XML request payload contains well-formed (i.e., | |||
| syntactically correct), but semantically erroneous XML instructions. | syntactically correct), but semantically erroneous XML instructions. | |||
| 10.5.21. 426 Upgrade Required | 14.5.21. 426 Upgrade Required | |||
| The 426 (Upgrade Required) status code indicates that the server | The 426 (Upgrade Required) status code indicates that the server | |||
| refuses to perform the request using the current protocol but might | refuses to perform the request using the current protocol but might | |||
| be willing to do so after the client upgrades to a different | be willing to do so after the client upgrades to a different | |||
| protocol. The server MUST send an Upgrade header field in a 426 | protocol. The server MUST send an Upgrade header field in a 426 | |||
| response to indicate the required protocol(s) (Section 6.7). | response to indicate the required protocol(s) (Section 6.6). | |||
| Example: | Example: | |||
| HTTP/1.1 426 Upgrade Required | HTTP/1.1 426 Upgrade Required | |||
| Upgrade: HTTP/3.0 | Upgrade: HTTP/3.0 | |||
| Connection: Upgrade | Connection: Upgrade | |||
| Content-Length: 53 | Content-Length: 53 | |||
| Content-Type: text/plain | Content-Type: text/plain | |||
| This service requires use of the HTTP/3.0 protocol. | This service requires use of the HTTP/3.0 protocol. | |||
| 10.6. Server Error 5xx | 14.6. Server Error 5xx | |||
| The 5xx (Server Error) class of status code indicates that the server | The 5xx (Server Error) class of status code indicates that the server | |||
| is aware that it has erred or is incapable of performing the | is aware that it has erred or is incapable of performing the | |||
| requested method. Except when responding to a HEAD request, the | requested method. Except when responding to a HEAD request, the | |||
| server SHOULD send a representation containing an explanation of the | server SHOULD send a representation containing an explanation of the | |||
| error situation, and whether it is a temporary or permanent | error situation, and whether it is a temporary or permanent | |||
| condition. A user agent SHOULD display any included representation | condition. A user agent SHOULD display any included representation | |||
| to the user. These response codes are applicable to any request | to the user. These response codes are applicable to any request | |||
| method. | method. | |||
| 10.6.1. 500 Internal Server Error | 14.6.1. 500 Internal Server Error | |||
| The 500 (Internal Server Error) status code indicates that the server | The 500 (Internal Server Error) status code indicates that the server | |||
| encountered an unexpected condition that prevented it from fulfilling | encountered an unexpected condition that prevented it from fulfilling | |||
| the request. | the request. | |||
| 10.6.2. 501 Not Implemented | 14.6.2. 501 Not Implemented | |||
| The 501 (Not Implemented) status code indicates that the server does | The 501 (Not Implemented) status code indicates that the server does | |||
| not support the functionality required to fulfill the request. This | not support the functionality required to fulfill the request. This | |||
| is the appropriate response when the server does not recognize the | is the appropriate response when the server does not recognize the | |||
| request method and is not capable of supporting it for any resource. | request method and is not capable of supporting it for any resource. | |||
| A 501 response is heuristically cacheable; i.e., unless otherwise | A 501 response is heuristically cacheable; i.e., unless otherwise | |||
| indicated by the method definition or explicit cache controls (see | indicated by the method definition or explicit cache controls (see | |||
| Section 4.2.2 of [Caching]). | Section 4.2.2 of [Caching]). | |||
| 10.6.3. 502 Bad Gateway | 14.6.3. 502 Bad Gateway | |||
| The 502 (Bad Gateway) status code indicates that the server, while | The 502 (Bad Gateway) status code indicates that the server, while | |||
| acting as a gateway or proxy, received an invalid response from an | acting as a gateway or proxy, received an invalid response from an | |||
| inbound server it accessed while attempting to fulfill the request. | inbound server it accessed while attempting to fulfill the request. | |||
| 10.6.4. 503 Service Unavailable | 14.6.4. 503 Service Unavailable | |||
| The 503 (Service Unavailable) status code indicates that the server | The 503 (Service Unavailable) status code indicates that the server | |||
| is currently unable to handle the request due to a temporary overload | is currently unable to handle the request due to a temporary overload | |||
| or scheduled maintenance, which will likely be alleviated after some | or scheduled maintenance, which will likely be alleviated after some | |||
| delay. The server MAY send a Retry-After header field | delay. The server MAY send a Retry-After header field | |||
| (Section 11.1.3) to suggest an appropriate amount of time for the | (Section 9.2.4) to suggest an appropriate amount of time for the | |||
| client to wait before retrying the request. | client to wait before retrying the request. | |||
| | *Note:* The existence of the 503 status code does not imply | | *Note:* The existence of the 503 status code does not imply | |||
| | that a server has to use it when becoming overloaded. Some | | that a server has to use it when becoming overloaded. Some | |||
| | servers might simply refuse the connection. | | servers might simply refuse the connection. | |||
| 10.6.5. 504 Gateway Timeout | 14.6.5. 504 Gateway Timeout | |||
| The 504 (Gateway Timeout) status code indicates that the server, | The 504 (Gateway Timeout) status code indicates that the server, | |||
| while acting as a gateway or proxy, did not receive a timely response | while acting as a gateway or proxy, did not receive a timely response | |||
| from an upstream server it needed to access in order to complete the | from an upstream server it needed to access in order to complete the | |||
| request. | request. | |||
| 10.6.6. 505 HTTP Version Not Supported | 14.6.6. 505 HTTP Version Not Supported | |||
| The 505 (HTTP Version Not Supported) status code indicates that the | The 505 (HTTP Version Not Supported) status code indicates that the | |||
| server does not support, or refuses to support, the major version of | server does not support, or refuses to support, the major version of | |||
| HTTP that was used in the request message. The server is indicating | HTTP that was used in the request message. The server is indicating | |||
| that it is unable or unwilling to complete the request using the same | that it is unable or unwilling to complete the request using the same | |||
| major version as the client, as described in Section 4.2, other than | major version as the client, as described in Section 5.1, other than | |||
| with this error message. The server SHOULD generate a representation | with this error message. The server SHOULD generate a representation | |||
| for the 505 response that describes why that version is not supported | for the 505 response that describes why that version is not supported | |||
| and what other protocols are supported by that server. | and what other protocols are supported by that server. | |||
| 10.7. Status Code Extensibility | 15. Extending HTTP | |||
| Additional status codes, outside the scope of this specification, | HTTP defines a number of generic extension points that can be used to | |||
| have been specified for use in HTTP. All such status codes ought to | introduce capabilities to the protocol without introducing a new | |||
| be registered within the "Hypertext Transfer Protocol (HTTP) Status | version, including methods, status codes, field names, and further | |||
| Code Registry". | extensibility points within defined fields, such as authentication | |||
| schemes and cache-directives (see Cache-Control in Section 5.2.3 of | ||||
| [Caching]). Because the semantics of HTTP are not versioned, these | ||||
| extension points are persistent; the version of the protocol in use | ||||
| does not affect their semantics. | ||||
| 10.7.1. Status Code Registry | Version-independent extensions are discouraged from depending on or | |||
| interacting with the specific version of the protocol in use. When | ||||
| this is unavoidable, careful consideration needs to be given to how | ||||
| the extension can interoperate across versions. | ||||
| Additionally, specific versions of HTTP might have their own | ||||
| extensibility points, such as transfer-codings in HTTP/1.1 | ||||
| (Section 6.1 of [Messaging]) and HTTP/2 ([RFC7540]) SETTINGS or frame | ||||
| types. These extension points are specific to the version of the | ||||
| protocol they occur within. | ||||
| Version-specific extensions cannot override or modify the semantics | ||||
| of a version-independent mechanism or extension point (like a method | ||||
| or header field) without explicitly being allowed by that protocol | ||||
| element. For example, the CONNECT method (Section 8.3.6) allows | ||||
| this. | ||||
| These guidelines assure that the protocol operates correctly and | ||||
| predictably, even when parts of the path implement different versions | ||||
| of HTTP. | ||||
| 15.1. Method Extensibility | ||||
| 15.1.1. Method Registry | ||||
| The "Hypertext Transfer Protocol (HTTP) Method Registry", maintained | ||||
| by IANA at <https://www.iana.org/assignments/http-methods>, registers | ||||
| method names. | ||||
| HTTP method registrations MUST include the following fields: | ||||
| o Method Name (see Section 8) | ||||
| o Safe ("yes" or "no", see Section 8.2.1) | ||||
| o Idempotent ("yes" or "no", see Section 8.2.2) | ||||
| o Pointer to specification text | ||||
| Values to be added to this namespace require IETF Review (see | ||||
| [RFC8126], Section 4.8). | ||||
| 15.1.2. Considerations for New Methods | ||||
| Standardized methods are generic; that is, they are potentially | ||||
| applicable to any resource, not just one particular media type, kind | ||||
| of resource, or application. As such, it is preferred that new | ||||
| methods be registered in a document that isn't specific to a single | ||||
| application or data format, since orthogonal technologies deserve | ||||
| orthogonal specification. | ||||
| Since message parsing (Section 6 of [Messaging]) needs to be | ||||
| independent of method semantics (aside from responses to HEAD), | ||||
| definitions of new methods cannot change the parsing algorithm or | ||||
| prohibit the presence of a message body on either the request or the | ||||
| response message. Definitions of new methods can specify that only a | ||||
| zero-length message body is allowed by requiring a Content-Length | ||||
| header field with a value of "0". | ||||
| A new method definition needs to indicate whether it is safe | ||||
| (Section 8.2.1), idempotent (Section 8.2.2), cacheable | ||||
| (Section 8.2.3), what semantics are to be associated with the payload | ||||
| body if any is present in the request and what refinements the method | ||||
| makes to header field or status code semantics. If the new method is | ||||
| cacheable, its definition ought to describe how, and under what | ||||
| conditions, a cache can store a response and use it to satisfy a | ||||
| subsequent request. The new method ought to describe whether it can | ||||
| be made conditional (Section 12.1) and, if so, how a server responds | ||||
| when the condition is false. Likewise, if the new method might have | ||||
| some use for partial response semantics (Section 13.2), it ought to | ||||
| document this, too. | ||||
| | *Note:* Avoid defining a method name that starts with "M-", | ||||
| | since that prefix might be misinterpreted as having the | ||||
| | semantics assigned to it by [RFC2774]. | ||||
| 15.2. Status Code Extensibility | ||||
| 15.2.1. Status Code Registry | ||||
| The "Hypertext Transfer Protocol (HTTP) Status Code Registry", | The "Hypertext Transfer Protocol (HTTP) Status Code Registry", | |||
| maintained by IANA at <https://www.iana.org/assignments/http-status- | maintained by IANA at <https://www.iana.org/assignments/http-status- | |||
| codes>, registers status code numbers. | codes>, registers status code numbers. | |||
| A registration MUST include the following fields: | A registration MUST include the following fields: | |||
| o Status Code (3 digits) | o Status Code (3 digits) | |||
| o Short Description | o Short Description | |||
| o Pointer to specification text | o Pointer to specification text | |||
| Values to be added to the HTTP status code namespace require IETF | Values to be added to the HTTP status code namespace require IETF | |||
| Review (see [RFC8126], Section 4.8). | Review (see [RFC8126], Section 4.8). | |||
| 10.7.2. Considerations for New Status Codes | 15.2.2. Considerations for New Status Codes | |||
| When it is necessary to express semantics for a response that are not | When it is necessary to express semantics for a response that are not | |||
| defined by current status codes, a new status code can be registered. | defined by current status codes, a new status code can be registered. | |||
| Status codes are generic; they are potentially applicable to any | Status codes are generic; they are potentially applicable to any | |||
| resource, not just one particular media type, kind of resource, or | resource, not just one particular media type, kind of resource, or | |||
| application of HTTP. As such, it is preferred that new status codes | application of HTTP. As such, it is preferred that new status codes | |||
| be registered in a document that isn't specific to a single | be registered in a document that isn't specific to a single | |||
| application. | application. | |||
| New status codes are required to fall under one of the categories | New status codes are required to fall under one of the categories | |||
| defined in Section 10. To allow existing parsers to process the | defined in Section 14. To allow existing parsers to process the | |||
| response message, new status codes cannot disallow a payload, | response message, new status codes cannot disallow a payload, | |||
| although they can mandate a zero-length payload body. | although they can mandate a zero-length payload body. | |||
| Proposals for new status codes that are not yet widely deployed ought | Proposals for new status codes that are not yet widely deployed ought | |||
| to avoid allocating a specific number for the code until there is | to avoid allocating a specific number for the code until there is | |||
| clear consensus that it will be registered; instead, early drafts can | clear consensus that it will be registered; instead, early drafts can | |||
| use a notation such as "4NN", or "3N0" .. "3N9", to indicate the | use a notation such as "4NN", or "3N0" .. "3N9", to indicate the | |||
| class of the proposed status code(s) without consuming a number | class of the proposed status code(s) without consuming a number | |||
| prematurely. | prematurely. | |||
| skipping to change at page 157, line 52 ¶ | skipping to change at page 167, line 33 ¶ | |||
| The definition of a new status code ought to specify whether or not | The definition of a new status code ought to specify whether or not | |||
| it is cacheable. Note that all status codes can be cached if the | it is cacheable. Note that all status codes can be cached if the | |||
| response they occur in has explicit freshness information; however, | response they occur in has explicit freshness information; however, | |||
| status codes that are defined as being cacheable are allowed to be | status codes that are defined as being cacheable are allowed to be | |||
| cached without explicit freshness information. Likewise, the | cached without explicit freshness information. Likewise, the | |||
| definition of a status code can place constraints upon cache | definition of a status code can place constraints upon cache | |||
| behavior. See [Caching] for more information. | behavior. See [Caching] for more information. | |||
| Finally, the definition of a new status code ought to indicate | Finally, the definition of a new status code ought to indicate | |||
| whether the payload has any implied association with an identified | whether the payload has any implied association with an identified | |||
| resource (Section 7.3.2). | resource (Section 5.5.2). | |||
| 11. Response Header Fields | ||||
| The response header fields allow the server to pass additional | ||||
| information about the response beyond the status code. These header | ||||
| fields give information about the server, about further access to the | ||||
| target resource, or about related resources. | ||||
| Although each response header field has a defined meaning, in | ||||
| general, the precise semantics might be further refined by the | ||||
| semantics of the request method and/or response status code. | ||||
| 11.1. Control Data | ||||
| Response header fields can supply control data that supplements the | ||||
| status code, directs caching, or instructs the client where to go | ||||
| next. | ||||
| --------------- -------------------------- | ||||
| Field Name Ref. | ||||
| --------------- -------------------------- | ||||
| Age Section 5.1 of [Caching] | ||||
| Cache-Control Section 5.2 of [Caching] | ||||
| Expires Section 5.3 of [Caching] | ||||
| Date 11.1.1 | ||||
| Location 11.1.2 | ||||
| Retry-After 11.1.3 | ||||
| Vary 11.1.4 | ||||
| Warning Section 5.5 of [Caching] | ||||
| --------------- -------------------------- | ||||
| Table 19 | ||||
| 11.1.1. Date | ||||
| The "Date" header field represents the date and time at which the | ||||
| message was originated, having the same semantics as the Origination | ||||
| Date Field (orig-date) defined in Section 3.6.1 of [RFC5322]. The | ||||
| field value is an HTTP-date, as defined in Section 5.4.1.5. | ||||
| Date = HTTP-date | ||||
| An example is | ||||
| Date: Tue, 15 Nov 1994 08:12:31 GMT | ||||
| When a Date header field is generated, the sender SHOULD generate its | ||||
| field value as the best available approximation of the date and time | ||||
| of message generation. In theory, the date ought to represent the | ||||
| moment just before the payload is generated. In practice, the date | ||||
| can be generated at any time during message origination. | ||||
| An origin server MUST NOT send a Date header field if it does not | ||||
| have a clock capable of providing a reasonable approximation of the | ||||
| current instance in Coordinated Universal Time. An origin server MAY | ||||
| send a Date header field if the response is in the 1xx | ||||
| (Informational) or 5xx (Server Error) class of status codes. An | ||||
| origin server MUST send a Date header field in all other cases. | ||||
| A recipient with a clock that receives a response message without a | ||||
| Date header field MUST record the time it was received and append a | ||||
| corresponding Date header field to the message's header section if it | ||||
| is cached or forwarded downstream. | ||||
| A user agent MAY send a Date header field in a request, though | ||||
| generally will not do so unless it is believed to convey useful | ||||
| information to the server. For example, custom applications of HTTP | ||||
| might convey a Date if the server is expected to adjust its | ||||
| interpretation of the user's request based on differences between the | ||||
| user agent and server clocks. | ||||
| 11.1.2. Location | ||||
| The "Location" header field is used in some responses to refer to a | ||||
| specific resource in relation to the response. The type of | ||||
| relationship is defined by the combination of request method and | ||||
| status code semantics. | ||||
| Location = URI-reference | ||||
| The field value consists of a single URI-reference. When it has the | ||||
| form of a relative reference ([RFC3986], Section 4.2), the final | ||||
| value is computed by resolving it against the target URI ([RFC3986], | ||||
| Section 5). | ||||
| For 201 (Created) responses, the Location value refers to the primary | ||||
| resource created by the request. For 3xx (Redirection) responses, | ||||
| the Location value refers to the preferred target resource for | ||||
| automatically redirecting the request. | ||||
| If the Location value provided in a 3xx (Redirection) response does | ||||
| not have a fragment component, a user agent MUST process the | ||||
| redirection as if the value inherits the fragment component of the | ||||
| URI reference used to generate the target URI (i.e., the redirection | ||||
| inherits the original reference's fragment, if any). | ||||
| For example, a GET request generated for the URI reference | ||||
| "http://www.example.org/~tim" might result in a 303 (See Other) | ||||
| response containing the header field: | ||||
| Location: /People.html#tim | ||||
| which suggests that the user agent redirect to | ||||
| "http://www.example.org/People.html#tim" | ||||
| Likewise, a GET request generated for the URI reference | ||||
| "http://www.example.org/index.html#larry" might result in a 301 | ||||
| (Moved Permanently) response containing the header field: | ||||
| Location: http://www.example.net/index.html | ||||
| which suggests that the user agent redirect to | ||||
| "http://www.example.net/index.html#larry", preserving the original | ||||
| fragment identifier. | ||||
| There are circumstances in which a fragment identifier in a Location | ||||
| value would not be appropriate. For example, the Location header | ||||
| field in a 201 (Created) response is supposed to provide a URI that | ||||
| is specific to the created resource. | ||||
| | *Note:* Some recipients attempt to recover from Location fields | ||||
| | that are not valid URI references. This specification does not | ||||
| | mandate or define such processing, but does allow it for the | ||||
| | sake of robustness. A Location field value cannot allow a list | ||||
| | of members because the comma list separator is a valid data | ||||
| | character within a URI-reference. If an invalid message is | ||||
| | sent with multiple Location field instances, a recipient along | ||||
| | the path might combine the field instances into one value. | ||||
| | Recovery of a valid Location field value from that situation is | ||||
| | difficult and not interoperable across implementations. | ||||
| | *Note:* The Content-Location header field (Section 7.2.5) | ||||
| | differs from Location in that the Content-Location refers to | ||||
| | the most specific resource corresponding to the enclosed | ||||
| | representation. It is therefore possible for a response to | ||||
| | contain both the Location and Content-Location header fields. | ||||
| 11.1.3. Retry-After | ||||
| Servers send the "Retry-After" header field to indicate how long the | ||||
| user agent ought to wait before making a follow-up request. When | ||||
| sent with a 503 (Service Unavailable) response, Retry-After indicates | ||||
| how long the service is expected to be unavailable to the client. | ||||
| When sent with any 3xx (Redirection) response, Retry-After indicates | ||||
| the minimum time that the user agent is asked to wait before issuing | ||||
| the redirected request. | ||||
| The value of this field can be either an HTTP-date or a number of | ||||
| seconds to delay after the response is received. | ||||
| Retry-After = HTTP-date / delay-seconds | ||||
| A delay-seconds value is a non-negative decimal integer, representing | ||||
| time in seconds. | ||||
| delay-seconds = 1*DIGIT | ||||
| Two examples of its use are | ||||
| Retry-After: Fri, 31 Dec 1999 23:59:59 GMT | ||||
| Retry-After: 120 | ||||
| In the latter example, the delay is 2 minutes. | ||||
| 11.1.4. Vary | ||||
| The "Vary" header field in a response describes what parts of a | ||||
| request message, aside from the method and target URI, might | ||||
| influence the origin server's process for selecting and representing | ||||
| this response. | ||||
| Vary = #( "*" / field-name ) | ||||
| A Vary field value is a list of request field names, known as the | ||||
| selecting header fields, that might have a role in selecting the | ||||
| representation for this response. Potential selecting header fields | ||||
| are not limited to those defined by this specification. | ||||
| If the list contains "*", it signals that other aspects of the | ||||
| request might play a role in selecting the response representation, | ||||
| possibly including elements outside the message syntax (e.g., the | ||||
| client's network address). A recipient will not be able to determine | ||||
| whether this response is appropriate for a later request without | ||||
| forwarding the request to the origin server. A proxy MUST NOT | ||||
| generate "*" in a Vary field value. | ||||
| For example, a response that contains | ||||
| Vary: accept-encoding, accept-language | ||||
| indicates that the origin server might have used the request's | ||||
| Accept-Encoding and Accept-Language fields (or lack thereof) as | ||||
| determining factors while choosing the content for this response. | ||||
| An origin server might send Vary with a list of fields for two | ||||
| purposes: | ||||
| 1. To inform cache recipients that they MUST NOT use this response | ||||
| to satisfy a later request unless the later request has the same | ||||
| values for the listed fields as the original request (Section 4.1 | ||||
| of [Caching]). In other words, Vary expands the cache key | ||||
| required to match a new request to the stored cache entry. | ||||
| 2. To inform user agent recipients that this response is subject to | ||||
| content negotiation (Section 9.4) and that a different | ||||
| representation might be sent in a subsequent request if | ||||
| additional parameters are provided in the listed header fields | ||||
| (proactive negotiation). | ||||
| An origin server SHOULD send a Vary header field when its algorithm | ||||
| for selecting a representation varies based on aspects of the request | ||||
| message other than the method and target URI, unless the variance | ||||
| cannot be crossed or the origin server has been deliberately | ||||
| configured to prevent cache transparency. For example, there is no | ||||
| need to send the Authorization field name in Vary because reuse | ||||
| across users is constrained by the field definition (Section 9.5.3). | ||||
| Likewise, an origin server might use Cache-Control response | ||||
| directives (Section 5.2 of [Caching]) to supplant Vary if it | ||||
| considers the variance less significant than the performance cost of | ||||
| Vary's impact on caching. | ||||
| 11.2. Validators | ||||
| Validator header fields convey metadata about the selected | ||||
| representation (Section 7). In responses to safe requests, validator | ||||
| fields describe the selected representation chosen by the origin | ||||
| server while handling the response. Note that, depending on the | ||||
| status code semantics, the selected representation for a given | ||||
| response is not necessarily the same as the representation enclosed | ||||
| as response payload. | ||||
| In a successful response to a state-changing request, validator | ||||
| fields describe the new representation that has replaced the prior | ||||
| selected representation as a result of processing the request. | ||||
| For example, an ETag field in a 201 (Created) response communicates | ||||
| the entity-tag of the newly created resource's representation, so | ||||
| that it can be used in later conditional requests to prevent the | ||||
| "lost update" problem Section 9.2. | ||||
| --------------- -------- | ||||
| Field Name Ref. | ||||
| --------------- -------- | ||||
| ETag 11.2.3 | ||||
| Last-Modified 11.2.2 | ||||
| --------------- -------- | ||||
| Table 20 | ||||
| This specification defines two forms of metadata that are commonly | ||||
| used to observe resource state and test for preconditions: | ||||
| modification dates (Section 11.2.2) and opaque entity tags | ||||
| (Section 11.2.3). Additional metadata that reflects resource state | ||||
| has been defined by various extensions of HTTP, such as Web | ||||
| Distributed Authoring and Versioning (WebDAV, [RFC4918]), that are | ||||
| beyond the scope of this specification. A resource metadata value is | ||||
| referred to as a "validator" when it is used within a precondition. | ||||
| 11.2.1. Weak versus Strong | ||||
| Validators come in two flavors: strong or weak. Weak validators are | ||||
| easy to generate but are far less useful for comparisons. Strong | ||||
| validators are ideal for comparisons but can be very difficult (and | ||||
| occasionally impossible) to generate efficiently. Rather than impose | ||||
| that all forms of resource adhere to the same strength of validator, | ||||
| HTTP exposes the type of validator in use and imposes restrictions on | ||||
| when weak validators can be used as preconditions. | ||||
| A "strong validator" is representation metadata that changes value | ||||
| whenever a change occurs to the representation data that would be | ||||
| observable in the payload body of a 200 (OK) response to GET. | ||||
| A strong validator might change for reasons other than a change to | ||||
| the representation data, such as when a semantically significant part | ||||
| of the representation metadata is changed (e.g., Content-Type), but | ||||
| it is in the best interests of the origin server to only change the | ||||
| value when it is necessary to invalidate the stored responses held by | ||||
| remote caches and authoring tools. | ||||
| Cache entries might persist for arbitrarily long periods, regardless | ||||
| of expiration times. Thus, a cache might attempt to validate an | ||||
| entry using a validator that it obtained in the distant past. A | ||||
| strong validator is unique across all versions of all representations | ||||
| associated with a particular resource over time. However, there is | ||||
| no implication of uniqueness across representations of different | ||||
| resources (i.e., the same strong validator might be in use for | ||||
| representations of multiple resources at the same time and does not | ||||
| imply that those representations are equivalent). | ||||
| There are a variety of strong validators used in practice. The best | ||||
| are based on strict revision control, wherein each change to a | ||||
| representation always results in a unique node name and revision | ||||
| identifier being assigned before the representation is made | ||||
| accessible to GET. A collision-resistant hash function applied to | ||||
| the representation data is also sufficient if the data is available | ||||
| prior to the response header fields being sent and the digest does | ||||
| not need to be recalculated every time a validation request is | ||||
| received. However, if a resource has distinct representations that | ||||
| differ only in their metadata, such as might occur with content | ||||
| negotiation over media types that happen to share the same data | ||||
| format, then the origin server needs to incorporate additional | ||||
| information in the validator to distinguish those representations. | ||||
| In contrast, a "weak validator" is representation metadata that might | ||||
| not change for every change to the representation data. This | ||||
| weakness might be due to limitations in how the value is calculated, | ||||
| such as clock resolution, an inability to ensure uniqueness for all | ||||
| possible representations of the resource, or a desire of the resource | ||||
| owner to group representations by some self-determined set of | ||||
| equivalency rather than unique sequences of data. An origin server | ||||
| SHOULD change a weak entity-tag whenever it considers prior | ||||
| representations to be unacceptable as a substitute for the current | ||||
| representation. In other words, a weak entity-tag ought to change | ||||
| whenever the origin server wants caches to invalidate old responses. | ||||
| For example, the representation of a weather report that changes in | ||||
| content every second, based on dynamic measurements, might be grouped | ||||
| into sets of equivalent representations (from the origin server's | ||||
| perspective) with the same weak validator in order to allow cached | ||||
| representations to be valid for a reasonable period of time (perhaps | ||||
| adjusted dynamically based on server load or weather quality). | ||||
| Likewise, a representation's modification time, if defined with only | ||||
| one-second resolution, might be a weak validator if it is possible | ||||
| for the representation to be modified twice during a single second | ||||
| and retrieved between those modifications. | ||||
| Likewise, a validator is weak if it is shared by two or more | ||||
| representations of a given resource at the same time, unless those | ||||
| representations have identical representation data. For example, if | ||||
| the origin server sends the same validator for a representation with | ||||
| a gzip content coding applied as it does for a representation with no | ||||
| content coding, then that validator is weak. However, two | ||||
| simultaneous representations might share the same strong validator if | ||||
| they differ only in the representation metadata, such as when two | ||||
| different media types are available for the same representation data. | ||||
| Strong validators are usable for all conditional requests, including | ||||
| cache validation, partial content ranges, and "lost update" | ||||
| avoidance. Weak validators are only usable when the client does not | ||||
| require exact equality with previously obtained representation data, | ||||
| such as when validating a cache entry or limiting a web traversal to | ||||
| recent changes. | ||||
| 11.2.2. Last-Modified | ||||
| The "Last-Modified" header field in a response provides a timestamp | ||||
| indicating the date and time at which the origin server believes the | ||||
| selected representation was last modified, as determined at the | ||||
| conclusion of handling the request. | ||||
| Last-Modified = HTTP-date | ||||
| An example of its use is | ||||
| Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT | ||||
| 11.2.2.1. Generation | ||||
| An origin server SHOULD send Last-Modified for any selected | ||||
| representation for which a last modification date can be reasonably | ||||
| and consistently determined, since its use in conditional requests | ||||
| and evaluating cache freshness ([Caching]) results in a substantial | ||||
| reduction of HTTP traffic on the Internet and can be a significant | ||||
| factor in improving service scalability and reliability. | ||||
| A representation is typically the sum of many parts behind the | ||||
| resource interface. The last-modified time would usually be the most | ||||
| recent time that any of those parts were changed. How that value is | ||||
| determined for any given resource is an implementation detail beyond | ||||
| the scope of this specification. What matters to HTTP is how | ||||
| recipients of the Last-Modified header field can use its value to | ||||
| make conditional requests and test the validity of locally cached | ||||
| responses. | ||||
| An origin server SHOULD obtain the Last-Modified value of the | ||||
| representation as close as possible to the time that it generates the | ||||
| Date field value for its response. This allows a recipient to make | ||||
| an accurate assessment of the representation's modification time, | ||||
| especially if the representation changes near the time that the | ||||
| response is generated. | ||||
| An origin server with a clock MUST NOT send a Last-Modified date that | ||||
| is later than the server's time of message origination (Date). If | ||||
| the last modification time is derived from implementation-specific | ||||
| metadata that evaluates to some time in the future, according to the | ||||
| origin server's clock, then the origin server MUST replace that value | ||||
| with the message origination date. This prevents a future | ||||
| modification date from having an adverse impact on cache validation. | ||||
| An origin server without a clock MUST NOT assign Last-Modified values | ||||
| to a response unless these values were associated with the resource | ||||
| by some other system or user with a reliable clock. | ||||
| 11.2.2.2. Comparison | ||||
| A Last-Modified time, when used as a validator in a request, is | ||||
| implicitly weak unless it is possible to deduce that it is strong, | ||||
| using the following rules: | ||||
| o The validator is being compared by an origin server to the actual | ||||
| current validator for the representation and, | ||||
| o That origin server reliably knows that the associated | ||||
| representation did not change twice during the second covered by | ||||
| the presented validator. | ||||
| or | ||||
| o The validator is about to be used by a client in an | ||||
| If-Modified-Since, If-Unmodified-Since, or If-Range header field, | ||||
| because the client has a cache entry for the associated | ||||
| representation, and | ||||
| o That cache entry includes a Date value, which gives the time when | ||||
| the origin server sent the original response, and | ||||
| o The presented Last-Modified time is at least 60 seconds before the | ||||
| Date value. | ||||
| or | ||||
| o The validator is being compared by an intermediate cache to the | ||||
| validator stored in its cache entry for the representation, and | ||||
| o That cache entry includes a Date value, which gives the time when | ||||
| the origin server sent the original response, and | ||||
| o The presented Last-Modified time is at least 60 seconds before the | ||||
| Date value. | ||||
| This method relies on the fact that if two different responses were | ||||
| sent by the origin server during the same second, but both had the | ||||
| same Last-Modified time, then at least one of those responses would | ||||
| have a Date value equal to its Last-Modified time. The arbitrary | ||||
| 60-second limit guards against the possibility that the Date and | ||||
| Last-Modified values are generated from different clocks or at | ||||
| somewhat different times during the preparation of the response. An | ||||
| implementation MAY use a value larger than 60 seconds, if it is | ||||
| believed that 60 seconds is too short. | ||||
| 11.2.3. ETag | ||||
| The "ETag" field in a response provides the current entity-tag for | ||||
| the selected representation, as determined at the conclusion of | ||||
| handling the request. An entity-tag is an opaque validator for | ||||
| differentiating between multiple representations of the same | ||||
| resource, regardless of whether those multiple representations are | ||||
| due to resource state changes over time, content negotiation | ||||
| resulting in multiple representations being valid at the same time, | ||||
| or both. An entity-tag consists of an opaque quoted string, possibly | ||||
| prefixed by a weakness indicator. | ||||
| ETag = entity-tag | ||||
| entity-tag = [ weak ] opaque-tag | ||||
| weak = %s"W/" | ||||
| opaque-tag = DQUOTE *etagc DQUOTE | ||||
| etagc = %x21 / %x23-7E / obs-text | ||||
| ; VCHAR except double quotes, plus obs-text | ||||
| | *Note:* Previously, opaque-tag was defined to be a quoted- | ||||
| | string ([RFC2616], Section 3.11); thus, some recipients might | ||||
| | perform backslash unescaping. Servers therefore ought to avoid | ||||
| | backslash characters in entity tags. | ||||
| An entity-tag can be more reliable for validation than a modification | ||||
| date in situations where it is inconvenient to store modification | ||||
| dates, where the one-second resolution of HTTP date values is not | ||||
| sufficient, or where modification dates are not consistently | ||||
| maintained. | ||||
| Examples: | ||||
| ETag: "xyzzy" | ||||
| ETag: W/"xyzzy" | ||||
| ETag: "" | ||||
| An entity-tag can be either a weak or strong validator, with strong | ||||
| being the default. If an origin server provides an entity-tag for a | ||||
| representation and the generation of that entity-tag does not satisfy | ||||
| all of the characteristics of a strong validator (Section 11.2.1), | ||||
| then the origin server MUST mark the entity-tag as weak by prefixing | ||||
| its opaque value with "W/" (case-sensitive). | ||||
| A sender MAY send the Etag field in a trailer section (see | ||||
| Section 5.6). However, since trailers are often ignored, it is | ||||
| preferable to send Etag as a header field unless the entity-tag is | ||||
| generated while sending the message body. | ||||
| 11.2.3.1. Generation | ||||
| The principle behind entity-tags is that only the service author | ||||
| knows the implementation of a resource well enough to select the most | ||||
| accurate and efficient validation mechanism for that resource, and | ||||
| that any such mechanism can be mapped to a simple sequence of octets | ||||
| for easy comparison. Since the value is opaque, there is no need for | ||||
| the client to be aware of how each entity-tag is constructed. | ||||
| For example, a resource that has implementation-specific versioning | ||||
| applied to all changes might use an internal revision number, perhaps | ||||
| combined with a variance identifier for content negotiation, to | ||||
| accurately differentiate between representations. Other | ||||
| implementations might use a collision-resistant hash of | ||||
| representation content, a combination of various file attributes, or | ||||
| a modification timestamp that has sub-second resolution. | ||||
| An origin server SHOULD send an ETag for any selected representation | ||||
| for which detection of changes can be reasonably and consistently | ||||
| determined, since the entity-tag's use in conditional requests and | ||||
| evaluating cache freshness ([Caching]) can result in a substantial | ||||
| reduction of HTTP network traffic and can be a significant factor in | ||||
| improving service scalability and reliability. | ||||
| 11.2.3.2. Comparison | ||||
| There are two entity-tag comparison functions, depending on whether | ||||
| or not the comparison context allows the use of weak validators: | ||||
| o Strong comparison: two entity-tags are equivalent if both are not | ||||
| weak and their opaque-tags match character-by-character. | ||||
| o Weak comparison: two entity-tags are equivalent if their opaque- | ||||
| tags match character-by-character, regardless of either or both | ||||
| being tagged as "weak". | ||||
| The example below shows the results for a set of entity-tag pairs and | 15.3. Field Name Extensibility | |||
| both the weak and strong comparison function results: | ||||
| -------- -------- ------------------- ----------------- | 15.3.1. Field Name Registry | |||
| ETag 1 ETag 2 Strong Comparison Weak Comparison | ||||
| -------- -------- ------------------- ----------------- | ||||
| W/"1" W/"1" no match match | ||||
| W/"1" W/"2" no match no match | ||||
| W/"1" "1" no match match | ||||
| "1" "1" match match | ||||
| -------- -------- ------------------- ----------------- | ||||
| Table 21 | The "Hypertext Transfer Protocol (HTTP) Field Name Registry" defines | |||
| the namespace for HTTP field names. | ||||
| 11.2.3.3. Example: Entity-Tags Varying on Content-Negotiated Resources | Any party can request registration of a HTTP field. See | |||
| Section 15.3.3 for considerations to take into account when creating | ||||
| a new HTTP field. | ||||
| Consider a resource that is subject to content negotiation | The "Hypertext Transfer Protocol (HTTP) Field Name Registry" is | |||
| (Section 7.4), and where the representations sent in response to a | located at <https://www.iana.org/assignments/http-fields/>. | |||
| GET request vary based on the Accept-Encoding request header field | Registration requests can be made by following the instructions | |||
| (Section 9.4.3): | located there or by sending an email to the "ietf-http-wg@ietf.org" | |||
| mailing list. | ||||
| >> Request: | Field names are registered on the advice of a Designated Expert | |||
| (appointed by the IESG or their delegate). Fields with the status | ||||
| 'permanent' are Specification Required ([RFC8126], Section 4.6). | ||||
| GET /index HTTP/1.1 | Registration requests consist of at least the following information: | |||
| Host: www.example.com | ||||
| Accept-Encoding: gzip | ||||
| In this case, the response might or might not use the gzip content | Field name: | |||
| coding. If it does not, the response might look like: | The requested field name. It MUST conform to the field-name | |||
| syntax defined in Section 5.4.3, and SHOULD be restricted to just | ||||
| letters, digits, hyphen ('-') and underscore ('_') characters, | ||||
| with the first character being a letter. | ||||
| >> Response: | Status: | |||
| "permanent" or "provisional". | ||||
| HTTP/1.1 200 OK | Specification document(s): | |||
| Date: Fri, 26 Mar 2010 00:05:00 GMT | Reference to the document that specifies the field, preferably | |||
| ETag: "123-a" | including a URI that can be used to retrieve a copy of the | |||
| Content-Length: 70 | document. An indication of the relevant section(s) can also be | |||
| Vary: Accept-Encoding | included, but is not required. | |||
| Content-Type: text/plain | ||||
| Hello World! | And, optionally: | |||
| Hello World! | ||||
| Hello World! | ||||
| Hello World! | ||||
| Hello World! | ||||
| An alternative representation that does use gzip content coding would | Comments: Additional information, such as about reserved entries. | |||
| be: | ||||
| >> Response: | The Expert(s) can define additional fields to be collected in the | |||
| registry, in consultation with the community. | ||||
| HTTP/1.1 200 OK | Standards-defined names have a status of "permanent". Other names | |||
| Date: Fri, 26 Mar 2010 00:05:00 GMT | can also be registered as permanent, if the Expert(s) find that they | |||
| ETag: "123-b" | are in use, in consultation with the community. Other names should | |||
| Content-Length: 43 | be registered as "provisional". | |||
| Vary: Accept-Encoding | ||||
| Content-Type: text/plain | ||||
| Content-Encoding: gzip | ||||
| ...binary data... | Provisional entries can be removed by the Expert(s) if - in | |||
| consultation with the community - the Expert(s) find that they are | ||||
| not in use. The Experts can change a provisional entry's status to | ||||
| permanent at any time. | ||||
| | *Note:* Content codings are a property of the representation | Note that names can be registered by third parties (including the | |||
| | data, so a strong entity-tag for a content-encoded | Expert(s)), if the Expert(s) determines that an unregistered name is | |||
| | representation has to be distinct from the entity tag of an | widely deployed and not likely to be registered in a timely manner | |||
| | unencoded representation to prevent potential conflicts during | otherwise. | |||
| | cache updates and range requests. In contrast, transfer | ||||
| | codings (Section 7 of [Messaging]) apply only during message | ||||
| | transfer and do not result in distinct entity-tags. | ||||
| 11.2.4. When to Use Entity-Tags and Last-Modified Dates | 15.3.2. Considerations for New Field Names | |||
| In 200 (OK) responses to GET or HEAD, an origin server: | There is no limit on the introduction of new field names, each | |||
| presumably defining new semantics. | ||||
| o SHOULD send an entity-tag validator unless it is not feasible to | New fields can be defined such that, when they are understood by a | |||
| generate one. | recipient, they might override or enhance the interpretation of | |||
| previously defined fields, define preconditions on request | ||||
| evaluation, or refine the meaning of responses. | ||||
| o MAY send a weak entity-tag instead of a strong entity-tag, if | Authors of specifications defining new fields are advised to choose a | |||
| performance considerations support the use of weak entity-tags, or | short but descriptive field name. Short names avoid needless data | |||
| if it is unfeasible to send a strong entity-tag. | transmission; descriptive names avoid confusion and "squatting" on | |||
| names that might have broader uses. | ||||
| o SHOULD send a Last-Modified value if it is feasible to send one. | To that end, limited-use fields (such as a header confined to a | |||
| single application or use case) are encouraged to use a name that | ||||
| includes its name (or an abbreviation) as a prefix; for example, if | ||||
| the Foo Application needs a Description field, it might use "Foo- | ||||
| Desc"; "Description" is too generic, and "Foo-Description" is | ||||
| needlessly long. | ||||
| In other words, the preferred behavior for an origin server is to | While the field-name syntax is defined to allow any token character, | |||
| send both a strong entity-tag and a Last-Modified value in successful | in practice some implementations place limits on the characters they | |||
| responses to a retrieval request. | accept in field-names. To be interoperable, new field names SHOULD | |||
| constrain themselves to alphanumeric characters, "-", and ".", and | ||||
| SHOULD begin with an alphanumeric character. | ||||
| A client: | Field names ought not be prefixed with "X-"; see [BCP178] for further | |||
| information. | ||||
| o MUST send that entity-tag in any cache validation request (using | Other prefixes are sometimes used in HTTP field names; for example, | |||
| If-Match or If-None-Match) if an entity-tag has been provided by | "Accept-" is used in many content negotiation headers. These | |||
| the origin server. | prefixes are only an aid to recognizing the purpose of a field, and | |||
| do not trigger automatic processing. | ||||
| o SHOULD send the Last-Modified value in non-subrange cache | 15.3.3. Considerations for New Field Values | |||
| validation requests (using If-Modified-Since) if only a Last- | ||||
| Modified value has been provided by the origin server. | ||||
| o MAY send the Last-Modified value in subrange cache validation | Authors of specifications defining new fields are advised to consider | |||
| requests (using If-Unmodified-Since) if only a Last-Modified value | documenting: | |||
| has been provided by an HTTP/1.0 origin server. The user agent | ||||
| SHOULD provide a way to disable this, in case of difficulty. | ||||
| o SHOULD send both validators in cache validation requests if both | o Whether the field has a singleton or list-based value (see | |||
| an entity-tag and a Last-Modified value have been provided by the | Section 5.4.4). | |||
| origin server. This allows both HTTP/1.0 and HTTP/1.1 caches to | ||||
| respond appropriately. | ||||
| 11.3. Authentication Challenges | If it is a singleton field, document how to treat messages where | |||
| the multiple members are present (a sensible default would be to | ||||
| ignore the field, but this might not always be the right choice). | ||||
| Authentication challenges indicate what mechanisms are available for | Note that intermediaries and software libraries might combine | |||
| the client to provide authentication credentials in future requests. | multiple field instances into a single one, despite the field | |||
| being defined as a singleton. A robust format enables recipients | ||||
| to discover these situations (good example: "Content-Type", as the | ||||
| comma can only appear inside quoted strings; bad example: | ||||
| "Location", as a comma can occur inside a URI). | ||||
| -------------------- -------- | o Under what conditions the field can be used; e.g., only in | |||
| Field Name Ref. | responses or requests, in all messages, only on responses to a | |||
| -------------------- -------- | particular request method, etc. | |||
| WWW-Authenticate 11.3.1 | ||||
| Proxy-Authenticate 11.3.2 | ||||
| -------------------- -------- | ||||
| Table 22 | o What the scope of applicability for the information conveyed in | |||
| the field is. By default, fields apply only to the message they | ||||
| are associated with, but some response fields are designed to | ||||
| apply to all representations of a resource, the resource itself, | ||||
| or an even broader scope. Specifications that expand the scope of | ||||
| a response field will need to carefully consider issues such as | ||||
| content negotiation, the time period of applicability, and (in | ||||
| some cases) multi-tenant server deployments. | ||||
| Furthermore, the "Authentication-Info" and "Proxy-Authentication- | o Whether the field should be stored by origin servers that | |||
| Info" response header fields are defined for use in authentication | understand it upon a PUT request. | |||
| schemes that need to return information once the client's | ||||
| authentication credentials have been accepted. | ||||
| --------------------------- -------- | o Whether the field semantics are further refined by the context, | |||
| Field Name Ref. | such as by existing request methods or status codes. | |||
| --------------------------- -------- | ||||
| Authentication-Info 11.3.3 | ||||
| Proxy-Authentication-Info 11.3.4 | ||||
| --------------------------- -------- | ||||
| Table 23 | o Whether it is appropriate to list the field name in the Connection | |||
| header field (i.e., if the field is to be hop-by-hop; see | ||||
| Section 6.4.1). | ||||
| 11.3.1. WWW-Authenticate | o Under what conditions intermediaries are allowed to insert, | |||
| delete, or modify the field's value. | ||||
| The "WWW-Authenticate" header field indicates the authentication | o Whether it is appropriate to list the field name in a Vary | |||
| scheme(s) and parameters applicable to the target resource. | response header field (e.g., when the request header field is used | |||
| by an origin server's content selection algorithm; see | ||||
| Section 11.2.1). | ||||
| WWW-Authenticate = #challenge | o Whether the field is allowable in trailers (see Section 5.6). | |||
| A server generating a 401 (Unauthorized) response MUST send a WWW- | o Whether the field ought to be preserved across redirects. | |||
| Authenticate header field containing at least one challenge. A | ||||
| server MAY generate a WWW-Authenticate header field in other response | ||||
| messages to indicate that supplying credentials (or different | ||||
| credentials) might affect the response. | ||||
| A proxy forwarding a response MUST NOT modify any WWW-Authenticate | o Whether it introduces any additional security considerations, such | |||
| fields in that response. | as disclosure of privacy-related data. | |||
| User agents are advised to take special care in parsing the field | 15.4. Authentication Scheme Extensibility | |||
| value, as it might contain more than one challenge, and each | ||||
| challenge can contain a comma-separated list of authentication | ||||
| parameters. Furthermore, the header field itself can occur multiple | ||||
| times. | ||||
| For instance: | 15.4.1. Authentication Scheme Registry | |||
| WWW-Authenticate: Newauth realm="apps", type=1, | The "Hypertext Transfer Protocol (HTTP) Authentication Scheme | |||
| title="Login to \"apps\"", Basic realm="simple" | Registry" defines the namespace for the authentication schemes in | |||
| challenges and credentials. It is maintained at | ||||
| <https://www.iana.org/assignments/http-authschemes>. | ||||
| This header field contains two challenges; one for the "Newauth" | Registrations MUST include the following fields: | |||
| scheme with a realm value of "apps", and two additional parameters | ||||
| "type" and "title", and another one for the "Basic" scheme with a | ||||
| realm value of "simple". | ||||
| Some user agents do not recognise this form, however. As a result, | o Authentication Scheme Name | |||
| sending a WWW-Authenticate field value with more than one member on | ||||
| the same field line might not be interoperable. | ||||
| | *Note:* The challenge grammar production uses the list syntax | o Pointer to specification text | |||
| | as well. Therefore, a sequence of comma, whitespace, and comma | ||||
| | can be considered either as applying to the preceding | ||||
| | challenge, or to be an empty entry in the list of challenges. | ||||
| | In practice, this ambiguity does not affect the semantics of | ||||
| | the header field value and thus is harmless. | ||||
| 11.3.2. Proxy-Authenticate | o Notes (optional) | |||
| The "Proxy-Authenticate" header field consists of at least one | Values to be added to this namespace require IETF Review (see | |||
| challenge that indicates the authentication scheme(s) and parameters | [RFC8126], Section 4.8). | |||
| applicable to the proxy for this request. A proxy MUST send at least | ||||
| one Proxy-Authenticate header field in each 407 (Proxy Authentication | ||||
| Required) response that it generates. | ||||
| Proxy-Authenticate = #challenge | 15.4.2. Considerations for New Authentication Schemes | |||
| Unlike WWW-Authenticate, the Proxy-Authenticate header field applies | There are certain aspects of the HTTP Authentication framework that | |||
| only to the next outbound client on the response chain. This is | put constraints on how new authentication schemes can work: | |||
| because only the client that chose a given proxy is likely to have | ||||
| the credentials necessary for authentication. However, when multiple | ||||
| proxies are used within the same administrative domain, such as | ||||
| office and regional caching proxies within a large corporate network, | ||||
| it is common for credentials to be generated by the user agent and | ||||
| passed through the hierarchy until consumed. Hence, in such a | ||||
| configuration, it will appear as if Proxy-Authenticate is being | ||||
| forwarded because each proxy will send the same challenge set. | ||||
| Note that the parsing considerations for WWW-Authenticate apply to | o HTTP authentication is presumed to be stateless: all of the | |||
| this header field as well; see Section 11.3.1 for details. | information necessary to authenticate a request MUST be provided | |||
| in the request, rather than be dependent on the server remembering | ||||
| prior requests. Authentication based on, or bound to, the | ||||
| underlying connection is outside the scope of this specification | ||||
| and inherently flawed unless steps are taken to ensure that the | ||||
| connection cannot be used by any party other than the | ||||
| authenticated user (see Section 3.7). | ||||
| 11.3.3. Authentication-Info | o The authentication parameter "realm" is reserved for defining | |||
| protection spaces as described in Section 10.5. New schemes MUST | ||||
| NOT use it in a way incompatible with that definition. | ||||
| HTTP authentication schemes can use the Authentication-Info response | o The "token68" notation was introduced for compatibility with | |||
| header field to communicate information after the client's | existing authentication schemes and can only be used once per | |||
| authentication credentials have been accepted. This information can | challenge or credential. Thus, new schemes ought to use the auth- | |||
| include a finalization message from the server (e.g., it can contain | param syntax instead, because otherwise future extensions will be | |||
| the server authentication). | impossible. | |||
| The field value is a list of parameters (name/value pairs), using the | o The parsing of challenges and credentials is defined by this | |||
| "auth-param" syntax defined in Section 9.5.1. This specification | specification and cannot be modified by new authentication | |||
| only describes the generic format; authentication schemes using | schemes. When the auth-param syntax is used, all parameters ought | |||
| Authentication-Info will define the individual parameters. The | to support both token and quoted-string syntax, and syntactical | |||
| "Digest" Authentication Scheme, for instance, defines multiple | constraints ought to be defined on the field value after parsing | |||
| parameters in Section 3.5 of [RFC7616]. | (i.e., quoted-string processing). This is necessary so that | |||
| recipients can use a generic parser that applies to all | ||||
| authentication schemes. | ||||
| Authentication-Info = #auth-param | *Note:* The fact that the value syntax for the "realm" parameter | |||
| is restricted to quoted-string was a bad design choice not to be | ||||
| repeated for new parameters. | ||||
| The Authentication-Info header field can be used in any HTTP | o Definitions of new schemes ought to define the treatment of | |||
| response, independently of request method and status code. Its | unknown extension parameters. In general, a "must-ignore" rule is | |||
| semantics are defined by the authentication scheme indicated by the | preferable to a "must-understand" rule, because otherwise it will | |||
| Authorization header field (Section 9.5.3) of the corresponding | be hard to introduce new parameters in the presence of legacy | |||
| request. | recipients. Furthermore, it's good to describe the policy for | |||
| defining new parameters (such as "update the specification" or | ||||
| "use this registry"). | ||||
| A proxy forwarding a response is not allowed to modify the field | o Authentication schemes need to document whether they are usable in | |||
| value in any way. | origin-server authentication (i.e., using WWW-Authenticate), and/ | |||
| or proxy authentication (i.e., using Proxy-Authenticate). | ||||
| Authentication-Info can be sent as a trailer field (Section 5.6) when | o The credentials carried in an Authorization header field are | |||
| the authentication scheme explicitly allows this. | specific to the user agent and, therefore, have the same effect on | |||
| HTTP caches as the "private" Cache-Control response directive | ||||
| (Section 5.2.2.7 of [Caching]), within the scope of the request in | ||||
| which they appear. | ||||
| 11.3.3.1. Parameter Value Format | Therefore, new authentication schemes that choose not to carry | |||
| credentials in the Authorization header field (e.g., using a newly | ||||
| defined header field) will need to explicitly disallow caching, by | ||||
| mandating the use of Cache-Control response directives (e.g., | ||||
| "private"). | ||||
| Parameter values can be expressed either as "token" or as "quoted- | o Schemes using Authentication-Info, Proxy-Authentication-Info, or | |||
| string" (Section 5.4.1). | any other authentication related response header field need to | |||
| consider and document the related security considerations (see | ||||
| Section 16.15.4). | ||||
| Authentication scheme definitions need to allow both notations, both | 15.5. Range Unit Extensibility | |||
| for senders and recipients. This allows recipients to use generic | ||||
| parsing components, independent of the authentication scheme in use. | ||||
| For backwards compatibility, authentication scheme definitions can | 15.5.1. Range Unit Registry | |||
| restrict the format for senders to one of the two variants. This can | ||||
| be important when it is known that deployed implementations will fail | ||||
| when encountering one of the two formats. | ||||
| 11.3.4. Proxy-Authentication-Info | The "HTTP Range Unit Registry" defines the namespace for the range | |||
| unit names and refers to their corresponding specifications. It is | ||||
| maintained at <https://www.iana.org/assignments/http-parameters>. | ||||
| The Proxy-Authentication-Info response header field is equivalent to | Registration of an HTTP Range Unit MUST include the following fields: | |||
| Authentication-Info, except that it applies to proxy authentication | ||||
| (Section 9.5.1) and its semantics are defined by the authentication | ||||
| scheme indicated by the Proxy-Authorization header field | ||||
| (Section 9.5.4) of the corresponding request: | ||||
| Proxy-Authentication-Info = #auth-param | o Name | |||
| However, unlike Authentication-Info, the Proxy-Authentication-Info | o Description | |||
| header field applies only to the next outbound client on the response | ||||
| chain. This is because only the client that chose a given proxy is | ||||
| likely to have the credentials necessary for authentication. | ||||
| However, when multiple proxies are used within the same | ||||
| administrative domain, such as office and regional caching proxies | ||||
| within a large corporate network, it is common for credentials to be | ||||
| generated by the user agent and passed through the hierarchy until | ||||
| consumed. Hence, in such a configuration, it will appear as if | ||||
| Proxy-Authentication-Info is being forwarded because each proxy will | ||||
| send the same field value. | ||||
| 11.4. Response Context | o Pointer to specification text | |||
| The remaining response header fields provide more information about | Values to be added to this namespace require IETF Review (see | |||
| the target resource for potential use in later requests. | [RFC8126], Section 4.8). | |||
| --------------- -------- | 15.5.2. Considerations for New Range Units | |||
| Field Name Ref. | ||||
| --------------- -------- | ||||
| Accept-Ranges 11.4.1 | ||||
| Allow 11.4.2 | ||||
| Server 11.4.3 | ||||
| --------------- -------- | ||||
| Table 24 | Other range units, such as format-specific boundaries like pages, | |||
| sections, records, rows, or time, are potentially usable in HTTP for | ||||
| application-specific purposes, but are not commonly used in practice. | ||||
| Implementors of alternative range units ought to consider how they | ||||
| would work with content codings and general-purpose intermediaries. | ||||
| 11.4.1. Accept-Ranges | 15.6. Content Coding Extensibility | |||
| The "Accept-Ranges" header field allows a server to indicate that it | 15.6.1. Content Coding Registry | |||
| supports range requests for the target resource. | ||||
| Accept-Ranges = acceptable-ranges | The "HTTP Content Coding Registry", maintained by IANA at | |||
| acceptable-ranges = 1#range-unit / "none" | <https://www.iana.org/assignments/http-parameters/>, registers | |||
| content-coding names. | ||||
| An origin server that supports byte-range requests for a given target | Content coding registrations MUST include the following fields: | |||
| resource MAY send | ||||
| Accept-Ranges: bytes | o Name | |||
| to indicate what range units are supported. A client MAY generate | o Description | |||
| range requests without having received this header field for the | ||||
| resource involved. Range units are defined in Section 7.1.4. | ||||
| A server that does not support any kind of range request for the | o Pointer to specification text | |||
| target resource MAY send | ||||
| Accept-Ranges: none | Names of content codings MUST NOT overlap with names of transfer | |||
| codings (Section 7 of [Messaging]), unless the encoding | ||||
| transformation is identical (as is the case for the compression | ||||
| codings defined in Section 7.5.1). | ||||
| to advise the client not to attempt a range request. | Values to be added to this namespace require IETF Review (see | |||
| Section 4.8 of [RFC8126]) and MUST conform to the purpose of content | ||||
| coding defined in Section 7.5.1. | ||||
| 11.4.2. Allow | 15.6.2. Considerations for New Content Codings | |||
| The "Allow" header field lists the set of methods advertised as | New content codings ought to be self-descriptive whenever possible, | |||
| supported by the target resource. The purpose of this field is | with optional parameters discoverable within the coding format | |||
| strictly to inform the recipient of valid request methods associated | itself, rather than rely on external metadata that might be lost | |||
| with the resource. | during transit. | |||
| Allow = #method | 15.7. Upgrade Token Registry | |||
| Example of use: | The "Hypertext Transfer Protocol (HTTP) Upgrade Token Registry" | |||
| defines the namespace for protocol-name tokens used to identify | ||||
| protocols in the Upgrade header field. The registry is maintained at | ||||
| <https://www.iana.org/assignments/http-upgrade-tokens>. | ||||
| Allow: GET, HEAD, PUT | Each registered protocol name is associated with contact information | |||
| and an optional set of specifications that details how the connection | ||||
| will be processed after it has been upgraded. | ||||
| The actual set of allowed methods is defined by the origin server at | Registrations happen on a "First Come First Served" basis (see | |||
| the time of each request. An origin server MUST generate an Allow | Section 4.4 of [RFC8126]) and are subject to the following rules: | |||
| field in a 405 (Method Not Allowed) response and MAY do so in any | ||||
| other response. An empty Allow field value indicates that the | ||||
| resource allows no methods, which might occur in a 405 response if | ||||
| the resource has been temporarily disabled by configuration. | ||||
| A proxy MUST NOT modify the Allow header field - it does not need to | 1. A protocol-name token, once registered, stays registered forever. | |||
| understand all of the indicated methods in order to handle them | ||||
| according to the generic message handling rules. | ||||
| 11.4.3. Server | 2. A protocol-name token is case-insensitive and registered with the | |||
| preferred case to be generated by senders. | ||||
| The "Server" header field contains information about the software | 3. The registration MUST name a responsible party for the | |||
| used by the origin server to handle the request, which is often used | registration. | |||
| by clients to help identify the scope of reported interoperability | ||||
| problems, to work around or tailor requests to avoid particular | ||||
| server limitations, and for analytics regarding server or operating | ||||
| system use. An origin server MAY generate a Server field in its | ||||
| responses. | ||||
| Server = product *( RWS ( product / comment ) ) | 4. The registration MUST name a point of contact. | |||
| The Server field value consists of one or more product identifiers, | 5. The registration MAY name a set of specifications associated with | |||
| each followed by zero or more comments (Section 5.4.1.3), which | that token. Such specifications need not be publicly available. | |||
| together identify the origin server software and its significant | ||||
| subproducts. By convention, the product identifiers are listed in | ||||
| decreasing order of their significance for identifying the origin | ||||
| server software. Each product identifier consists of a name and | ||||
| optional version, as defined in Section 9.6.3. | ||||
| Example: | 6. The registration SHOULD name a set of expected "protocol-version" | |||
| tokens associated with that token at the time of registration. | ||||
| Server: CERN/3.0 libwww/2.17 | 7. The responsible party MAY change the registration at any time. | |||
| The IANA will keep a record of all such changes, and make them | ||||
| available upon request. | ||||
| An origin server SHOULD NOT generate a Server field containing | 8. The IESG MAY reassign responsibility for a protocol token. This | |||
| needlessly fine-grained detail and SHOULD limit the addition of | will normally only be used in the case when a responsible party | |||
| subproducts by third parties. Overly long and detailed Server field | cannot be contacted. | |||
| values increase response latency and potentially reveal internal | ||||
| implementation details that might make it (slightly) easier for | ||||
| attackers to find and exploit known security holes. | ||||
| 12. Security Considerations | 16. 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 relevant to HTTP semantics and | and users of known security concerns relevant to HTTP semantics and | |||
| its use for transferring information over the Internet. | its use for transferring information over the Internet. | |||
| Considerations related to message syntax, parsing, and routing are | Considerations related to message syntax, parsing, and routing are | |||
| discussed in Section 11 of [Messaging]. | discussed in Section 11 of [Messaging]. | |||
| The list of considerations below is not exhaustive. Most security | The list of considerations below is not exhaustive. Most security | |||
| concerns related to HTTP semantics are about securing server-side | concerns related to HTTP semantics are about securing server-side | |||
| applications (code behind the HTTP interface), securing user agent | applications (code behind the HTTP interface), securing user agent | |||
| processing of payloads received via HTTP, or secure use of the | processing of payloads received via HTTP, or secure use of the | |||
| Internet in general, rather than security of the protocol. Various | Internet in general, rather than security of the protocol. Various | |||
| organizations maintain topical information and links to current | organizations maintain topical information and links to current | |||
| research on Web application security (e.g., [OWASP]). | research on Web application security (e.g., [OWASP]). | |||
| 12.1. Establishing Authority | 16.1. Establishing Authority | |||
| HTTP relies on the notion of an authoritative response: a response | HTTP relies on the notion of an authoritative response: a response | |||
| that has been determined by (or at the direction of) the origin | that has been determined by (or at the direction of) the origin | |||
| server identified within the target URI to be the most appropriate | server identified within the target URI to be the most appropriate | |||
| response for that request given the state of the target resource at | response for that request given the state of the target resource at | |||
| the time of response message origination. | the time of response message origination. | |||
| When a registered name is used in the authority component, the "http" | When a registered name is used in the authority component, the "http" | |||
| URI scheme (Section 2.5.1) relies on the user's local name resolution | URI scheme (Section 4.2.1) relies on the user's local name resolution | |||
| service to determine where it can find authoritative responses. This | service to determine where it can find authoritative responses. This | |||
| means that any attack on a user's network host table, cached names, | means that any attack on a user's network host table, cached names, | |||
| or name resolution libraries becomes an avenue for attack on | or name resolution libraries becomes an avenue for attack on | |||
| establishing authority for "http" URIs. Likewise, the user's choice | establishing authority for "http" URIs. Likewise, the user's choice | |||
| of server for Domain Name Service (DNS), and the hierarchy of servers | of server for Domain Name Service (DNS), and the hierarchy of servers | |||
| from which it obtains resolution results, could impact the | from which it obtains resolution results, could impact the | |||
| authenticity of address mappings; DNS Security Extensions (DNSSEC, | authenticity of address mappings; DNS Security Extensions (DNSSEC, | |||
| [RFC4033]) are one way to improve authenticity. | [RFC4033]) are one way to improve authenticity. | |||
| Furthermore, after an IP address is obtained, establishing authority | Furthermore, after an IP address is obtained, establishing authority | |||
| for an "http" URI is vulnerable to attacks on Internet Protocol | for an "http" URI is vulnerable to attacks on Internet Protocol | |||
| routing. | routing. | |||
| The "https" scheme (Section 2.5.2) is intended to prevent (or at | The "https" scheme (Section 4.2.2) is intended to prevent (or at | |||
| least reveal) many of these potential attacks on establishing | least reveal) many of these potential attacks on establishing | |||
| authority, provided that the negotiated connection is secured and the | authority, provided that the negotiated connection is secured and the | |||
| client properly verifies that the communicating server's identity | client properly verifies that the communicating server's identity | |||
| matches the target URI's authority component (Section 6.3.3.3). | matches the target URI's authority component (Section 4.3.4). | |||
| Correctly implementing such verification can be difficult (see | Correctly implementing such verification can be difficult (see | |||
| [Georgiev]). | [Georgiev]). | |||
| Authority for a given origin server can be delegated through protocol | Authority for a given origin server can be delegated through protocol | |||
| extensions; for example, [RFC7838]. Likewise, the set of servers | extensions; for example, [RFC7838]. Likewise, the set of servers | |||
| that a connection is considered authoritative for can be changed with | that a connection is considered authoritative for can be changed with | |||
| a protocol extension like [RFC8336]. | a protocol extension like [RFC8336]. | |||
| Providing a response from a non-authoritative source, such as a | Providing a response from a non-authoritative source, such as a | |||
| shared proxy cache, is often useful to improve performance and | shared proxy cache, is often useful to improve performance and | |||
| availability, but only to the extent that the source can be trusted | availability, but only to the extent that the source can be trusted | |||
| or the distrusted response can be safely used. | or the distrusted response can be safely used. | |||
| Unfortunately, communicating authority to users can be difficult. | Unfortunately, communicating authority to users can be difficult. | |||
| For example, phishing is an attack on the user's perception of | For example, phishing is an attack on the user's perception of | |||
| authority, where that perception can be misled by presenting similar | authority, where that perception can be misled by presenting similar | |||
| branding in hypertext, possibly aided by userinfo obfuscating the | branding in hypertext, possibly aided by userinfo obfuscating the | |||
| authority component (see Section 2.5.1). User agents can reduce the | authority component (see Section 4.2.1). User agents can reduce the | |||
| impact of phishing attacks by enabling users to easily inspect a | impact of phishing attacks by enabling users to easily inspect a | |||
| target URI prior to making an action, by prominently distinguishing | target URI prior to making an action, by prominently distinguishing | |||
| (or rejecting) userinfo when present, and by not sending stored | (or rejecting) userinfo when present, and by not sending stored | |||
| credentials and cookies when the referring document is from an | credentials and cookies when the referring document is from an | |||
| unknown or untrusted source. | unknown or untrusted source. | |||
| 12.2. Risks of Intermediaries | 16.2. Risks of Intermediaries | |||
| HTTP intermediaries are inherently situated for on-path attacks. | HTTP intermediaries are inherently situated for on-path attacks. | |||
| Compromise of the systems on which the intermediaries run can result | Compromise of the systems on which the intermediaries run can result | |||
| in serious security and privacy problems. Intermediaries might have | in serious security and privacy problems. Intermediaries might have | |||
| access to security-related information, personal information about | access to security-related information, personal information about | |||
| individual users and organizations, and proprietary information | individual users and organizations, and proprietary information | |||
| belonging to users and content providers. A compromised | belonging to users and content providers. A compromised | |||
| intermediary, or an intermediary implemented or configured without | intermediary, or an intermediary implemented or configured without | |||
| regard to security and privacy considerations, might be used in the | regard to security and privacy considerations, might be used in the | |||
| commission of a wide range of potential attacks. | commission of a wide range of potential attacks. | |||
| skipping to change at page 179, line 5 ¶ | skipping to change at page 176, line 39 ¶ | |||
| to cache poisoning attacks, as described in Section 7 of [Caching]. | to cache poisoning attacks, as described in Section 7 of [Caching]. | |||
| Implementers need to consider the privacy and security implications | Implementers need to consider the privacy and security implications | |||
| of their design and coding decisions, and of the configuration | of their design and coding decisions, and of the configuration | |||
| options they provide to operators (especially the default | options they provide to operators (especially the default | |||
| configuration). | configuration). | |||
| Users need to be aware that intermediaries are no more trustworthy | Users need to be aware that intermediaries are no more trustworthy | |||
| than the people who run them; HTTP itself cannot solve this problem. | than the people who run them; HTTP itself cannot solve this problem. | |||
| 12.3. Attacks Based on File and Path Names | 16.3. Attacks Based on File and Path Names | |||
| Origin servers frequently make use of their local file system to | Origin servers frequently make use of their local file system to | |||
| manage the mapping from target URI to resource representations. Most | manage the mapping from target URI to resource representations. Most | |||
| file systems are not designed to protect against malicious file or | file systems are not designed to protect against malicious file or | |||
| path names. Therefore, an origin server needs to avoid accessing | path names. Therefore, an origin server needs to avoid accessing | |||
| names that have a special significance to the system when mapping the | names that have a special significance to the system when mapping the | |||
| target resource to files, folders, or directories. | target resource to files, folders, or directories. | |||
| For example, UNIX, Microsoft Windows, and other operating systems use | For example, UNIX, Microsoft Windows, and other operating systems use | |||
| ".." as a path component to indicate a directory level above the | ".." as a path component to indicate a directory level above the | |||
| skipping to change at page 179, line 29 ¶ | skipping to change at page 177, line 14 ¶ | |||
| systems have an annoying tendency to prefer user-friendliness over | systems have an annoying tendency to prefer user-friendliness over | |||
| security when handling invalid or unexpected characters, | security when handling invalid or unexpected characters, | |||
| recomposition of decomposed characters, and case-normalization of | recomposition of decomposed characters, and case-normalization of | |||
| case-insensitive names. | case-insensitive names. | |||
| Attacks based on such special names tend to focus on either denial- | Attacks based on such special names tend to focus on either denial- | |||
| of-service (e.g., telling the server to read from a COM port) or | of-service (e.g., telling the server to read from a COM port) or | |||
| disclosure of configuration and source files that are not meant to be | disclosure of configuration and source files that are not meant to be | |||
| served. | served. | |||
| 12.4. Attacks Based on Command, Code, or Query Injection | 16.4. Attacks Based on Command, Code, or Query Injection | |||
| Origin servers often use parameters within the URI as a means of | Origin servers often use parameters within the URI as a means of | |||
| identifying system services, selecting database entries, or choosing | identifying system services, selecting database entries, or choosing | |||
| a data source. However, data received in a request cannot be | a data source. However, data received in a request cannot be | |||
| trusted. An attacker could construct any of the request data | trusted. An attacker could construct any of the request data | |||
| elements (method, target URI, header fields, or body) to contain data | elements (method, target URI, header fields, or body) to contain data | |||
| that might be misinterpreted as a command, code, or query when passed | that might be misinterpreted as a command, code, or query when passed | |||
| through a command invocation, language interpreter, or database | through a command invocation, language interpreter, or database | |||
| interface. | interface. | |||
| skipping to change at page 180, line 17 ¶ | skipping to change at page 177, line 45 ¶ | |||
| Parameters ought to be compared to fixed strings and acted upon as a | Parameters ought to be compared to fixed strings and acted upon as a | |||
| result of that comparison, rather than passed through an interface | result of that comparison, rather than passed through an interface | |||
| that is not prepared for untrusted data. Received data that isn't | that is not prepared for untrusted data. Received data that isn't | |||
| based on fixed parameters ought to be carefully filtered or encoded | based on fixed parameters ought to be carefully filtered or encoded | |||
| to avoid being misinterpreted. | to avoid being misinterpreted. | |||
| Similar considerations apply to request data when it is stored and | Similar considerations apply to request data when it is stored and | |||
| later processed, such as within log files, monitoring tools, or when | later processed, such as within log files, monitoring tools, or when | |||
| included within a data format that allows embedded scripts. | included within a data format that allows embedded scripts. | |||
| 12.5. Attacks via Protocol Element Length | 16.5. Attacks via Protocol Element Length | |||
| Because HTTP uses mostly textual, character-delimited fields, parsers | Because HTTP uses mostly textual, character-delimited fields, parsers | |||
| are often vulnerable to attacks based on sending very long (or very | are often vulnerable to attacks based on sending very long (or very | |||
| slow) streams of data, particularly where an implementation is | slow) streams of data, particularly where an implementation is | |||
| expecting a protocol element with no predefined length (Section 3.3). | expecting a protocol element with no predefined length (Section 2.3). | |||
| To promote interoperability, specific recommendations are made for | To promote interoperability, specific recommendations are made for | |||
| minimum size limits on fields (Section 5.2). These are minimum | minimum size limits on fields (Section 5.4.2). These are minimum | |||
| recommendations, chosen to be supportable even by implementations | recommendations, chosen to be supportable even by implementations | |||
| with limited resources; it is expected that most implementations will | with limited resources; it is expected that most implementations will | |||
| choose substantially higher limits. | choose substantially higher limits. | |||
| A server can reject a message that has a target URI that is too long | A server can reject a message that has a target URI that is too long | |||
| (Section 10.5.15) or a request payload that is too large | (Section 14.5.15) or a request payload that is too large | |||
| (Section 10.5.14). Additional status codes related to capacity | (Section 14.5.14). Additional status codes related to capacity | |||
| limits have been defined by extensions to HTTP [RFC6585]. | limits have been defined by extensions to HTTP [RFC6585]. | |||
| Recipients ought to carefully limit the extent to which they process | Recipients ought to carefully limit the extent to which they process | |||
| other protocol elements, including (but not limited to) request | other protocol elements, including (but not limited to) request | |||
| methods, response status phrases, field names, numeric values, and | methods, response status phrases, field names, numeric values, and | |||
| body chunks. Failure to limit such processing can result in buffer | body chunks. Failure to limit such processing can result in buffer | |||
| overflows, arithmetic overflows, or increased vulnerability to | overflows, arithmetic overflows, or increased vulnerability to | |||
| denial-of-service attacks. | denial-of-service attacks. | |||
| 12.6. Attacks using Shared-dictionary Compression | 16.6. Attacks using Shared-dictionary Compression | |||
| Some attacks on encrypted protocols use the differences in size | Some attacks on encrypted protocols use the differences in size | |||
| created by dynamic compression to reveal confidential information; | created by dynamic compression to reveal confidential information; | |||
| for example, [BREACH]. These attacks rely on creating a redundancy | for example, [BREACH]. These attacks rely on creating a redundancy | |||
| between attacker-controlled content and the confidential information, | between attacker-controlled content and the confidential information, | |||
| such that a dynamic compression algorithm using the same dictionary | such that a dynamic compression algorithm using the same dictionary | |||
| for both content will compress more efficiently when the attacker- | for both content will compress more efficiently when the attacker- | |||
| controlled content matches parts of the confidential content. | controlled content matches parts of the confidential content. | |||
| HTTP messages can be compressed in a number of ways, including using | HTTP messages can be compressed in a number of ways, including using | |||
| TLS compression, content-codings, transfer-codings, and other | TLS compression, content-codings, transfer-codings, and other | |||
| extension or version-specific mechanisms. | extension or version-specific mechanisms. | |||
| The most effective mitigation for this risk is to disable compression | The most effective mitigation for this risk is to disable compression | |||
| on sensitive data, or to strictly separate sensitive data from | on sensitive data, or to strictly separate sensitive data from | |||
| attacker-controlled data so that they cannot share the same | attacker-controlled data so that they cannot share the same | |||
| compression dictionary. With careful design, a compression scheme | compression dictionary. With careful design, a compression scheme | |||
| can be designed in a way that is not considered exploitable in | can be designed in a way that is not considered exploitable in | |||
| limited use cases, such as HPACK ([RFC7541]). | limited use cases, such as HPACK ([RFC7541]). | |||
| 12.7. Disclosure of Personal Information | 16.7. Disclosure of Personal Information | |||
| Clients are often privy to large amounts of personal information, | Clients are often privy to large amounts of personal information, | |||
| including both information provided by the user to interact with | including both information provided by the user to interact with | |||
| resources (e.g., the user's name, location, mail address, passwords, | resources (e.g., the user's name, location, mail address, passwords, | |||
| encryption keys, etc.) and information about the user's browsing | encryption keys, etc.) and information about the user's browsing | |||
| activity over time (e.g., history, bookmarks, etc.). Implementations | activity over time (e.g., history, bookmarks, etc.). Implementations | |||
| need to prevent unintentional disclosure of personal information. | need to prevent unintentional disclosure of personal information. | |||
| 12.8. Privacy of Server Log Information | 16.8. Privacy of Server Log Information | |||
| A server is in the position to save personal data about a user's | A server is in the position to save personal data about a user's | |||
| requests over time, which might identify their reading patterns or | requests over time, which might identify their reading patterns or | |||
| subjects of interest. In particular, log information gathered at an | subjects of interest. In particular, log information gathered at an | |||
| intermediary often contains a history of user agent interaction, | intermediary often contains a history of user agent interaction, | |||
| across a multitude of sites, that can be traced to individual users. | across a multitude of sites, that can be traced to individual users. | |||
| HTTP log information is confidential in nature; its handling is often | HTTP log information is confidential in nature; its handling is often | |||
| constrained by laws and regulations. Log information needs to be | constrained by laws and regulations. Log information needs to be | |||
| securely stored and appropriate guidelines followed for its analysis. | securely stored and appropriate guidelines followed for its analysis. | |||
| skipping to change at page 182, line 5 ¶ | skipping to change at page 179, line 29 ¶ | |||
| characteristics. As such, access traces that are keyed to a specific | characteristics. As such, access traces that are keyed to a specific | |||
| client are unsafe to publish even if the key is pseudonymous. | client are unsafe to publish even if the key is pseudonymous. | |||
| To minimize the risk of theft or accidental publication, log | To minimize the risk of theft or accidental publication, log | |||
| information ought to be purged of personally identifiable | information ought to be purged of personally identifiable | |||
| information, including user identifiers, IP addresses, and user- | information, including user identifiers, IP addresses, and user- | |||
| provided query parameters, as soon as that information is no longer | provided query parameters, as soon as that information is no longer | |||
| necessary to support operational needs for security, auditing, or | necessary to support operational needs for security, auditing, or | |||
| fraud control. | fraud control. | |||
| 12.9. Disclosure of Sensitive Information in URIs | 16.9. Disclosure of Sensitive Information in URIs | |||
| URIs are intended to be shared, not secured, even when they identify | URIs are intended to be shared, not secured, even when they identify | |||
| secure resources. URIs are often shown on displays, added to | secure resources. URIs are often shown on displays, added to | |||
| templates when a page is printed, and stored in a variety of | templates when a page is printed, and stored in a variety of | |||
| unprotected bookmark lists. Many servers, proxies, and user agents | unprotected bookmark lists. Many servers, proxies, and user agents | |||
| log or display the target URI in places where it might be visible to | log or display the target URI in places where it might be visible to | |||
| third parties. It is therefore unwise to include information within | third parties. It is therefore unwise to include information within | |||
| a URI that is sensitive, personally identifiable, or a risk to | a URI that is sensitive, personally identifiable, or a risk to | |||
| disclose. | disclose. | |||
| skipping to change at page 182, line 36 ¶ | skipping to change at page 180, line 25 ¶ | |||
| values that are not sensitive. Likewise, redirecting the result of a | values that are not sensitive. Likewise, redirecting the result of a | |||
| query to a different (server-generated) URI can remove potentially | query to a different (server-generated) URI can remove potentially | |||
| sensitive data from later links and provide a cacheable response for | sensitive data from later links and provide a cacheable response for | |||
| later reuse. | later reuse. | |||
| Since the Referer header field tells a target site about the context | Since the Referer header field tells a target site about the context | |||
| that resulted in a request, it has the potential to reveal | that resulted in a request, it has the potential to reveal | |||
| information about the user's immediate browsing history and any | information about the user's immediate browsing history and any | |||
| personal information that might be found in the referring resource's | personal information that might be found in the referring resource's | |||
| URI. Limitations on the Referer header field are described in | URI. Limitations on the Referer header field are described in | |||
| Section 9.6.2 to address some of its security considerations. | Section 9.1.3 to address some of its security considerations. | |||
| 12.10. Disclosure of Fragment after Redirects | 16.10. Disclosure of Fragment after Redirects | |||
| Although fragment identifiers used within URI references are not sent | Although fragment identifiers used within URI references are not sent | |||
| in requests, implementers ought to be aware that they will be visible | in requests, implementers ought to be aware that they will be visible | |||
| to the user agent and any extensions or scripts running as a result | to the user agent and any extensions or scripts running as a result | |||
| of the response. In particular, when a redirect occurs and the | of the response. In particular, when a redirect occurs and the | |||
| original request's fragment identifier is inherited by the new | original request's fragment identifier is inherited by the new | |||
| reference in Location (Section 11.1.2), this might have the effect of | reference in Location (Section 9.2.3), this might have the effect of | |||
| disclosing one site's fragment to another site. If the first site | disclosing one site's fragment to another site. If the first site | |||
| uses personal information in fragments, it ought to ensure that | uses personal information in fragments, it ought to ensure that | |||
| redirects to other sites include a (possibly empty) fragment | redirects to other sites include a (possibly empty) fragment | |||
| component in order to block that inheritance. | component in order to block that inheritance. | |||
| 12.11. Disclosure of Product Information | 16.11. Disclosure of Product Information | |||
| The User-Agent (Section 9.6.3), Via (Section 6.6.1), and Server | The User-Agent (Section 9.1.6), Via (Section 6.4.3), and Server | |||
| (Section 11.4.3) header fields often reveal information about the | (Section 9.2.5) header fields often reveal information about the | |||
| respective sender's software systems. In theory, this can make it | respective sender's software systems. In theory, this can make it | |||
| easier for an attacker to exploit known security holes; in practice, | easier for an attacker to exploit known security holes; in practice, | |||
| attackers tend to try all potential holes regardless of the apparent | attackers tend to try all potential holes regardless of the apparent | |||
| software versions being used. | software versions being used. | |||
| Proxies that serve as a portal through a network firewall ought to | Proxies that serve as a portal through a network firewall ought to | |||
| take special precautions regarding the transfer of header information | take special precautions regarding the transfer of header information | |||
| that might identify hosts behind the firewall. The Via header field | that might identify hosts behind the firewall. The Via header field | |||
| allows intermediaries to replace sensitive machine names with | allows intermediaries to replace sensitive machine names with | |||
| pseudonyms. | pseudonyms. | |||
| 12.12. Browser Fingerprinting | 16.12. Browser Fingerprinting | |||
| Browser fingerprinting is a set of techniques for identifying a | Browser fingerprinting is a set of techniques for identifying a | |||
| specific user agent over time through its unique set of | specific user agent over time through its unique set of | |||
| characteristics. These characteristics might include information | characteristics. These characteristics might include information | |||
| related to its TCP behavior, feature capabilities, and scripting | related to its TCP behavior, feature capabilities, and scripting | |||
| environment, though of particular interest here is the set of unique | environment, though of particular interest here is the set of unique | |||
| characteristics that might be communicated via HTTP. Fingerprinting | characteristics that might be communicated via HTTP. Fingerprinting | |||
| is considered a privacy concern because it enables tracking of a user | is considered a privacy concern because it enables tracking of a user | |||
| agent's behavior over time ([Bujlow]) without the corresponding | agent's behavior over time ([Bujlow]) without the corresponding | |||
| controls that the user might have over other forms of data collection | controls that the user might have over other forms of data collection | |||
| skipping to change at page 183, line 48 ¶ | skipping to change at page 181, line 39 ¶ | |||
| desired by the user. Likewise, Cookie header fields are deliberately | desired by the user. Likewise, Cookie header fields are deliberately | |||
| designed to enable re-identification, so fingerprinting concerns only | designed to enable re-identification, so fingerprinting concerns only | |||
| apply to situations where cookies are disabled or restricted by the | apply to situations where cookies are disabled or restricted by the | |||
| user agent's configuration. | user agent's configuration. | |||
| The User-Agent header field might contain enough information to | The User-Agent header field might contain enough information to | |||
| uniquely identify a specific device, usually when combined with other | uniquely identify a specific device, usually when combined with other | |||
| characteristics, particularly if the user agent sends excessive | characteristics, particularly if the user agent sends excessive | |||
| details about the user's system or extensions. However, the source | details about the user's system or extensions. However, the source | |||
| of unique information that is least expected by users is proactive | of unique information that is least expected by users is proactive | |||
| negotiation (Section 9.4), including the Accept, Accept-Charset, | negotiation (Section 11.1), including the Accept, Accept-Charset, | |||
| Accept-Encoding, and Accept-Language header fields. | Accept-Encoding, and Accept-Language header fields. | |||
| In addition to the fingerprinting concern, detailed use of the | In addition to the fingerprinting concern, detailed use of the | |||
| Accept-Language header field can reveal information the user might | Accept-Language header field can reveal information the user might | |||
| consider to be of a private nature. For example, understanding a | consider to be of a private nature. For example, understanding a | |||
| given language set might be strongly correlated to membership in a | given language set might be strongly correlated to membership in a | |||
| particular ethnic group. An approach that limits such loss of | particular ethnic group. An approach that limits such loss of | |||
| privacy would be for a user agent to omit the sending of Accept- | privacy would be for a user agent to omit the sending of Accept- | |||
| Language except for sites that have been whitelisted, perhaps via | Language except for sites that have been whitelisted, perhaps via | |||
| interaction after detecting a Vary header field that indicates | interaction after detecting a Vary header field that indicates | |||
| language negotiation might be useful. | language negotiation might be useful. | |||
| In environments where proxies are used to enhance privacy, user | In environments where proxies are used to enhance privacy, user | |||
| agents ought to be conservative in sending proactive negotiation | agents ought to be conservative in sending proactive negotiation | |||
| header fields. General-purpose user agents that provide a high | header fields. General-purpose user agents that provide a high | |||
| degree of header field configurability ought to inform users about | degree of header field configurability ought to inform users about | |||
| the loss of privacy that might result if too much detail is provided. | the loss of privacy that might result if too much detail is provided. | |||
| As an extreme privacy measure, proxies could filter the proactive | As an extreme privacy measure, proxies could filter the proactive | |||
| negotiation header fields in relayed requests. | negotiation header fields in relayed requests. | |||
| 12.13. Validator Retention | 16.13. Validator Retention | |||
| The validators defined by this specification are not intended to | The validators defined by this specification are not intended to | |||
| ensure the validity of a representation, guard against malicious | ensure the validity of a representation, guard against malicious | |||
| changes, or detect on-path attacks. At best, they enable more | changes, or detect on-path attacks. At best, they enable more | |||
| efficient cache updates and optimistic concurrent writes when all | efficient cache updates and optimistic concurrent writes when all | |||
| participants are behaving nicely. At worst, the conditions will fail | participants are behaving nicely. At worst, the conditions will fail | |||
| and the client will receive a response that is no more harmful than | and the client will receive a response that is no more harmful than | |||
| an HTTP exchange without conditional requests. | an HTTP exchange without conditional requests. | |||
| An entity-tag can be abused in ways that create privacy risks. For | An entity-tag can be abused in ways that create privacy risks. For | |||
| skipping to change at page 184, line 45 ¶ | skipping to change at page 182, line 35 ¶ | |||
| entity-tag that is unique to the user or user agent, send it in a | entity-tag that is unique to the user or user agent, send it in a | |||
| cacheable response with a long freshness time, and then read that | cacheable response with a long freshness time, and then read that | |||
| entity-tag in later conditional requests as a means of re-identifying | entity-tag in later conditional requests as a means of re-identifying | |||
| that user or user agent. Such an identifying tag would become a | that user or user agent. Such an identifying tag would become a | |||
| persistent identifier for as long as the user agent retained the | persistent identifier for as long as the user agent retained the | |||
| original cache entry. User agents that cache representations ought | original cache entry. User agents that cache representations ought | |||
| to ensure that the cache is cleared or replaced whenever the user | to ensure that the cache is cleared or replaced whenever the user | |||
| performs privacy-maintaining actions, such as clearing stored cookies | performs privacy-maintaining actions, such as clearing stored cookies | |||
| or changing to a private browsing mode. | or changing to a private browsing mode. | |||
| 12.14. Denial-of-Service Attacks Using Range | 16.14. Denial-of-Service Attacks Using Range | |||
| Unconstrained multiple range requests are susceptible to denial-of- | Unconstrained multiple range requests are susceptible to denial-of- | |||
| service attacks because the effort required to request many | service attacks because the effort required to request many | |||
| overlapping ranges of the same data is tiny compared to the time, | overlapping ranges of the same data is tiny compared to the time, | |||
| memory, and bandwidth consumed by attempting to serve the requested | memory, and bandwidth consumed by attempting to serve the requested | |||
| data in many parts. Servers ought to ignore, coalesce, or reject | data in many parts. Servers ought to ignore, coalesce, or reject | |||
| egregious range requests, such as requests for more than two | egregious range requests, such as requests for more than two | |||
| overlapping ranges or for many small ranges in a single set, | overlapping ranges or for many small ranges in a single set, | |||
| particularly when the ranges are requested out of order for no | particularly when the ranges are requested out of order for no | |||
| apparent reason. Multipart range requests are not designed to | apparent reason. Multipart range requests are not designed to | |||
| support random access. | support random access. | |||
| 12.15. Authentication Considerations | 16.15. Authentication Considerations | |||
| Everything about the topic of HTTP authentication is a security | Everything about the topic of HTTP authentication is a security | |||
| consideration, so the list of considerations below is not exhaustive. | consideration, so the list of considerations below is not exhaustive. | |||
| Furthermore, it is limited to security considerations regarding the | Furthermore, it is limited to security considerations regarding the | |||
| authentication framework, in general, rather than discussing all of | authentication framework, in general, rather than discussing all of | |||
| the potential considerations for specific authentication schemes | the potential considerations for specific authentication schemes | |||
| (which ought to be documented in the specifications that define those | (which ought to be documented in the specifications that define those | |||
| schemes). Various organizations maintain topical information and | schemes). Various organizations maintain topical information and | |||
| links to current research on Web application security (e.g., | links to current research on Web application security (e.g., | |||
| [OWASP]), including common pitfalls for implementing and using the | [OWASP]), including common pitfalls for implementing and using the | |||
| authentication schemes found in practice. | authentication schemes found in practice. | |||
| 12.15.1. Confidentiality of Credentials | 16.15.1. Confidentiality of Credentials | |||
| The HTTP authentication framework does not define a single mechanism | The HTTP authentication framework does not define a single mechanism | |||
| for maintaining the confidentiality of credentials; instead, each | for maintaining the confidentiality of credentials; instead, each | |||
| authentication scheme defines how the credentials are encoded prior | authentication scheme defines how the credentials are encoded prior | |||
| to transmission. While this provides flexibility for the development | to transmission. While this provides flexibility for the development | |||
| of future authentication schemes, it is inadequate for the protection | of future authentication schemes, it is inadequate for the protection | |||
| of existing schemes that provide no confidentiality on their own, or | of existing schemes that provide no confidentiality on their own, or | |||
| that do not sufficiently protect against replay attacks. | that do not sufficiently protect against replay attacks. | |||
| Furthermore, if the server expects credentials that are specific to | Furthermore, if the server expects credentials that are specific to | |||
| each individual user, the exchange of those credentials will have the | each individual user, the exchange of those credentials will have the | |||
| skipping to change at page 186, line 5 ¶ | skipping to change at page 183, line 42 ¶ | |||
| HTTP depends on the security properties of the underlying transport- | HTTP depends on the security properties of the underlying transport- | |||
| or session-level connection to provide confidential transmission of | or session-level connection to provide confidential transmission of | |||
| fields. In other words, if a server limits access to authenticated | fields. In other words, if a server limits access to authenticated | |||
| users using this framework, the server needs to ensure that the | users using this framework, the server needs to ensure that the | |||
| connection is properly secured in accordance with the nature of the | connection is properly secured in accordance with the nature of the | |||
| authentication scheme used. For example, services that depend on | authentication scheme used. For example, services that depend on | |||
| individual user authentication often require a connection to be | individual user authentication often require a connection to be | |||
| secured with TLS ("Transport Layer Security", [RFC8446]) prior to | secured with TLS ("Transport Layer Security", [RFC8446]) prior to | |||
| exchanging any credentials. | exchanging any credentials. | |||
| 12.15.2. Credentials and Idle Clients | 16.15.2. Credentials and Idle Clients | |||
| Existing HTTP clients and user agents typically retain authentication | Existing HTTP clients and user agents typically retain authentication | |||
| information indefinitely. HTTP does not provide a mechanism for the | information indefinitely. HTTP does not provide a mechanism for the | |||
| origin server to direct clients to discard these cached credentials, | origin server to direct clients to discard these cached credentials, | |||
| since the protocol has no awareness of how credentials are obtained | since the protocol has no awareness of how credentials are obtained | |||
| or managed by the user agent. The mechanisms for expiring or | or managed by the user agent. The mechanisms for expiring or | |||
| revoking credentials can be specified as part of an authentication | revoking credentials can be specified as part of an authentication | |||
| scheme definition. | scheme definition. | |||
| Circumstances under which credential caching can interfere with the | Circumstances under which credential caching can interfere with the | |||
| skipping to change at page 186, line 31 ¶ | skipping to change at page 184, line 21 ¶ | |||
| o Applications that include a session termination indication (such | o Applications that include a session termination indication (such | |||
| as a "logout" or "commit" button on a page) after which the server | as a "logout" or "commit" button on a page) after which the server | |||
| side of the application "knows" that there is no further reason | side of the application "knows" that there is no further reason | |||
| for the client to retain the credentials. | for the client to retain the credentials. | |||
| User agents that cache credentials are encouraged to provide a | User agents that cache credentials are encouraged to provide a | |||
| readily accessible mechanism for discarding cached credentials under | readily accessible mechanism for discarding cached credentials under | |||
| user control. | user control. | |||
| 12.15.3. Protection Spaces | 16.15.3. Protection Spaces | |||
| Authentication schemes that solely rely on the "realm" mechanism for | Authentication schemes that solely rely on the "realm" mechanism for | |||
| establishing a protection space will expose credentials to all | establishing a protection space will expose credentials to all | |||
| resources on an origin server. Clients that have successfully made | resources on an origin server. Clients that have successfully made | |||
| authenticated requests with a resource can use the same | authenticated requests with a resource can use the same | |||
| authentication credentials for other resources on the same origin | authentication credentials for other resources on the same origin | |||
| server. This makes it possible for a different resource to harvest | server. This makes it possible for a different resource to harvest | |||
| authentication credentials for other resources. | authentication credentials for other resources. | |||
| This is of particular concern when an origin server hosts resources | This is of particular concern when an origin server hosts resources | |||
| for multiple parties under the same canonical root URI | for multiple parties under the same canonical root URI | |||
| (Section 9.5.2). Possible mitigation strategies include restricting | (Section 10.5). Possible mitigation strategies include restricting | |||
| direct access to authentication credentials (i.e., not making the | direct access to authentication credentials (i.e., not making the | |||
| content of the Authorization request header field available), and | content of the Authorization request header field available), and | |||
| separating protection spaces by using a different host name (or port | separating protection spaces by using a different host name (or port | |||
| number) for each party. | number) for each party. | |||
| 12.15.4. Additional Response Fields | 16.15.4. Additional Response Fields | |||
| Adding information to responses that are sent over an unencrypted | Adding information to responses that are sent over an unencrypted | |||
| channel can affect security and privacy. The presence of the | channel can affect security and privacy. The presence of the | |||
| Authentication-Info and Proxy-Authentication-Info header fields alone | Authentication-Info and Proxy-Authentication-Info header fields alone | |||
| indicates that HTTP authentication is in use. Additional information | indicates that HTTP authentication is in use. Additional information | |||
| could be exposed by the contents of the authentication-scheme | could be exposed by the contents of the authentication-scheme | |||
| specific parameters; this will have to be considered in the | specific parameters; this will have to be considered in the | |||
| definitions of these schemes. | definitions of these schemes. | |||
| 13. IANA Considerations | 17. 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". | |||
| 13.1. URI Scheme Registration | 17.1. URI Scheme Registration | |||
| Please update the registry of URI Schemes [BCP35] at | Please update the registry of URI Schemes [BCP35] at | |||
| <https://www.iana.org/assignments/uri-schemes/> with the permanent | <https://www.iana.org/assignments/uri-schemes/> with the permanent | |||
| schemes listed in the first table of Section 2.5. | schemes listed in the first table of Section 3.1. | |||
| 13.2. Method Registration | 17.2. Method Registration | |||
| Please update the "Hypertext Transfer Protocol (HTTP) Method | Please update the "Hypertext Transfer Protocol (HTTP) Method | |||
| Registry" at <https://www.iana.org/assignments/http-methods> with the | Registry" at <https://www.iana.org/assignments/http-methods> with the | |||
| registration procedure of Section 8.4.1 and the method names | registration procedure of Section 15.1.1 and the method names | |||
| summarized in the table of Section 8.2. | summarized in the following table. | |||
| Furthermore, the method name "*" is reserved, since using that name | ||||
| as HTTP method name might conflict with special semantics in fields | ||||
| such as "Access-Control-Request-Method". Thus, please add the entry | ||||
| below to the registry: | ||||
| Method Name: * | ||||
| Safe: no | --------- ------ ------------ ------- | |||
| Method Safe Idempotent Ref. | ||||
| --------- ------ ------------ ------- | ||||
| * no no 17.2 | ||||
| CONNECT no no 8.3.6 | ||||
| DELETE no yes 8.3.5 | ||||
| GET yes yes 8.3.1 | ||||
| HEAD yes yes 8.3.2 | ||||
| OPTIONS yes yes 8.3.7 | ||||
| POST no no 8.3.3 | ||||
| PUT no yes 8.3.4 | ||||
| TRACE yes yes 8.3.8 | ||||
| --------- ------ ------------ ------- | ||||
| Idempotent: no | Table 14 | |||
| Reference: Section 13.2 | The method name "*" is reserved, since using that name as HTTP method | |||
| name might conflict with special semantics in fields such as "Access- | ||||
| Control-Request-Method". | ||||
| 13.3. Status Code Registration | 17.3. Status Code Registration | |||
| Please update the "Hypertext Transfer Protocol (HTTP) Status Code | Please update the "Hypertext Transfer Protocol (HTTP) Status Code | |||
| Registry" at <https://www.iana.org/assignments/http-status-codes> | Registry" at <https://www.iana.org/assignments/http-status-codes> | |||
| with the registration procedure of Section 10.7.1 and the status code | with the registration procedure of Section 15.2.1 and the status code | |||
| values summarized in the table of Section 10.1. | values summarized in the following table. | |||
| ------- ------------------------------- --------- | ||||
| Value Description Ref. | ||||
| ------- ------------------------------- --------- | ||||
| 100 Continue 14.2.1 | ||||
| 101 Switching Protocols 14.2.2 | ||||
| 200 OK 14.3.1 | ||||
| 201 Created 14.3.2 | ||||
| 202 Accepted 14.3.3 | ||||
| 203 Non-Authoritative Information 14.3.4 | ||||
| 204 No Content 14.3.5 | ||||
| 205 Reset Content 14.3.6 | ||||
| 206 Partial Content 14.3.7 | ||||
| 300 Multiple Choices 14.4.1 | ||||
| 301 Moved Permanently 14.4.2 | ||||
| 302 Found 14.4.3 | ||||
| 303 See Other 14.4.4 | ||||
| 304 Not Modified 14.4.5 | ||||
| 305 Use Proxy 14.4.6 | ||||
| 306 (Unused) 14.4.7 | ||||
| 307 Temporary Redirect 14.4.8 | ||||
| 308 Permanent Redirect 14.4.9 | ||||
| 400 Bad Request 14.5.1 | ||||
| 401 Unauthorized 14.5.2 | ||||
| 402 Payment Required 14.5.3 | ||||
| 403 Forbidden 14.5.4 | ||||
| 404 Not Found 14.5.5 | ||||
| 405 Method Not Allowed 14.5.6 | ||||
| 406 Not Acceptable 14.5.7 | ||||
| 407 Proxy Authentication Required 14.5.8 | ||||
| 408 Request Timeout 14.5.9 | ||||
| 409 Conflict 14.5.10 | ||||
| 410 Gone 14.5.11 | ||||
| 411 Length Required 14.5.12 | ||||
| 412 Precondition Failed 14.5.13 | ||||
| 413 Payload Too Large 14.5.14 | ||||
| 414 URI Too Long 14.5.15 | ||||
| 415 Unsupported Media Type 14.5.16 | ||||
| 416 Range Not Satisfiable 14.5.17 | ||||
| 417 Expectation Failed 14.5.18 | ||||
| 418 (Unused) 14.5.19 | ||||
| 422 Unprocessable Payload 14.5.20 | ||||
| 426 Upgrade Required 14.5.21 | ||||
| 500 Internal Server Error 14.6.1 | ||||
| 501 Not Implemented 14.6.2 | ||||
| 502 Bad Gateway 14.6.3 | ||||
| 503 Service Unavailable 14.6.4 | ||||
| 504 Gateway Timeout 14.6.5 | ||||
| 505 HTTP Version Not Supported 14.6.6 | ||||
| ------- ------------------------------- --------- | ||||
| Table 15 | ||||
| Additionally, please update the following entry in the Hypertext | Additionally, please update the following entry in the Hypertext | |||
| Transfer Protocol (HTTP) Status Code Registry: | Transfer Protocol (HTTP) Status Code Registry: | |||
| Value: 418 | Value: 418 | |||
| Description: (Unused) | Description: (Unused) | |||
| Reference Section 10.5.19 | Reference Section 14.5.19 | |||
| 13.4. HTTP Field Name Registration | 17.4. HTTP Field Name Registration | |||
| Please create a new registry as outlined in Section 5.3.2. | Please create a new registry as outlined in Section 15.3.1. | |||
| After creating the registry, all entries in the Permanent and | After creating the registry, all entries in the Permanent and | |||
| Provisional Message Header Registries with the protocol 'http' are to | Provisional Message Header Registries with the protocol 'http' are to | |||
| be moved to it, with the following changes applied: | be moved to it, with the following changes applied: | |||
| 1. The 'Applicable Protocol' field is to be omitted. | 1. The 'Applicable Protocol' field is to be omitted. | |||
| 2. Entries with a status of 'standard', 'experimental', 'reserved', | 2. Entries with a status of 'standard', 'experimental', 'reserved', | |||
| or 'informational' are to have a status of 'permanent'. | or 'informational' are to have a status of 'permanent'. | |||
| skipping to change at page 188, line 40 ¶ | skipping to change at page 187, line 34 ¶ | |||
| 4. Permanent entries without a status (after confirmation that the | 4. Permanent entries without a status (after confirmation that the | |||
| registration document did not define one) will have a status of | registration document did not define one) will have a status of | |||
| 'provisional'. The Expert(s) can choose to update their status | 'provisional'. The Expert(s) can choose to update their status | |||
| if there is evidence that another is more appropriate. | if there is evidence that another is more appropriate. | |||
| Please annotate the Permanent and Provisional Message Header | Please annotate the Permanent and Provisional Message Header | |||
| registries to indicate that HTTP field name registrations have moved, | registries to indicate that HTTP field name registrations have moved, | |||
| with an appropriate link. | with an appropriate link. | |||
| After that is complete, please update the new registry with the field | After that is complete, please update the new registry with the field | |||
| names listed in the table of Section 5.8. | names listed in the following table. | |||
| --------------------------- ------------ -------- | ||||
| Field Name Status Ref. | ||||
| --------------------------- ------------ -------- | ||||
| Accept standard 11.1.2 | ||||
| Accept-Charset deprecated 11.1.3 | ||||
| Accept-Encoding standard 11.1.4 | ||||
| Accept-Language standard 11.1.5 | ||||
| Accept-Ranges standard 13.3 | ||||
| Allow standard 9.2.1 | ||||
| Authentication-Info standard 10.6.3 | ||||
| Authorization standard 10.6.2 | ||||
| Connection standard 6.4.1 | ||||
| Content-Encoding standard 7.5 | ||||
| Content-Language standard 7.6 | ||||
| Content-Length standard 7.7 | ||||
| Content-Location standard 7.8 | ||||
| Content-Range standard 13.4 | ||||
| Content-Type standard 7.4 | ||||
| Date standard 9.2.2 | ||||
| ETag standard 7.9.3 | ||||
| Expect standard 9.1.1 | ||||
| From standard 9.1.2 | ||||
| Host standard 6.1.2 | ||||
| If-Match standard 12.1.1 | ||||
| If-Modified-Since standard 12.1.3 | ||||
| If-None-Match standard 12.1.2 | ||||
| If-Range standard 12.1.5 | ||||
| If-Unmodified-Since standard 12.1.4 | ||||
| Last-Modified standard 7.9.2 | ||||
| Location standard 9.2.3 | ||||
| Max-Forwards standard 6.4.2 | ||||
| Proxy-Authenticate standard 10.7.1 | ||||
| Proxy-Authentication-Info standard 10.7.3 | ||||
| Proxy-Authorization standard 10.7.2 | ||||
| Range standard 13.2 | ||||
| Referer standard 9.1.3 | ||||
| Retry-After standard 9.2.4 | ||||
| Server standard 9.2.5 | ||||
| TE standard 9.1.4 | ||||
| Trailer standard 9.1.5 | ||||
| Upgrade standard 6.6 | ||||
| User-Agent standard 9.1.6 | ||||
| Vary standard 11.2.1 | ||||
| Via standard 6.4.3 | ||||
| WWW-Authenticate standard 10.6.1 | ||||
| --------------------------- ------------ -------- | ||||
| Table 16 | ||||
| Furthermore, the field name "*" is reserved, since using that name as | ||||
| an HTTP header field might conflict with its special semantics in the | ||||
| Vary header field (Section 11.2.1). | ||||
| ------------ ---------- -------- ------------ | ||||
| Field Name Status Ref. Comments | ||||
| ------------ ---------- -------- ------------ | ||||
| * standard 11.2.1 (reserved) | ||||
| ------------ ---------- -------- ------------ | ||||
| Table 17 | ||||
| Finally, please update the "Content-MD5" entry in the new registry to | Finally, please update the "Content-MD5" entry in the new registry to | |||
| have a status of 'obsoleted' with references to Section 14.15 of | have a status of 'obsoleted' with references to Section 14.15 of | |||
| [RFC2616] (for the definition of the header field) and Appendix B of | [RFC2616] (for the definition of the header field) and Appendix B of | |||
| [RFC7231] (which removed the field definition from the updated | [RFC7231] (which removed the field definition from the updated | |||
| specification). | specification). | |||
| 13.5. Authentication Scheme Registration | 17.5. Authentication Scheme Registration | |||
| Please update the "Hypertext Transfer Protocol (HTTP) Authentication | Please update the "Hypertext Transfer Protocol (HTTP) Authentication | |||
| Scheme Registry" at <https://www.iana.org/assignments/http- | Scheme Registry" at <https://www.iana.org/assignments/http- | |||
| authschemes> with the registration procedure of Section 9.5.5.1. No | authschemes> with the registration procedure of Section 15.4.1. No | |||
| authentication schemes are defined in this document. | authentication schemes are defined in this document. | |||
| 13.6. Content Coding Registration | 17.6. Content Coding Registration | |||
| Please update the "HTTP Content Coding Registry" at | Please update the "HTTP Content Coding Registry" at | |||
| <https://www.iana.org/assignments/http-parameters/> with the | <https://www.iana.org/assignments/http-parameters/> with the | |||
| registration procedure of Section 7.1.2.4 and the content coding | registration procedure of Section 15.6.1 and the content coding names | |||
| names summarized in the table of Section 7.1.2. | summarized in the table of Section 7.5.1. | |||
| 13.7. Range Unit Registration | 17.7. Range Unit Registration | |||
| Please update the "HTTP Range Unit Registry" at | Please update the "HTTP Range Unit Registry" at | |||
| <https://www.iana.org/assignments/http-parameters/> with the | <https://www.iana.org/assignments/http-parameters/> with the | |||
| registration procedure of Section 7.1.4.4 and the range unit names | registration procedure of Section 15.5.1 and the range unit names | |||
| summarized in the table of Section 7.1.4. | summarized in the table of Section 13.1. | |||
| 13.8. Media Type Registration | 17.8. Media Type Registration | |||
| Please update the "Media Types" registry at | Please update the "Media Types" registry at | |||
| <https://www.iana.org/assignments/media-types> with the registration | <https://www.iana.org/assignments/media-types> with the registration | |||
| information in Section 7.3.5 for the media type "multipart/ | information in Section 13.5 for the media type "multipart/ | |||
| byteranges". | byteranges". | |||
| 13.9. Port Registration | 17.9. Port Registration | |||
| Please update the "Service Name and Transport Protocol Port Number" | Please update the "Service Name and Transport Protocol Port Number" | |||
| registry at <https://www.iana.org/assignments/service-names-port- | registry at <https://www.iana.org/assignments/service-names-port- | |||
| numbers/> for the services on ports 80 and 443 that use UDP or TCP | numbers/> for the services on ports 80 and 443 that use UDP or TCP | |||
| to: | to: | |||
| 1. use this document as "Reference", and | 1. use this document as "Reference", and | |||
| 2. when currently unspecified, set "Assignee" to "IESG" and | 2. when currently unspecified, set "Assignee" to "IESG" and | |||
| "Contact" to "IETF_Chair". | "Contact" to "IETF_Chair". | |||
| 14. References | 17.10. Upgrade Token Registration | |||
| 14.1. Normative References | Please update the "Hypertext Transfer Protocol (HTTP) Upgrade Token | |||
| Registry" at <https://www.iana.org/assignments/http-upgrade-tokens> | ||||
| with the registration procedure of Section 15.7 and the upgrade token | ||||
| names summarized in the following table. | ||||
| [Caching] Fielding, R., Ed., Nottingham, M., Ed., and J. F. Reschke, | ------ ------------------- ------------------------- ------ | |||
| Name Description Expected Version Tokens Ref. | ||||
| ------ ------------------- ------------------------- ------ | ||||
| HTTP Hypertext any DIGIT.DIGIT (e.g, 5.1 | ||||
| Transfer Protocol "2.0") | ||||
| ------ ------------------- ------------------------- ------ | ||||
| Table 18 | ||||
| 18. References | ||||
| 18.1. Normative References | ||||
| [Caching] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | ||||
| Ed., "HTTP Caching", Work in Progress, Internet-Draft, | Ed., "HTTP Caching", Work in Progress, Internet-Draft, | |||
| draft-ietf-httpbis-cache-11, August 27, 2020, | draft-ietf-httpbis-cache-12, October 2, 2020, | |||
| <https://tools.ietf.org/html/draft-ietf-httpbis-cache-11>. | <https://tools.ietf.org/html/draft-ietf-httpbis-cache-12>. | |||
| [Messaging] | [Messaging] | |||
| Fielding, R., Ed., Nottingham, M., Ed., and J. F. Reschke, | Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
| Ed., "HTTP/1.1 Messaging", Work in Progress, Internet- | Ed., "HTTP/1.1 Messaging", Work in Progress, Internet- | |||
| Draft, draft-ietf-httpbis-messaging-11, August 27, 2020, | Draft, draft-ietf-httpbis-messaging-12, October 2, 2020, | |||
| <https://tools.ietf.org/html/draft-ietf-httpbis-messaging- | <https://tools.ietf.org/html/draft-ietf-httpbis-messaging- | |||
| 11>. | 12>. | |||
| [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | |||
| RFC 793, DOI 10.17487/RFC0793, September 1981, | RFC 793, DOI 10.17487/RFC0793, September 1981, | |||
| <https://www.rfc-editor.org/info/rfc793>. | <https://www.rfc-editor.org/info/rfc793>. | |||
| [RFC1950] Deutsch, L.P. and J-L. Gailly, "ZLIB Compressed Data | [RFC1950] Deutsch, L.P. and J-L. Gailly, "ZLIB Compressed Data | |||
| Format Specification version 3.3", RFC 1950, | Format Specification version 3.3", RFC 1950, | |||
| DOI 10.17487/RFC1950, May 1996, | DOI 10.17487/RFC1950, May 1996, | |||
| <https://www.rfc-editor.org/info/rfc1950>. | <https://www.rfc-editor.org/info/rfc1950>. | |||
| skipping to change at page 191, line 47 ¶ | skipping to change at page 192, line 27 ¶ | |||
| [USASCII] American National Standards Institute, "Coded Character | [USASCII] American National Standards Institute, "Coded Character | |||
| Set -- 7-bit American Standard Code for Information | Set -- 7-bit American Standard Code for Information | |||
| Interchange", ANSI X3.4, 1986. | Interchange", ANSI X3.4, 1986. | |||
| [Welch] Welch, T. A., "A Technique for High-Performance Data | [Welch] Welch, T. A., "A Technique for High-Performance Data | |||
| Compression", IEEE Computer 17(6), | Compression", IEEE Computer 17(6), | |||
| DOI 10.1109/MC.1984.1659158, June 1984, | DOI 10.1109/MC.1984.1659158, June 1984, | |||
| <https://ieeexplore.ieee.org/document/1659158/>. | <https://ieeexplore.ieee.org/document/1659158/>. | |||
| 14.2. Informative References | 18.2. Informative References | |||
| [BCP13] Freed, N., Klensin, J., and T. Hansen, "Media Type | [BCP13] Freed, N., Klensin, J., and T. Hansen, "Media Type | |||
| Specifications and Registration Procedures", BCP 13, | Specifications and Registration Procedures", BCP 13, | |||
| RFC 6838, January 2013, | RFC 6838, January 2013, | |||
| <https://www.rfc-editor.org/info/bcp13>. | <https://www.rfc-editor.org/info/bcp13>. | |||
| [BCP178] Saint-Andre, P., Crocker, D., and M. Nottingham, | [BCP178] Saint-Andre, P., Crocker, D., and M. Nottingham, | |||
| "Deprecating the "X-" Prefix and Similar Constructs in | "Deprecating the "X-" Prefix and Similar Constructs in | |||
| Application Protocols", BCP 178, RFC 6648, June 2012, | Application Protocols", BCP 178, RFC 6648, June 2012, | |||
| <https://www.rfc-editor.org/info/bcp178>. | <https://www.rfc-editor.org/info/bcp178>. | |||
| skipping to change at page 192, line 43 ¶ | skipping to change at page 193, line 28 ¶ | |||
| [Georgiev] Georgiev, M., Iyengar, S., Jana, S., Anubhai, R., Boneh, | [Georgiev] Georgiev, M., Iyengar, S., Jana, S., Anubhai, R., Boneh, | |||
| D., and V. Shmatikov, "The Most Dangerous Code in the | D., and V. Shmatikov, "The Most Dangerous Code in the | |||
| World: Validating SSL Certificates in Non-browser | World: Validating SSL Certificates in Non-browser | |||
| Software", DOI 10.1145/2382196.2382204, In Proceedings of | Software", DOI 10.1145/2382196.2382204, In Proceedings of | |||
| the 2012 ACM Conference on Computer and Communications | the 2012 ACM Conference on Computer and Communications | |||
| Security (CCS '12), pp. 38-49, October 2012, | Security (CCS '12), pp. 38-49, October 2012, | |||
| <https://doi.org/10.1145/2382196.2382204>. | <https://doi.org/10.1145/2382196.2382204>. | |||
| [HTTP3] Bishop, M., "Hypertext Transfer Protocol Version 3 | [HTTP3] Bishop, M., "Hypertext Transfer Protocol Version 3 | |||
| (HTTP/3)", Work in Progress, Internet-Draft, draft-ietf- | (HTTP/3)", Work in Progress, Internet-Draft, draft-ietf- | |||
| quic-http-29, June 9, 2020, | quic-http-31, September 25, 2020, | |||
| <https://tools.ietf.org/html/draft-ietf-quic-http-29>. | <https://tools.ietf.org/html/draft-ietf-quic-http-31>. | |||
| [ISO-8859-1] | [ISO-8859-1] | |||
| International Organization for Standardization, | International Organization for Standardization, | |||
| "Information technology -- 8-bit single-byte coded graphic | "Information technology -- 8-bit single-byte coded graphic | |||
| character sets -- Part 1: Latin alphabet No. 1", ISO/ | character sets -- Part 1: Latin alphabet No. 1", ISO/ | |||
| IEC 8859-1:1998, 1998. | IEC 8859-1:1998, 1998. | |||
| [Kri2001] Kristol, D., "HTTP Cookies: Standards, Privacy, and | [Kri2001] Kristol, D., "HTTP Cookies: Standards, Privacy, and | |||
| Politics", ACM Transactions on Internet Technology 1(2), | Politics", ACM Transactions on Internet Technology 1(2), | |||
| November 2001, <http://arxiv.org/abs/cs.SE/0105018>. | November 2001, <http://arxiv.org/abs/cs.SE/0105018>. | |||
| skipping to change at page 197, line 37 ¶ | skipping to change at page 198, line 15 ¶ | |||
| [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
| Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
| <https://www.rfc-editor.org/info/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
| [Sniffing] WHATWG, "MIME Sniffing", | [Sniffing] WHATWG, "MIME Sniffing", | |||
| <https://mimesniff.spec.whatwg.org>. | <https://mimesniff.spec.whatwg.org>. | |||
| 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.5.1. | Section 5.7.1.1. | |||
| Accept = [ ( media-range [ accept-params ] ) *( OWS "," OWS ( | Accept = [ ( media-range [ accept-params ] ) *( OWS "," OWS ( | |||
| media-range [ accept-params ] ) ) ] | media-range [ accept-params ] ) ) ] | |||
| Accept-Charset = [ ( ( charset / "*" ) [ weight ] ) *( OWS "," OWS ( | Accept-Charset = [ ( ( charset / "*" ) [ weight ] ) *( OWS "," OWS ( | |||
| ( charset / "*" ) [ weight ] ) ) ] | ( charset / "*" ) [ weight ] ) ) ] | |||
| Accept-Encoding = [ ( codings [ weight ] ) *( OWS "," OWS ( codings [ | Accept-Encoding = [ ( codings [ weight ] ) *( OWS "," OWS ( codings [ | |||
| weight ] ) ) ] | weight ] ) ) ] | |||
| Accept-Language = [ ( language-range [ weight ] ) *( OWS "," OWS ( | Accept-Language = [ ( language-range [ weight ] ) *( OWS "," OWS ( | |||
| language-range [ weight ] ) ) ] | language-range [ weight ] ) ) ] | |||
| Accept-Ranges = acceptable-ranges | Accept-Ranges = acceptable-ranges | |||
| skipping to change at page 202, line 42 ¶ | skipping to change at page 203, line 20 ¶ | |||
| B.2. Changes from RFC 7230 | B.2. Changes from RFC 7230 | |||
| The sections introducing HTTP's design goals, history, architecture, | The sections introducing HTTP's design goals, history, architecture, | |||
| conformance criteria, protocol versioning, URIs, message routing, and | conformance criteria, protocol versioning, URIs, message routing, and | |||
| header fields have been moved here (without substantive change). | header fields have been moved here (without substantive change). | |||
| The description of an origin and authoritative access to origin | The description of an origin and authoritative access to origin | |||
| servers has been extended for both "http" and "https" URIs to account | servers has been extended for both "http" and "https" URIs to account | |||
| for alternative services and secured connections that are not | for alternative services and secured connections that are not | |||
| necessarily based on TCP. (Section 2.5.1, Section 2.5.2, | necessarily based on TCP. (Section 4.2.1, Section 4.2.2, | |||
| Section 6.2, Section 6.3.3) | Section 4.3.1, Section 6.2.3) | |||
| "Field value" now refers to the value after multiple instances are | "Field value" now refers to the value after multiple instances are | |||
| combined with commas - by far the most common use. To refer to a | combined with commas - by far the most common use. To refer to a | |||
| single header line's value, use "field line value". (Section 5) | single header line's value, use "field line value". (Section 5.4) | |||
| Parameters in media type, media range, and expectation can be empty | Parameters in media type, media range, and expectation can be empty | |||
| via one or more trailing semicolons. (Section 5.4.1.4) | via one or more trailing semicolons. (Section 5.7.6) | |||
| Trailer field semantics now transcend the specifics of chunked | Trailer field semantics now transcend the specifics of chunked | |||
| encoding. Use of trailer fields has been further limited to only | encoding. Use of trailer fields has been further limited to only | |||
| allow generation as a trailer field when the sender knows the field | allow generation as a trailer field when the sender knows the field | |||
| defines that usage and to only allow merging into the header section | defines that usage and to only allow merging into the header section | |||
| if the recipient knows the corresponding field definition permits and | if the recipient knows the corresponding field definition permits and | |||
| defines how to merge. In all other cases, implementations are | defines how to merge. In all other cases, implementations are | |||
| encouraged to either store the trailer fields separately or discard | encouraged to either store the trailer fields separately or discard | |||
| them instead of merging. (Section 5.6.2) | them instead of merging. (Section 5.6.2) | |||
| Trailer fields can now potentially appear as multiple trailer | Trailer fields can now potentially appear as multiple trailer | |||
| sections, if allowed by the HTTP version and framing in use, with | sections, if allowed by the HTTP version and framing in use, with | |||
| processing described as being iterative as each section is received. | processing described as being iterative as each section is received. | |||
| (Section 5.6.3) | (Section 5.6.3) | |||
| Made the priority of the absolute form of the request URI over the | Made the priority of the absolute form of the request URI over the | |||
| Host header by origin servers explicit, to align with proxy handling. | Host header by origin servers explicit, to align with proxy handling. | |||
| (Section 6.5) | (Section 6.1.2) | |||
| The grammar definition for the Via field's "received-by" was expanded | The grammar definition for the Via field's "received-by" was expanded | |||
| in 7230 due to changes in the URI grammar for host [RFC3986] that are | in 7230 due to changes in the URI grammar for host [RFC3986] that are | |||
| not desirable for Via. For simplicity, we have removed uri-host from | not desirable for Via. For simplicity, we have removed uri-host from | |||
| the received-by production because it can be encompassed by the | the received-by production because it can be encompassed by the | |||
| existing grammar for pseudonym. In particular, this change removed | existing grammar for pseudonym. In particular, this change removed | |||
| comma from the allowed set of charaters for a host name in received- | comma from the allowed set of charaters for a host name in received- | |||
| by. (Section 6.6.1) | by. (Section 6.4.3) | |||
| Added status code 308 (previously defined in [RFC7538]) so that it's | Added status code 308 (previously defined in [RFC7538]) so that it's | |||
| defined closer to status codes 301, 302, and 307. (Section 10.4.9) | defined closer to status codes 301, 302, and 307. (Section 14.4.9) | |||
| Added status code 422 (previously defined in Section 11.2 of | Added status code 422 (previously defined in Section 11.2 of | |||
| [RFC4918]) because of its general applicability. (Section 10.5.20) | [RFC4918]) because of its general applicability. (Section 14.5.20) | |||
| The description of an origin and authoritative access to origin | The description of an origin and authoritative access to origin | |||
| servers has been extended for both "http" and "https" URIs to account | servers has been extended for both "http" and "https" URIs to account | |||
| for alternative services and secured connections that are not | for alternative services and secured connections that are not | |||
| necessarily based on TCP. (Section 2.5.1, Section 2.5.2, | necessarily based on TCP. (Section 4.2.1, Section 4.2.2, | |||
| Section 6.2, Section 6.3.3) | Section 4.3.1, Section 6.2.3) | |||
| B.3. Changes from RFC 7231 | B.3. Changes from RFC 7231 | |||
| Minimum URI lengths to be supported by implementations are now | Minimum URI lengths to be supported by implementations are now | |||
| recommended. (Section 2.5) | recommended. (Section 3.1) | |||
| Clarify that control characters in field values are to be rejected or | Clarify that control characters in field values are to be rejected or | |||
| mapped to SP. (Section 5.4) | mapped to SP. (Section 5.4.4) | |||
| Parameters in media type, media range, and expectation can be empty | Parameters in media type, media range, and expectation can be empty | |||
| via one or more trailing semicolons. (Section 5.4.1.4) | via one or more trailing semicolons. (Section 5.7.6) | |||
| The term "effective request URI" has been replaced with "target URI". | The term "effective request URI" has been replaced with "target URI". | |||
| (Section 6.1) | (Section 6.1) | |||
| Range units are compared in a case insensitive fashion. | Range units are compared in a case insensitive fashion. | |||
| (Section 7.1.4) | (Section 13.1) | |||
| Restrictions on client retries have been loosened, to reflect | Restrictions on client retries have been loosened, to reflect | |||
| implementation behavior. (Section 8.2.2) | implementation behavior. (Section 8.2.2) | |||
| Clarified that request bodies on GET and DELETE are not | Clarified that request bodies on GET and DELETE are not | |||
| interoperable. (Section 8.3.1, Section 8.3.5) | interoperable. (Section 8.3.1, Section 8.3.5) | |||
| Removed a superfluous requirement about setting Content-Length from | Removed a superfluous requirement about setting Content-Length from | |||
| the description of the OPTIONS method. (Section 8.3.7) | the description of the OPTIONS method. (Section 8.3.7) | |||
| skipping to change at page 204, line 21 ¶ | skipping to change at page 205, line 4 ¶ | |||
| implementation behavior. (Section 8.2.2) | implementation behavior. (Section 8.2.2) | |||
| Clarified that request bodies on GET and DELETE are not | Clarified that request bodies on GET and DELETE are not | |||
| interoperable. (Section 8.3.1, Section 8.3.5) | interoperable. (Section 8.3.1, Section 8.3.5) | |||
| Removed a superfluous requirement about setting Content-Length from | Removed a superfluous requirement about setting Content-Length from | |||
| the description of the OPTIONS method. (Section 8.3.7) | the description of the OPTIONS method. (Section 8.3.7) | |||
| Restore list-based grammar for Expect for compatibility with RFC | Restore list-based grammar for Expect for compatibility with RFC | |||
| 2616. (Section 9.1.1) | 2616. (Section 9.1.1) | |||
| Allow Accept and Accept-Encoding in response messages; the latter was | Allow Accept and Accept-Encoding in response messages; the latter was | |||
| introduced by [RFC7694]. (Section 9.4) | introduced by [RFC7694]. (Section 11.3) | |||
| The process of creating a redirected request has been clarified. | The process of creating a redirected request has been clarified. | |||
| (Section 10.4) | (Section 14.4) | |||
| The semantics of "*" in the Vary header field when other values are | The semantics of "*" in the Vary header field when other values are | |||
| present was clarified. (Section 11.1.4) | present was clarified. (Section 11.2.1) | |||
| B.4. Changes from RFC 7232 | B.4. Changes from RFC 7232 | |||
| Preconditions can now be evaluated before the request body is | Preconditions can now be evaluated before the request body is | |||
| processed rather than waiting until the response would otherwise be | processed rather than waiting until the response would otherwise be | |||
| successful. (Section 9.2.1) | successful. (Section 12.2) | |||
| Removed edge case requirement on If-Match and If-Unmodified-Since | Removed edge case requirement on If-Match and If-Unmodified-Since | |||
| that a validator not be sent in a 2xx response when validation fails | that a validator not be sent in a 2xx response when validation fails | |||
| and the server decides that the same change request has already been | and the server decides that the same change request has already been | |||
| applied. (Section 9.2.3 and Section 9.2.6) | applied. (Section 12.1.1 and Section 12.1.4) | |||
| Clarified that If-Unmodified-Since doesn't apply to a resource | Clarified that If-Unmodified-Since doesn't apply to a resource | |||
| without a concept of modification time. (Section 9.2.6) | without a concept of modification time. (Section 12.1.4) | |||
| B.5. Changes from RFC 7233 | B.5. Changes from RFC 7233 | |||
| Refactored the range-unit and ranges-specifier grammars to simplify | Refactored the range-unit and ranges-specifier grammars to simplify | |||
| and reduce artificial distinctions between bytes and other | and reduce artificial distinctions between bytes and other | |||
| (extension) range units, removing the overlapping grammar of other- | (extension) range units, removing the overlapping grammar of other- | |||
| range-unit by defining range units generically as a token and placing | range-unit by defining range units generically as a token and placing | |||
| extensions within the scope of a range-spec (other-range). This | extensions within the scope of a range-spec (other-range). This | |||
| disambiguates the role of list syntax (commas) in all range sets, | disambiguates the role of list syntax (commas) in all range sets, | |||
| including extension range units, for indicating a range-set of more | including extension range units, for indicating a range-set of more | |||
| skipping to change at page 207, line 29 ¶ | skipping to change at page 208, line 5 ¶ | |||
| <https://www.rfc-editor.org/errata/eid4664>) | <https://www.rfc-editor.org/errata/eid4664>) | |||
| o Resolved erratum 4072, no change needed here | o Resolved erratum 4072, no change needed here | |||
| (<https://github.com/httpwg/http-core/issues/84>, | (<https://github.com/httpwg/http-core/issues/84>, | |||
| <https://www.rfc-editor.org/errata/eid4072>) | <https://www.rfc-editor.org/errata/eid4072>) | |||
| o Clarify DELETE status code suggestions | o Clarify DELETE status code suggestions | |||
| (<https://github.com/httpwg/http-core/issues/85>, | (<https://github.com/httpwg/http-core/issues/85>, | |||
| <https://www.rfc-editor.org/errata/eid4436>) | <https://www.rfc-editor.org/errata/eid4436>) | |||
| o In Section 7.3.4, fix ABNF for "other-range-resp" to use VCHAR | o In Section 13.4, fix ABNF for "other-range-resp" to use VCHAR | |||
| instead of CHAR (<https://github.com/httpwg/http-core/issues/86>, | instead of CHAR (<https://github.com/httpwg/http-core/issues/86>, | |||
| <https://www.rfc-editor.org/errata/eid4707>) | <https://www.rfc-editor.org/errata/eid4707>) | |||
| o Resolved erratum 5162, no change needed here | o Resolved erratum 5162, no change needed here | |||
| (<https://github.com/httpwg/http-core/issues/89>, | (<https://github.com/httpwg/http-core/issues/89>, | |||
| <https://www.rfc-editor.org/errata/eid5162>) | <https://www.rfc-editor.org/errata/eid5162>) | |||
| o Replace "response code" with "response status code" and "status- | o Replace "response code" with "response status code" and "status- | |||
| code" (the ABNF production name from the HTTP/1.1 message format) | code" (the ABNF production name from the HTTP/1.1 message format) | |||
| by "status code" (<https://github.com/httpwg/http-core/issues/94>, | by "status code" (<https://github.com/httpwg/http-core/issues/94>, | |||
| <https://www.rfc-editor.org/errata/eid4050>) | <https://www.rfc-editor.org/errata/eid4050>) | |||
| o Added a missing word in Section 10.4 (<https://github.com/httpwg/ | o Added a missing word in Section 14.4 (<https://github.com/httpwg/ | |||
| http-core/issues/98>, <https://www.rfc-editor.org/errata/eid4452>) | http-core/issues/98>, <https://www.rfc-editor.org/errata/eid4452>) | |||
| o In Section 5.5, fixed an example that had trailing whitespace | o In Section 5.7.1, fixed an example that had trailing whitespace | |||
| where it shouldn't (<https://github.com/httpwg/http-core/ | where it shouldn't (<https://github.com/httpwg/http-core/ | |||
| issues/104>, <https://www.rfc-editor.org/errata/eid4169>) | issues/104>, <https://www.rfc-editor.org/errata/eid4169>) | |||
| o In Section 10.3.7, remove words that were potentially misleading | o In Section 14.3.7, remove words that were potentially misleading | |||
| with respect to the relation to the requested ranges | with respect to the relation to the requested ranges | |||
| (<https://github.com/httpwg/http-core/issues/102>, | (<https://github.com/httpwg/http-core/issues/102>, | |||
| <https://www.rfc-editor.org/errata/eid4358>) | <https://www.rfc-editor.org/errata/eid4358>) | |||
| C.4. Since draft-ietf-httpbis-semantics-02 | C.4. Since draft-ietf-httpbis-semantics-02 | |||
| o Included (Proxy-)Auth-Info header field definition from RFC 7615 | o Included (Proxy-)Auth-Info header field definition from RFC 7615 | |||
| (<https://github.com/httpwg/http-core/issues/9>) | (<https://github.com/httpwg/http-core/issues/9>) | |||
| o In Section 8.3.3, clarify POST caching | o In Section 8.3.3, clarify POST caching | |||
| (<https://github.com/httpwg/http-core/issues/17>) | (<https://github.com/httpwg/http-core/issues/17>) | |||
| o Add Section 10.5.19 to reserve the 418 status code | o Add Section 14.5.19 to reserve the 418 status code | |||
| (<https://github.com/httpwg/http-core/issues/43>) | (<https://github.com/httpwg/http-core/issues/43>) | |||
| o In Section 2.1 and Section 9.1.1, clarified when a response can be | o In Section 3.3 and Section 9.1.1, clarified when a response can be | |||
| sent (<https://github.com/httpwg/http-core/issues/82>) | sent (<https://github.com/httpwg/http-core/issues/82>) | |||
| o In Section 7.1.1.1, explain the difference between the "token" | o In Section 7.4.2, explain the difference between the "token" | |||
| production, the RFC 2978 ABNF for charset names, and the actual | production, the RFC 2978 ABNF for charset names, and the actual | |||
| registration practice (<https://github.com/httpwg/http-core/ | registration practice (<https://github.com/httpwg/http-core/ | |||
| issues/100>, <https://www.rfc-editor.org/errata/eid4689>) | issues/100>, <https://www.rfc-editor.org/errata/eid4689>) | |||
| o In Section 2.5, removed the fragment component in the URI scheme | o In Section 3.1, removed the fragment component in the URI scheme | |||
| definitions as per Section 4.3 of [RFC3986], furthermore moved | definitions as per Section 4.3 of [RFC3986], furthermore moved | |||
| fragment discussion into a separate section | fragment discussion into a separate section | |||
| (<https://github.com/httpwg/http-core/issues/103>, | (<https://github.com/httpwg/http-core/issues/103>, | |||
| <https://www.rfc-editor.org/errata/eid4251>, <https://www.rfc- | <https://www.rfc-editor.org/errata/eid4251>, <https://www.rfc- | |||
| editor.org/errata/eid4252>) | editor.org/errata/eid4252>) | |||
| o In Section 4.2, add language about minor HTTP version number | o In Section 5.1, add language about minor HTTP version number | |||
| defaulting (<https://github.com/httpwg/http-core/issues/115>) | defaulting (<https://github.com/httpwg/http-core/issues/115>) | |||
| o Added Section 10.5.20 for status code 422, previously defined in | o Added Section 14.5.20 for status code 422, previously defined in | |||
| Section 11.2 of [RFC4918] (<https://github.com/httpwg/http-core/ | Section 11.2 of [RFC4918] (<https://github.com/httpwg/http-core/ | |||
| issues/123>) | issues/123>) | |||
| o In Section 10.5.17, fixed prose about byte range comparison | o In Section 14.5.17, fixed prose about byte range comparison | |||
| (<https://github.com/httpwg/http-core/issues/135>, | (<https://github.com/httpwg/http-core/issues/135>, | |||
| <https://www.rfc-editor.org/errata/eid5474>) | <https://www.rfc-editor.org/errata/eid5474>) | |||
| o In Section 2.1, explain that request/response correlation is | o In Section 3.3, explain that request/response correlation is | |||
| version specific (<https://github.com/httpwg/http-core/ | version specific (<https://github.com/httpwg/http-core/ | |||
| issues/145>) | issues/145>) | |||
| C.5. Since draft-ietf-httpbis-semantics-03 | C.5. Since draft-ietf-httpbis-semantics-03 | |||
| o In Section 10.4.9, include status code 308 from RFC 7538 | o In Section 14.4.9, include status code 308 from RFC 7538 | |||
| (<https://github.com/httpwg/http-core/issues/3>) | (<https://github.com/httpwg/http-core/issues/3>) | |||
| o In Section 7.1.1, clarify that the charset parameter value is | o In Section 7.4.1, clarify that the charset parameter value is | |||
| case-insensitive due to the definition in RFC 2046 | case-insensitive due to the definition in RFC 2046 | |||
| (<https://github.com/httpwg/http-core/issues/13>) | (<https://github.com/httpwg/http-core/issues/13>) | |||
| o Define a separate registry for HTTP header field names | o Define a separate registry for HTTP header field names | |||
| (<https://github.com/httpwg/http-core/issues/42>) | (<https://github.com/httpwg/http-core/issues/42>) | |||
| o In Section 9.4, refactor and clarify description of wildcard ("*") | o In Section 11.1, refactor and clarify description of wildcard | |||
| handling (<https://github.com/httpwg/http-core/issues/46>) | ("*") handling (<https://github.com/httpwg/http-core/issues/46>) | |||
| o Deprecate Accept-Charset (<https://github.com/httpwg/http-core/ | o Deprecate Accept-Charset (<https://github.com/httpwg/http-core/ | |||
| issues/61>) | issues/61>) | |||
| o In Section 9.2.1, mention Cache-Control: immutable | o In Section 12.2, mention Cache-Control: immutable | |||
| (<https://github.com/httpwg/http-core/issues/69>) | (<https://github.com/httpwg/http-core/issues/69>) | |||
| o In Section 5.1, clarify when header field combination is allowed | o In Section 5.4.1, clarify when header field combination is allowed | |||
| (<https://github.com/httpwg/http-core/issues/74>) | (<https://github.com/httpwg/http-core/issues/74>) | |||
| o In Section 13.4, instruct IANA to mark Content-MD5 as obsolete | o In Section 17.4, instruct IANA to mark Content-MD5 as obsolete | |||
| (<https://github.com/httpwg/http-core/issues/93>) | (<https://github.com/httpwg/http-core/issues/93>) | |||
| o Use RFC 7405 ABNF notation for case-sensitive string constants | o Use RFC 7405 ABNF notation for case-sensitive string constants | |||
| (<https://github.com/httpwg/http-core/issues/133>) | (<https://github.com/httpwg/http-core/issues/133>) | |||
| o Rework Section 2.1 to be more version-independent | o Rework Section 3.3 to be more version-independent | |||
| (<https://github.com/httpwg/http-core/issues/142>) | (<https://github.com/httpwg/http-core/issues/142>) | |||
| o In Section 8.3.5, clarify that DELETE needs to be successful to | o In Section 8.3.5, clarify that DELETE needs to be successful to | |||
| invalidate cache (<https://github.com/httpwg/http-core/ | invalidate cache (<https://github.com/httpwg/http-core/ | |||
| issues/167>, <https://www.rfc-editor.org/errata/eid5541>) | issues/167>, <https://www.rfc-editor.org/errata/eid5541>) | |||
| C.6. Since draft-ietf-httpbis-semantics-04 | C.6. Since draft-ietf-httpbis-semantics-04 | |||
| o In Section 5.4, fix field-content ABNF | o In Section 5.4.4, fix field-content ABNF | |||
| (<https://github.com/httpwg/http-core/issues/19>, | (<https://github.com/httpwg/http-core/issues/19>, | |||
| <https://www.rfc-editor.org/errata/eid4189>) | <https://www.rfc-editor.org/errata/eid4189>) | |||
| o Move Section 5.4.1.4 into its own section | o Move Section 5.7.6 into its own section | |||
| (<https://github.com/httpwg/http-core/issues/45>) | (<https://github.com/httpwg/http-core/issues/45>) | |||
| o In Section 7.2.1, reference MIME Sniffing | o In Section 7.4, reference MIME Sniffing | |||
| (<https://github.com/httpwg/http-core/issues/51>) | (<https://github.com/httpwg/http-core/issues/51>) | |||
| o In Section 5.5, simplify the #rule mapping for recipients | o In Section 5.7.1, simplify the #rule mapping for recipients | |||
| (<https://github.com/httpwg/http-core/issues/164>, | (<https://github.com/httpwg/http-core/issues/164>, | |||
| <https://www.rfc-editor.org/errata/eid5257>) | <https://www.rfc-editor.org/errata/eid5257>) | |||
| o In Section 8.3.7, remove misleading text about "extension" of HTTP | o In Section 8.3.7, remove misleading text about "extension" of HTTP | |||
| is needed to define method payloads (<https://github.com/httpwg/ | is needed to define method payloads (<https://github.com/httpwg/ | |||
| http-core/issues/204>) | http-core/issues/204>) | |||
| o Fix editorial issue in Section 7 (<https://github.com/httpwg/http- | o Fix editorial issue in Section 7 (<https://github.com/httpwg/http- | |||
| core/issues/223>) | core/issues/223>) | |||
| o In Section 10.5.20, rephrase language not to use "entity" anymore, | o In Section 14.5.20, rephrase language not to use "entity" anymore, | |||
| and also avoid lowercase "may" (<https://github.com/httpwg/http- | and also avoid lowercase "may" (<https://github.com/httpwg/http- | |||
| core/issues/224>) | core/issues/224>) | |||
| o Move discussion of retries from [Messaging] into Section 8.2.2 | o Move discussion of retries from [Messaging] into Section 8.2.2 | |||
| (<https://github.com/httpwg/http-core/issues/230>) | (<https://github.com/httpwg/http-core/issues/230>) | |||
| C.7. Since draft-ietf-httpbis-semantics-05 | C.7. Since draft-ietf-httpbis-semantics-05 | |||
| o Moved transport-independent part of the description of trailers | o Moved transport-independent part of the description of trailers | |||
| into Section 5.6 (<https://github.com/httpwg/http-core/issues/16>) | into Section 5.6 (<https://github.com/httpwg/http-core/issues/16>) | |||
| o Loosen requirements on retries based upon implementation behavior | o Loosen requirements on retries based upon implementation behavior | |||
| (<https://github.com/httpwg/http-core/issues/27>) | (<https://github.com/httpwg/http-core/issues/27>) | |||
| o In Section 13.9, update IANA port registry for TCP/UDP on ports 80 | o In Section 17.9, update IANA port registry for TCP/UDP on ports 80 | |||
| and 443 (<https://github.com/httpwg/http-core/issues/36>) | and 443 (<https://github.com/httpwg/http-core/issues/36>) | |||
| o In Section 5.7, revise guidelines for new header field names | o In Section 15.3.3, revise guidelines for new header field names | |||
| (<https://github.com/httpwg/http-core/issues/47>) | (<https://github.com/httpwg/http-core/issues/47>) | |||
| o In Section 8.2.3, remove concept of "cacheable methods" in favor | o In Section 8.2.3, remove concept of "cacheable methods" in favor | |||
| of prose (<https://github.com/httpwg/http-core/issues/54>, | of prose (<https://github.com/httpwg/http-core/issues/54>, | |||
| <https://www.rfc-editor.org/errata/eid5300>) | <https://www.rfc-editor.org/errata/eid5300>) | |||
| o In Section 12.1, mention that the concept of authority can be | o In Section 16.1, mention that the concept of authority can be | |||
| modified by protocol extensions (<https://github.com/httpwg/http- | modified by protocol extensions (<https://github.com/httpwg/http- | |||
| core/issues/143>) | core/issues/143>) | |||
| o Create new subsection on payload body in Section 7.3.3, taken from | o Create new subsection on payload body in Section 5.5.4, taken from | |||
| portions of message body (<https://github.com/httpwg/http-core/ | portions of message body (<https://github.com/httpwg/http-core/ | |||
| issues/159>) | issues/159>) | |||
| o Moved definition of "Whitespace" into new container "Generic | o Moved definition of "Whitespace" into new container "Generic | |||
| Syntax" (<https://github.com/httpwg/http-core/issues/162>) | Syntax" (<https://github.com/httpwg/http-core/issues/162>) | |||
| o In Section 2.5, recommend minimum URI size support for | o In Section 3.1, recommend minimum URI size support for | |||
| implementations (<https://github.com/httpwg/http-core/issues/169>) | implementations (<https://github.com/httpwg/http-core/issues/169>) | |||
| o In Section 7.1.4, refactored the range-unit and ranges-specifier | o In Section 13.1, refactored the range-unit and ranges-specifier | |||
| grammars (<https://github.com/httpwg/http-core/issues/196>, | grammars (<https://github.com/httpwg/http-core/issues/196>, | |||
| <https://www.rfc-editor.org/errata/eid5620>) | <https://www.rfc-editor.org/errata/eid5620>) | |||
| o In Section 8.3.1, caution against a request body more strongly | o In Section 8.3.1, caution against a request body more strongly | |||
| (<https://github.com/httpwg/http-core/issues/202>) | (<https://github.com/httpwg/http-core/issues/202>) | |||
| o Reorganized text in Section 5.7 (<https://github.com/httpwg/http- | o Reorganized text in Section 15.3.3 (<https://github.com/httpwg/ | |||
| core/issues/214>) | http-core/issues/214>) | |||
| o In Section 10.5.4, replace "authorize" with "fulfill" | o In Section 14.5.4, replace "authorize" with "fulfill" | |||
| (<https://github.com/httpwg/http-core/issues/218>) | (<https://github.com/httpwg/http-core/issues/218>) | |||
| o In Section 8.3.7, removed a misleading statement about Content- | o In Section 8.3.7, removed a misleading statement about Content- | |||
| Length (<https://github.com/httpwg/http-core/issues/235>, | Length (<https://github.com/httpwg/http-core/issues/235>, | |||
| <https://www.rfc-editor.org/errata/eid5806>) | <https://www.rfc-editor.org/errata/eid5806>) | |||
| o In Section 12.1, add text from RFC 2818 | o In Section 16.1, add text from RFC 2818 | |||
| (<https://github.com/httpwg/http-core/issues/236>) | (<https://github.com/httpwg/http-core/issues/236>) | |||
| o Changed "cacheable by default" to "heuristically cacheable" | o Changed "cacheable by default" to "heuristically cacheable" | |||
| throughout (<https://github.com/httpwg/http-core/issues/242>) | throughout (<https://github.com/httpwg/http-core/issues/242>) | |||
| C.8. Since draft-ietf-httpbis-semantics-06 | C.8. Since draft-ietf-httpbis-semantics-06 | |||
| o In Section 6.6.1, simplify received-by grammar (and disallow comma | o In Section 6.4.3, simplify received-by grammar (and disallow comma | |||
| character) (<https://github.com/httpwg/http-core/issues/24>) | character) (<https://github.com/httpwg/http-core/issues/24>) | |||
| o In Section 5.3, give guidance on interoperable field names | o In Section 5.4.3, give guidance on interoperable field names | |||
| (<https://github.com/httpwg/http-core/issues/30>) | (<https://github.com/httpwg/http-core/issues/30>) | |||
| o In Section 1.6.1, define the semantics and possible replacement of | o In Section 5.7.3, define the semantics and possible replacement of | |||
| whitespace when it is known to occur (<https://github.com/httpwg/ | whitespace when it is known to occur (<https://github.com/httpwg/ | |||
| http-core/issues/53>, <https://www.rfc-editor.org/errata/eid5163>) | http-core/issues/53>, <https://www.rfc-editor.org/errata/eid5163>) | |||
| o In Section 5, introduce field terminology and distinguish between | o In Section 5.4, introduce field terminology and distinguish | |||
| field line values and field values; use terminology consistently | between field line values and field values; use terminology | |||
| throughout (<https://github.com/httpwg/http-core/issues/111>) | consistently throughout (<https://github.com/httpwg/http-core/ | |||
| issues/111>) | ||||
| o Moved #rule definition into Section 5.4 and whitespace into | o Moved #rule definition into Section 5.4.4 and whitespace into | |||
| Section 1.6 (<https://github.com/httpwg/http-core/issues/162>) | Section 2.1 (<https://github.com/httpwg/http-core/issues/162>) | |||
| o In Section 7.1.4, explicitly call out range unit names as case- | o In Section 13.1, explicitly call out range unit names as case- | |||
| insensitive, and encourage registration | insensitive, and encourage registration | |||
| (<https://github.com/httpwg/http-core/issues/179>) | (<https://github.com/httpwg/http-core/issues/179>) | |||
| o In Section 7.1.2, explicitly call out content codings as case- | o In Section 7.5.1, explicitly call out content codings as case- | |||
| insensitive, and encourage registration | insensitive, and encourage registration | |||
| (<https://github.com/httpwg/http-core/issues/179>) | (<https://github.com/httpwg/http-core/issues/179>) | |||
| o In Section 5.3, explicitly call out field names as case- | o In Section 5.4.3, explicitly call out field names as case- | |||
| insensitive (<https://github.com/httpwg/http-core/issues/179>) | insensitive (<https://github.com/httpwg/http-core/issues/179>) | |||
| o In Section 12.12, cite [Bujlow] (<https://github.com/httpwg/http- | o In Section 16.12, cite [Bujlow] (<https://github.com/httpwg/http- | |||
| core/issues/185>) | core/issues/185>) | |||
| o In Section 10, formally define "final" and "interim" status codes | o In Section 14, formally define "final" and "interim" status codes | |||
| (<https://github.com/httpwg/http-core/issues/245>) | (<https://github.com/httpwg/http-core/issues/245>) | |||
| o In Section 8.3.5, caution against a request body more strongly | o In Section 8.3.5, caution against a request body more strongly | |||
| (<https://github.com/httpwg/http-core/issues/258>) | (<https://github.com/httpwg/http-core/issues/258>) | |||
| o In Section 11.2.3, note that Etag can be used in trailers | o In Section 7.9.3, note that Etag can be used in trailers | |||
| (<https://github.com/httpwg/http-core/issues/262>) | (<https://github.com/httpwg/http-core/issues/262>) | |||
| o In Section 13.4, consider reserved fields as well | o In Section 17.4, consider reserved fields as well | |||
| (<https://github.com/httpwg/http-core/issues/273>) | (<https://github.com/httpwg/http-core/issues/273>) | |||
| o In Section 2.5.4, be more correct about what was deprecated by RFC | o In Section 4.2.4, be more correct about what was deprecated by RFC | |||
| 3986 (<https://github.com/httpwg/http-core/issues/278>, | 3986 (<https://github.com/httpwg/http-core/issues/278>, | |||
| <https://www.rfc-editor.org/errata/eid5964>) | <https://www.rfc-editor.org/errata/eid5964>) | |||
| o In Section 5.1, recommend comma SP when combining field lines | o In Section 5.4.1, recommend comma SP when combining field lines | |||
| (<https://github.com/httpwg/http-core/issues/148>) | (<https://github.com/httpwg/http-core/issues/148>) | |||
| o In Section 6.5, make explicit requirements on origin server to use | o In Section 6.1.2, make explicit requirements on origin server to | |||
| authority from absolute-form when available | use authority from absolute-form when available | |||
| (<https://github.com/httpwg/http-core/issues/191>) | (<https://github.com/httpwg/http-core/issues/191>) | |||
| o In Section 2.5.1, Section 2.5.2, Section 6.2, and Section 6.3.3, | o In Section 4.2.1, Section 4.2.2, Section 4.3.1, and Section 6.2.3, | |||
| refactored schemes to define origin and authoritative access to an | refactored schemes to define origin and authoritative access to an | |||
| origin server for both "http" and "https" URIs to account for | origin server for both "http" and "https" URIs to account for | |||
| alternative services and secured connections that are not | alternative services and secured connections that are not | |||
| necessarily based on TCP (<https://github.com/httpwg/http-core/ | necessarily based on TCP (<https://github.com/httpwg/http-core/ | |||
| issues/237>) | issues/237>) | |||
| o In Section 1.5, reference RFC 8174 as well | o In Section 2.2, reference RFC 8174 as well | |||
| (<https://github.com/httpwg/http-core/issues/303>) | (<https://github.com/httpwg/http-core/issues/303>) | |||
| C.9. Since draft-ietf-httpbis-semantics-07 | C.9. Since draft-ietf-httpbis-semantics-07 | |||
| o In Section 9.3, explicitly reference the definition of | o In Section 13.2, explicitly reference the definition of | |||
| representation data as including any content codings | representation data as including any content codings | |||
| (<https://github.com/httpwg/http-core/issues/11>) | (<https://github.com/httpwg/http-core/issues/11>) | |||
| o Move TE: trailers from [Messaging] into Section 5.6.2 | o Move TE: trailers from [Messaging] into Section 5.6.2 | |||
| (<https://github.com/httpwg/http-core/issues/18>) | (<https://github.com/httpwg/http-core/issues/18>) | |||
| o In Section 7.2.4, adjust requirements for handling multiple | o In Section 7.7, adjust requirements for handling multiple content- | |||
| content-length values (<https://github.com/httpwg/http-core/ | length values (<https://github.com/httpwg/http-core/issues/59>) | |||
| issues/59>) | ||||
| o In Section 9.2.3 and Section 9.2.4, clarified condition evaluation | o In Section 12.1.1 and Section 12.1.2, clarified condition | |||
| (<https://github.com/httpwg/http-core/issues/72>) | evaluation (<https://github.com/httpwg/http-core/issues/72>) | |||
| o In Section 5.4, remove concept of obs-fold, as that is | o In Section 5.4.4, remove concept of obs-fold, as that is | |||
| HTTP/1-specific (<https://github.com/httpwg/http-core/issues/116>) | HTTP/1-specific (<https://github.com/httpwg/http-core/issues/116>) | |||
| o In Section 7.4, introduce the concept of request payload | o In Section 11, introduce the concept of request payload | |||
| negotiation (Section 7.4.3) and define for Accept-Encoding | negotiation (Section 11.3) and define for Accept-Encoding | |||
| (<https://github.com/httpwg/http-core/issues/119>) | (<https://github.com/httpwg/http-core/issues/119>) | |||
| o In Section 10.3.6, Section 10.5.9, and Section 10.5.14, remove | o In Section 14.3.6, Section 14.5.9, and Section 14.5.14, remove | |||
| HTTP/1-specific, connection-related requirements | HTTP/1-specific, connection-related requirements | |||
| (<https://github.com/httpwg/http-core/issues/144>) | (<https://github.com/httpwg/http-core/issues/144>) | |||
| o In Section 8.3.6, correct language about what is forwarded | o In Section 8.3.6, correct language about what is forwarded | |||
| (<https://github.com/httpwg/http-core/issues/170>) | (<https://github.com/httpwg/http-core/issues/170>) | |||
| o Throughout, replace "effective request URI", "request-target" and | o Throughout, replace "effective request URI", "request-target" and | |||
| similar with "target URI" (<https://github.com/httpwg/http-core/ | similar with "target URI" (<https://github.com/httpwg/http-core/ | |||
| issues/259>) | issues/259>) | |||
| o In Section 5.7 and Section 10.7.2, describe how extensions should | o In Section 15.3.3 and Section 15.2.2, describe how extensions | |||
| consider scope of applicability (<https://github.com/httpwg/http- | should consider scope of applicability | |||
| core/issues/265>) | (<https://github.com/httpwg/http-core/issues/265>) | |||
| o In Section 2.1, don't rely on the HTTP/1.1 Messaging specification | o In Section 3.3, don't rely on the HTTP/1.1 Messaging specification | |||
| to define "message" (<https://github.com/httpwg/http-core/ | to define "message" (<https://github.com/httpwg/http-core/ | |||
| issues/311>) | issues/311>) | |||
| o In Section 7.2.5 and Section 9.6.2, note that URL resolution is | o In Section 7.8 and Section 9.1.3, note that URL resolution is | |||
| necessary (<https://github.com/httpwg/http-core/issues/321>) | necessary (<https://github.com/httpwg/http-core/issues/321>) | |||
| o In Section 7, explicitly reference 206 as one of the status codes | o In Section 7, explicitly reference 206 as one of the status codes | |||
| that provide representation data (<https://github.com/httpwg/http- | that provide representation data (<https://github.com/httpwg/http- | |||
| core/issues/325>) | core/issues/325>) | |||
| o In Section 9.2.6, refine requirements so that they don't apply to | o In Section 12.1.4, refine requirements so that they don't apply to | |||
| resources without a concept of modification time | resources without a concept of modification time | |||
| (<https://github.com/httpwg/http-core/issues/326>) | (<https://github.com/httpwg/http-core/issues/326>) | |||
| o In Section 11.3.2, specify the scope as a request, not a target | o In Section 10.7.1, specify the scope as a request, not a target | |||
| resource (<https://github.com/httpwg/http-core/issues/331>) | resource (<https://github.com/httpwg/http-core/issues/331>) | |||
| o In Section 2.1, introduce concept of "complete" messages | o In Section 3.3, introduce concept of "complete" messages | |||
| (<https://github.com/httpwg/http-core/issues/334>) | (<https://github.com/httpwg/http-core/issues/334>) | |||
| o In Section 6.1, Section 8.3.6, and Section 8.3.7, refine use of | o In Section 6.1, Section 8.3.6, and Section 8.3.7, refine use of | |||
| "request target" (<https://github.com/httpwg/http-core/ | "request target" (<https://github.com/httpwg/http-core/ | |||
| issues/340>) | issues/340>) | |||
| o Throughout, remove "status-line" and "request-line", as these are | o Throughout, remove "status-line" and "request-line", as these are | |||
| HTTP/1.1-specific (<https://github.com/httpwg/http-core/ | HTTP/1.1-specific (<https://github.com/httpwg/http-core/ | |||
| issues/361>) | issues/361>) | |||
| C.10. Since draft-ietf-httpbis-semantics-08 | C.10. Since draft-ietf-httpbis-semantics-08 | |||
| o In Section 10.5.17, remove duplicate definition of what makes a | o In Section 14.5.17, remove duplicate definition of what makes a | |||
| range satisfiable and refer instead to each range unit's | range satisfiable and refer instead to each range unit's | |||
| definition (<https://github.com/httpwg/http-core/issues/12>) | definition (<https://github.com/httpwg/http-core/issues/12>) | |||
| o In Section 7.1.4.2 and Section 9.3, clarify that a selected | o In Section 13.1.2 and Section 13.2, clarify that a selected | |||
| representation of zero length can only be satisfiable as a suffix | representation of zero length can only be satisfiable as a suffix | |||
| range and that a server can still ignore Range for that case | range and that a server can still ignore Range for that case | |||
| (<https://github.com/httpwg/http-core/issues/12>) | (<https://github.com/httpwg/http-core/issues/12>) | |||
| o In Section 9.4.1 and Section 10.5.16, allow "Accept" as response | o In Section 11.1.2 and Section 14.5.16, allow "Accept" as response | |||
| field (<https://github.com/httpwg/http-core/issues/48>) | field (<https://github.com/httpwg/http-core/issues/48>) | |||
| o Appendix A now uses the sender variant of the "#" list expansion | o Appendix A now uses the sender variant of the "#" list expansion | |||
| (<https://github.com/httpwg/http-core/issues/192>) | (<https://github.com/httpwg/http-core/issues/192>) | |||
| o In Section 11.1.4, make the field list-based even when "*" is | o In Section 11.2.1, make the field list-based even when "*" is | |||
| present (<https://github.com/httpwg/http-core/issues/272>) | present (<https://github.com/httpwg/http-core/issues/272>) | |||
| o In Section 5.3.2, add optional "Comments" entry | o In Section 15.3.1, add optional "Comments" entry | |||
| (<https://github.com/httpwg/http-core/issues/273>) | (<https://github.com/httpwg/http-core/issues/273>) | |||
| o In Section 5.8, reserve "*" as field name | o In Section 17.4, reserve "*" as field name | |||
| (<https://github.com/httpwg/http-core/issues/274>) | (<https://github.com/httpwg/http-core/issues/274>) | |||
| o In Section 13.2, reserve "*" as method name | o In Section 17.2, reserve "*" as method name | |||
| (<https://github.com/httpwg/http-core/issues/274>) | (<https://github.com/httpwg/http-core/issues/274>) | |||
| o In Section 9.2.3 and Section 9.2.4, state that multiple "*" is | o In Section 12.1.1 and Section 12.1.2, state that multiple "*" is | |||
| unlikely to be interoperable (<https://github.com/httpwg/http- | unlikely to be interoperable (<https://github.com/httpwg/http- | |||
| core/issues/305>) | core/issues/305>) | |||
| o In Section 9.4.1, avoid use of obsolete media type parameter on | o In Section 11.1.2, avoid use of obsolete media type parameter on | |||
| text/html (<https://github.com/httpwg/http-core/issues/375>, | text/html (<https://github.com/httpwg/http-core/issues/375>, | |||
| <https://www.rfc-editor.org/errata/eid6149>) | <https://www.rfc-editor.org/errata/eid6149>) | |||
| o Rephrase prose in Section 2.1 to become version-agnostic | o Rephrase prose in Section 3.3 to become version-agnostic | |||
| (<https://github.com/httpwg/http-core/issues/372>) | (<https://github.com/httpwg/http-core/issues/372>) | |||
| o In Section 5.4, instruct recipients how to deal with control | o In Section 5.4.4, instruct recipients how to deal with control | |||
| characters in field values (<https://github.com/httpwg/http-core/ | characters in field values (<https://github.com/httpwg/http-core/ | |||
| issues/377>) | issues/377>) | |||
| o In Section 5.4, update note about field ABNF | o In Section 5.4.4, update note about field ABNF | |||
| (<https://github.com/httpwg/http-core/issues/380>) | (<https://github.com/httpwg/http-core/issues/380>) | |||
| o Add Section 4 about Extending and Versioning HTTP | o Add Section 15 about Extending and Versioning HTTP | |||
| (<https://github.com/httpwg/http-core/issues/384>) | (<https://github.com/httpwg/http-core/issues/384>) | |||
| o In Section 10.1, include status 308 in list of heuristically | o In Section 14.1, include status 308 in list of heuristically | |||
| cacheable status codes (<https://github.com/httpwg/http-core/ | cacheable status codes (<https://github.com/httpwg/http-core/ | |||
| issues/385>) | issues/385>) | |||
| o In Section 7.2.2, make it clearer that "identity" is not to be | o In Section 7.5, make it clearer that "identity" is not to be | |||
| included (<https://github.com/httpwg/http-core/issues/388>) | included (<https://github.com/httpwg/http-core/issues/388>) | |||
| C.11. Since draft-ietf-httpbis-semantics-09 | C.11. Since draft-ietf-httpbis-semantics-09 | |||
| o Switch to xml2rfc v3 mode for draft generation | o Switch to xml2rfc v3 mode for draft generation | |||
| (<https://github.com/httpwg/http-core/issues/394>) | (<https://github.com/httpwg/http-core/issues/394>) | |||
| C.12. Since draft-ietf-httpbis-semantics-10 | C.12. Since draft-ietf-httpbis-semantics-10 | |||
| o In Section 12.6, mention compression attacks | o In Section 16.6, mention compression attacks | |||
| (<https://github.com/httpwg/http-core/issues/6>) | (<https://github.com/httpwg/http-core/issues/6>) | |||
| o In Section 7.1.2.4, advise to make new content codings self- | o In Section 15.6.1, advise to make new content codings self- | |||
| descriptive (<https://github.com/httpwg/http-core/issues/21>) | descriptive (<https://github.com/httpwg/http-core/issues/21>) | |||
| o In Section 5.4.1.4, introduced the "parameters" ABNF rule, | o In Section 5.7.6, introduced the "parameters" ABNF rule, allowing | |||
| allowing empty parameters and trailing semicolons within media | empty parameters and trailing semicolons within media type, media | |||
| type, media range, and expectation (<https://github.com/httpwg/ | range, and expectation (<https://github.com/httpwg/http-core/ | |||
| http-core/issues/33>) | issues/33>) | |||
| o In Section 10.4, explain how to create a redirected request | o In Section 14.4, explain how to create a redirected request | |||
| (<https://github.com/httpwg/http-core/issues/38>) | (<https://github.com/httpwg/http-core/issues/38>) | |||
| o In Section 7.2.1, defined error handling for multiple members | o In Section 7.4, defined error handling for multiple members | |||
| (<https://github.com/httpwg/http-core/issues/39>) | (<https://github.com/httpwg/http-core/issues/39>) | |||
| o In Section 1, revise the introduction and introduce HTTP/2 and | o In Section 1, revise the introduction and introduce HTTP/2 and | |||
| HTTP/3 (<https://github.com/httpwg/http-core/issues/64>) | HTTP/3 (<https://github.com/httpwg/http-core/issues/64>) | |||
| o In Section 7.2.4, added a definition for Content-Length that | o In Section 7.7, added a definition for Content-Length that | |||
| encompasses its various roles in describing message payload or | encompasses its various roles in describing message payload or | |||
| selected representation length; in Section 10.3.7, noted that | selected representation length; in Section 14.3.7, noted that | |||
| Content-Length counts only the message body (not the selected | Content-Length counts only the message body (not the selected | |||
| representation) and that the complete length is in each | representation) and that the complete length is in each | |||
| Content-Range (<https://github.com/httpwg/http-core/issues/118>) | Content-Range (<https://github.com/httpwg/http-core/issues/118>) | |||
| o Noted that "WWW-Authenticate" with more than one value on a line | o Noted that "WWW-Authenticate" with more than one value on a line | |||
| is sometimes not interoperable [Messaging] | is sometimes not interoperable [Messaging] | |||
| (<https://github.com/httpwg/http-core/issues/136>) | (<https://github.com/httpwg/http-core/issues/136>) | |||
| o In Section 9.2.3 and Section 9.2.6, removed requirement that a | o In Section 12.1.1 and Section 12.1.4, removed requirement that a | |||
| validator not be sent in a 2xx response when validation fails and | validator not be sent in a 2xx response when validation fails and | |||
| the server decides that the same change request has already been | the server decides that the same change request has already been | |||
| applied (<https://github.com/httpwg/http-core/issues/166>) | applied (<https://github.com/httpwg/http-core/issues/166>) | |||
| o Moved requirements specific to HTTP/1.1 from Section 6.5 to | o Moved requirements specific to HTTP/1.1 from Section 6.1.2 to | |||
| [Messaging] (<https://github.com/httpwg/http-core/issues/182>) | [Messaging] (<https://github.com/httpwg/http-core/issues/182>) | |||
| o In Section 5.4, introduce the terms "singleton field" and "list- | o In Section 5.4.4, introduce the terms "singleton field" and "list- | |||
| based field" (also - in various places - discuss what to do when a | based field" (also - in various places - discuss what to do when a | |||
| singleton field is received as a list) | singleton field is received as a list) | |||
| (<https://github.com/httpwg/http-core/issues/193>) | (<https://github.com/httpwg/http-core/issues/193>) | |||
| o In Section 9.1.1, change the ABNF back to be a list of | o In Section 9.1.1, change the ABNF back to be a list of | |||
| expectations, as defined in RFC 2616 (<https://github.com/httpwg/ | expectations, as defined in RFC 2616 (<https://github.com/httpwg/ | |||
| http-core/issues/203>) | http-core/issues/203>) | |||
| o In Section 5.6.4 (Trailer), Section 6.6.1 (Via), Section 6.7 | o In Section 9.1.5 (Trailer), Section 6.4.3 (Via), Section 6.6 | |||
| (Upgrade), Section 6.8 (Connection), Section 7.2.2 | (Upgrade), Section 6.4.1 (Connection), Section 7.5 | |||
| (Content-Encoding), Section 7.2.3 (Content-Language), | (Content-Encoding), Section 7.6 (Content-Language), Section 9.1.1 | |||
| Section 9.1.1 (Expect), Section 9.2.3 (If-Match), Section 9.2.4 | (Expect), Section 12.1.1 (If-Match), Section 12.1.2 | |||
| (If-None-Match), Section 9.4.2 (Accept-Charset), Section 9.4.4 | (If-None-Match), Section 11.1.3 (Accept-Charset), Section 11.1.5 | |||
| (Accept-Language), Section 11.1.4 (Vary), Section 11.3.1 | (Accept-Language), Section 11.2.1 (Vary), Section 10.6.1 | |||
| (WWW-Authenticate), and Section 11.3.2 (Proxy-Authenticate), | (WWW-Authenticate), and Section 10.7.1 (Proxy-Authenticate), | |||
| adjust ABNF to allow empty lists (<https://github.com/httpwg/http- | adjust ABNF to allow empty lists (<https://github.com/httpwg/http- | |||
| core/issues/210>) | core/issues/210>) | |||
| o In Section 8.3.1 and Section 12.9, provide a more nuanced | o In Section 8.3.1 and Section 16.9, provide a more nuanced | |||
| explanation of sensitive data in GET-based forms and describe | explanation of sensitive data in GET-based forms and describe | |||
| workarounds (<https://github.com/httpwg/http-core/issues/277>) | workarounds (<https://github.com/httpwg/http-core/issues/277>) | |||
| o In Section 9.2.1, allow preconditions to be evaluated before the | o In Section 12.2, allow preconditions to be evaluated before the | |||
| request body (if any) is processed (<https://github.com/httpwg/ | request body (if any) is processed (<https://github.com/httpwg/ | |||
| http-core/issues/261>) | http-core/issues/261>) | |||
| o In Section 5 and Section 5.6.3, allow for trailer fields in | o In Section 5.4 and Section 5.6.3, allow for trailer fields in | |||
| multiple trailer sections, depending on the HTTP version and | multiple trailer sections, depending on the HTTP version and | |||
| framing in use, with processing being iterative as each section is | framing in use, with processing being iterative as each section is | |||
| received (<https://github.com/httpwg/http-core/issues/313>) | received (<https://github.com/httpwg/http-core/issues/313>) | |||
| o Moved definitions of "TE" and "Upgrade" from [Messaging] | o Moved definitions of "TE" and "Upgrade" from [Messaging] | |||
| (<https://github.com/httpwg/http-core/issues/392>) | (<https://github.com/httpwg/http-core/issues/392>) | |||
| o Moved 1.1-specific discussion of TLS to Messaging and rewrote | o Moved 1.1-specific discussion of TLS to Messaging and rewrote | |||
| Section 6.3.3.3 to refer to RFC6125 (<https://github.com/httpwg/ | Section 4.3.4 to refer to RFC6125 (<https://github.com/httpwg/ | |||
| http-core/issues/404>) | http-core/issues/404>) | |||
| o Moved definition of "Connection" from [Messaging] | o Moved definition of "Connection" from [Messaging] | |||
| (<https://github.com/httpwg/http-core/issues/407>) | (<https://github.com/httpwg/http-core/issues/407>) | |||
| C.13. Since draft-ietf-httpbis-semantics-11 | ||||
| o The entire document has been reorganized, with no changes to | ||||
| content except editorial for the reorganization | ||||
| (<https://github.com/httpwg/http-core/issues/368>) | ||||
| o Move IANA Upgrade Token Registry instructions from [Messaging] | ||||
| (<https://github.com/httpwg/http-core/issues/450>) | ||||
| Acknowledgments | Acknowledgments | |||
| This edition of the HTTP specification builds on the many | This edition of the HTTP specification builds on the many | |||
| contributions that went into RFC 1945, RFC 2068, RFC 2145, RFC 2616, | contributions that went into RFC 1945, RFC 2068, RFC 2145, RFC 2616, | |||
| and RFC 2818, including substantial contributions made by the | and RFC 2818, including substantial contributions made by the | |||
| previous authors, editors, and Working Group Chairs: Tim Berners-Lee, | previous authors, editors, and Working Group Chairs: Tim Berners-Lee, | |||
| Jean-François Groff, Ari Luotonen, Roy T. Fielding, Henrik Frystyk | Jean-François Groff, Ari Luotonen, Roy T. Fielding, Henrik Frystyk | |||
| Nielsen, Jim Gettys, Jeffrey C. Mogul, Larry Masinter, Paul J. | Nielsen, Jim Gettys, Jeffrey C. Mogul, Larry Masinter, Paul J. | |||
| Leach, Eric Rescorla, and Yves Lafon. | Leach, Eric Rescorla, and Yves Lafon. | |||
| skipping to change at page 218, line 4 ¶ | skipping to change at page 218, line 40 ¶ | |||
| Authors' Addresses | Authors' Addresses | |||
| Roy T. Fielding (editor) | Roy T. Fielding (editor) | |||
| Adobe | Adobe | |||
| 345 Park Ave | 345 Park Ave | |||
| San Jose, CA 95110 | San Jose, CA 95110 | |||
| United States of America | United States of America | |||
| Email: fielding@gbiv.com | Email: fielding@gbiv.com | |||
| URI: https://roy.gbiv.com/ | URI: https://roy.gbiv.com/ | |||
| Mark Nottingham (editor) | Mark Nottingham (editor) | |||
| Fastly | Fastly | |||
| Prahran VIC | Prahran VIC | |||
| Australia | Australia | |||
| Email: mnot@mnot.net | Email: mnot@mnot.net | |||
| URI: https://www.mnot.net/ | URI: https://www.mnot.net/ | |||
| Julian Reschke (editor) | ||||
| Julian F. Reschke (editor) | ||||
| greenbytes GmbH | greenbytes GmbH | |||
| Hafenweg 16 | Hafenweg 16 | |||
| 48155 Münster | 48155 Münster | |||
| Germany | Germany | |||
| Email: julian.reschke@greenbytes.de | Email: julian.reschke@greenbytes.de | |||
| URI: https://greenbytes.de/tech/webdav/ | URI: https://greenbytes.de/tech/webdav/ | |||
| End of changes. 904 change blocks. | ||||
| 4243 lines changed or deleted | 4265 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/ | ||||