| frankenRFC723x_sem.txt | draft-ietf-httpbis-semantics-18.txt | |||
|---|---|---|---|---|
| Internet Engineering Task Force (IETF) R. Fielding, Ed. | HTTP Working Group R. Fielding, Ed. | |||
| Request for Comments: 7231 Adobe | Internet-Draft Adobe | |||
| Obsoletes: 2616 J. Reschke, Ed. | Obsoletes: 2818, 7230, 7231, 7232, 7233, 7235, M. Nottingham, Ed. | |||
| Updates: 2817 greenbytes | 7538, 7615, 7694 (if approved) Fastly | |||
| Category: Standards Track June 2014 | Updates: 3864 (if approved) J. Reschke, Ed. | |||
| ISSN: 2070-1721 | Intended status: Standards Track greenbytes | |||
| Expires: 19 February 2022 18 August 2021 | ||||
| Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content | HTTP Semantics | |||
| draft-ietf-httpbis-semantics-18 | ||||
| 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/1.1 messages, | systems. This document describes the overall architecture of HTTP, | |||
| as expressed by request methods, request header fields, response | establishes common terminology, and defines aspects of the protocol | |||
| status codes, and response header fields, along with the payload of | that are shared by all versions. In this definition are core | |||
| messages (metadata and body content) and mechanisms for content | protocol elements, extensibility mechanisms, and the "http" and | |||
| negotiation. | "https" Uniform Resource Identifier (URI) schemes. | |||
| This document updates RFC 3864 and obsoletes RFC 2818, RFC 7231, RFC | ||||
| 7232, RFC 7233, RFC 7235, RFC 7538, RFC 7615, RFC 7694, and portions | ||||
| of RFC 7230. | ||||
| Editorial Note | Editorial Note | |||
| This note is not in the original RFC. | This note is to be removed before publishing as an RFC. | |||
| The purpose of this document is to produce diffs that show just the | Discussion of this draft takes place on the HTTP working group | |||
| changes from text in the original RFCs that were input for http-core. | mailing list (ietf-http-wg@w3.org), which is archived at | |||
| Hence, the frankenRFC documents show all of the original text (including | <https://lists.w3.org/Archives/Public/ietf-http-wg/>. | |||
| stuff that has been deleted) plus some new text [in brackets] or new | ||||
| headings to anchor the context, rearranged to minimize the resulting | ||||
| diffs when compared to the most recently published version of | ||||
| draft-ietf-httpbis-semantics. | ||||
| After this document is updated to match any reorg changes in the latest | Working Group information can be found at <https://httpwg.org/>; | |||
| version, the franken diffs are saved and published in this directory as | source code and issues list for this draft can be found at | |||
| diff_semantics_frfc_to_NN.html (where NN is the I-D draft revision) | <https://github.com/httpwg/http-core>. | |||
| The changes in this draft are summarized in Appendix C.19. | ||||
| Status of This Memo | Status of This Memo | |||
| This is an Internet Standards Track document. | This Internet-Draft is submitted in full conformance with the | |||
| provisions of BCP 78 and BCP 79. | ||||
| This document is a product of the Internet Engineering Task Force | Internet-Drafts are working documents of the Internet Engineering | |||
| (IETF). It represents the consensus of the IETF community. It has | Task Force (IETF). Note that other groups may also distribute | |||
| received public review and has been approved for publication by the | working documents as Internet-Drafts. The list of current Internet- | |||
| Internet Engineering Steering Group (IESG). Further information on | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
| Internet Standards is available in Section 2 of RFC 5741. | ||||
| Information about the current status of this document, any errata, | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and how to provide feedback on it may be obtained at | and may be updated, replaced, or obsoleted by other documents at any | |||
| http://www.rfc-editor.org/info/rfc7231. | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | ||||
| This Internet-Draft will expire on 19 February 2022. | ||||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2014 IETF Trust and the persons identified as the | Copyright (c) 2021 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents (https://trustee.ietf.org/ | |||
| (http://trustee.ietf.org/license-info) in effect on the date of | license-info) in effect on the date of publication of this document. | |||
| publication of this document. Please review these documents | Please review these documents carefully, as they describe your rights | |||
| carefully, as they describe your rights and restrictions with respect | and restrictions with respect to this document. Code Components | |||
| to this document. Code Components extracted from this document must | extracted from this document must include Simplified BSD License text | |||
| include Simplified BSD License text as described in Section 4.e of | as described in Section 4.e of the Trust Legal Provisions and are | |||
| the Trust Legal Provisions and are provided without warranty as | provided without warranty as described in the Simplified BSD License. | |||
| described in the Simplified BSD License. | ||||
| This document may contain material from IETF Documents or IETF | This document may contain material from IETF Documents or IETF | |||
| Contributions published or made publicly available before November | Contributions published or made publicly available before November | |||
| 10, 2008. The person(s) controlling the copyright in some of this | 10, 2008. The person(s) controlling the copyright in some of this | |||
| material may not have granted the IETF Trust the right to allow | material may not have granted the IETF Trust the right to allow | |||
| 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 ....................................................6 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 1.1. Conformance and Error Handling .............................6 | 1.1. Purpose . . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 1.2. Syntax Notation ............................................6 | 1.2. History and Evolution . . . . . . . . . . . . . . . . . . 10 | |||
| 2. Resources .......................................................7 | 1.3. Core Semantics . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 3. Representations .................................................7 | 1.4. Specifications Obsoleted by this Document . . . . . . . . 11 | |||
| 3.1. Representation Metadata ....................................8 | 2. Conformance . . . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 3.1.1. Processing Representation Data ......................8 | 2.1. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 3.1.2. Encoding for Compression or Integrity ..............11 | 2.2. Requirements Notation . . . . . . . . . . . . . . . . . . 13 | |||
| 3.1.3. Audience Language ..................................13 | 2.3. Length Requirements . . . . . . . . . . . . . . . . . . . 14 | |||
| 3.1.4. Identification .....................................14 | 2.4. Error Handling . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 3.2. Representation Data .......................................17 | 2.5. Protocol Version . . . . . . . . . . . . . . . . . . . . 15 | |||
| 3.3. Payload Semantics .........................................17 | 3. Terminology and Core Concepts . . . . . . . . . . . . . . . . 16 | |||
| 3.4. Content Negotiation .......................................18 | 3.1. Resources . . . . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 3.4.1. Proactive Negotiation ..............................19 | 3.2. Representations . . . . . . . . . . . . . . . . . . . . . 17 | |||
| 3.4.2. Reactive Negotiation ...............................20 | 3.3. Connections, Clients and Servers . . . . . . . . . . . . 17 | |||
| 4. Request Methods ................................................21 | 3.4. Messages . . . . . . . . . . . . . . . . . . . . . . . . 18 | |||
| 4.1. Overview ..................................................21 | 3.5. User Agents . . . . . . . . . . . . . . . . . . . . . . . 18 | |||
| 4.2. Common Method Properties ..................................22 | 3.6. Origin Server . . . . . . . . . . . . . . . . . . . . . . 19 | |||
| 4.2.1. Safe Methods .......................................22 | 3.7. Intermediaries . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 4.2.2. Idempotent Methods .................................23 | 3.8. Caches . . . . . . . . . . . . . . . . . . . . . . . . . 22 | |||
| 4.2.3. Cacheable Methods ..................................24 | 3.9. Example Message Exchange . . . . . . . . . . . . . . . . 22 | |||
| 4.3. Method Definitions ........................................24 | 4. Identifiers in HTTP . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 4.3.1. GET ................................................24 | 4.1. URI References . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 4.3.2. HEAD ...............................................25 | 4.2. HTTP-Related URI Schemes . . . . . . . . . . . . . . . . 24 | |||
| 4.3.3. POST ...............................................25 | 4.2.1. http URI Scheme . . . . . . . . . . . . . . . . . . . 25 | |||
| 4.3.4. PUT ................................................26 | 4.2.2. https URI Scheme . . . . . . . . . . . . . . . . . . 25 | |||
| 4.3.5. DELETE .............................................29 | 4.2.3. http(s) Normalization and Comparison . . . . . . . . 26 | |||
| 4.3.6. CONNECT ............................................30 | 4.2.4. Deprecation of userinfo in http(s) URIs . . . . . . . 27 | |||
| 4.3.7. OPTIONS ............................................31 | 4.2.5. http(s) References with Fragment Identifiers . . . . 28 | |||
| 4.3.8. TRACE ..............................................32 | 4.3. Authoritative Access . . . . . . . . . . . . . . . . . . 28 | |||
| 5. Request Header Fields ..........................................33 | 4.3.1. URI Origin . . . . . . . . . . . . . . . . . . . . . 28 | |||
| 5.1. Controls ..................................................33 | 4.3.2. http origins . . . . . . . . . . . . . . . . . . . . 29 | |||
| 5.1.1. Expect .............................................34 | 4.3.3. https origins . . . . . . . . . . . . . . . . . . . . 30 | |||
| 5.1.2. Max-Forwards .......................................36 | 4.3.4. https certificate verification . . . . . . . . . . . 31 | |||
| 5.2. Conditionals ..............................................36 | 4.3.5. IP-ID reference identity . . . . . . . . . . . . . . 32 | |||
| 5.3. Content Negotiation .......................................37 | 5. Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 | |||
| 5.3.1. Quality Values .....................................37 | 5.1. Field Names . . . . . . . . . . . . . . . . . . . . . . . 33 | |||
| 5.3.2. Accept .............................................38 | 5.2. Field Lines and Combined Field Value . . . . . . . . . . 33 | |||
| 5.3.3. Accept-Charset .....................................40 | 5.3. Field Order . . . . . . . . . . . . . . . . . . . . . . . 34 | |||
| 5.3.4. Accept-Encoding ....................................41 | 5.4. Field Limits . . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 5.3.5. Accept-Language ....................................42 | 5.5. Field Values . . . . . . . . . . . . . . . . . . . . . . 35 | |||
| 5.4. Authentication Credentials ................................44 | 5.6. Common Rules for Defining Field Values . . . . . . . . . 37 | |||
| 5.5. Request Context ...........................................44 | 5.6.1. Lists (#rule ABNF Extension) . . . . . . . . . . . . 37 | |||
| 5.5.1. From ...............................................44 | 5.6.1.1. Sender Requirements . . . . . . . . . . . . . . . 37 | |||
| 5.5.2. Referer ............................................45 | 5.6.1.2. Recipient Requirements . . . . . . . . . . . . . 38 | |||
| 5.5.3. User-Agent .........................................46 | 5.6.2. Tokens . . . . . . . . . . . . . . . . . . . . . . . 38 | |||
| 6. Response Status Codes ..........................................47 | 5.6.3. Whitespace . . . . . . . . . . . . . . . . . . . . . 39 | |||
| 6.1. Overview of Status Codes ..................................48 | 5.6.4. Quoted Strings . . . . . . . . . . . . . . . . . . . 39 | |||
| 6.2. Informational 1xx .........................................50 | 5.6.5. Comments . . . . . . . . . . . . . . . . . . . . . . 40 | |||
| 6.2.1. 100 Continue .......................................50 | 5.6.6. Parameters . . . . . . . . . . . . . . . . . . . . . 40 | |||
| 6.2.2. 101 Switching Protocols ............................50 | 5.6.7. Date/Time Formats . . . . . . . . . . . . . . . . . . 41 | |||
| 6.3. Successful 2xx ............................................51 | 6. Message Abstraction . . . . . . . . . . . . . . . . . . . . . 43 | |||
| 6.3.1. 200 OK .............................................51 | 6.1. Framing and Completeness . . . . . . . . . . . . . . . . 44 | |||
| 6.3.2. 201 Created ........................................52 | 6.2. Control Data . . . . . . . . . . . . . . . . . . . . . . 45 | |||
| 6.3.3. 202 Accepted .......................................52 | 6.3. Header Fields . . . . . . . . . . . . . . . . . . . . . . 46 | |||
| 6.3.4. 203 Non-Authoritative Information ..................52 | 6.4. Content . . . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
| 6.3.5. 204 No Content .....................................53 | 6.4.1. Content Semantics . . . . . . . . . . . . . . . . . . 46 | |||
| 6.3.6. 205 Reset Content ..................................53 | 6.4.2. Identifying Content . . . . . . . . . . . . . . . . . 47 | |||
| 6.4. Redirection 3xx ...........................................54 | 6.5. Trailer Fields . . . . . . . . . . . . . . . . . . . . . 49 | |||
| 6.4.1. 300 Multiple Choices ...............................55 | 6.5.1. Limitations on use of Trailers . . . . . . . . . . . 49 | |||
| 6.4.2. 301 Moved Permanently ..............................56 | 6.5.2. Processing Trailer Fields . . . . . . . . . . . . . . 50 | |||
| 6.4.3. 302 Found ..........................................56 | 6.6. Message Metadata . . . . . . . . . . . . . . . . . . . . 50 | |||
| 6.4.4. 303 See Other ......................................57 | 6.6.1. Date . . . . . . . . . . . . . . . . . . . . . . . . 51 | |||
| 6.4.5. 305 Use Proxy ......................................58 | 6.6.2. Trailer . . . . . . . . . . . . . . . . . . . . . . . 52 | |||
| 6.4.6. 306 (Unused) .......................................58 | 7. Routing HTTP Messages . . . . . . . . . . . . . . . . . . . . 52 | |||
| 6.4.7. 307 Temporary Redirect .............................58 | 7.1. Determining the Target Resource . . . . . . . . . . . . . 52 | |||
| 6.5. Client Error 4xx ..........................................58 | 7.2. Host and :authority . . . . . . . . . . . . . . . . . . . 53 | |||
| 6.5.1. 400 Bad Request ....................................58 | 7.3. Routing Inbound Requests . . . . . . . . . . . . . . . . 54 | |||
| 6.5.2. 402 Payment Required ...............................59 | 7.3.1. To a Cache . . . . . . . . . . . . . . . . . . . . . 54 | |||
| 6.5.3. 403 Forbidden ......................................59 | 7.3.2. To a Proxy . . . . . . . . . . . . . . . . . . . . . 54 | |||
| 6.5.4. 404 Not Found ......................................59 | 7.3.3. To the Origin . . . . . . . . . . . . . . . . . . . . 54 | |||
| 6.5.5. 405 Method Not Allowed .............................59 | 7.4. Rejecting Misdirected Requests . . . . . . . . . . . . . 55 | |||
| 6.5.6. 406 Not Acceptable .................................60 | 7.5. Response Correlation . . . . . . . . . . . . . . . . . . 55 | |||
| 6.5.7. 408 Request Timeout ................................60 | 7.6. Message Forwarding . . . . . . . . . . . . . . . . . . . 56 | |||
| 6.5.8. 409 Conflict .......................................60 | 7.6.1. Connection . . . . . . . . . . . . . . . . . . . . . 56 | |||
| 6.5.9. 410 Gone ...........................................60 | 7.6.2. Max-Forwards . . . . . . . . . . . . . . . . . . . . 58 | |||
| 6.5.10. 411 Length Required ...............................61 | 7.6.3. Via . . . . . . . . . . . . . . . . . . . . . . . . . 59 | |||
| 6.5.11. 413 Payload Too Large .............................61 | 7.7. Message Transformations . . . . . . . . . . . . . . . . . 60 | |||
| 6.5.12. 414 URI Too Long ..................................61 | 7.8. Upgrade . . . . . . . . . . . . . . . . . . . . . . . . . 61 | |||
| 6.5.13. 415 Unsupported Media Type ........................62 | 8. Representation Data and Metadata . . . . . . . . . . . . . . 64 | |||
| 6.5.14. 417 Expectation Failed ............................62 | 8.1. Representation Data . . . . . . . . . . . . . . . . . . . 64 | |||
| 6.5.15. 426 Upgrade Required ..............................62 | 8.2. Representation Metadata . . . . . . . . . . . . . . . . . 64 | |||
| 6.6. Server Error 5xx ..........................................62 | 8.3. Content-Type . . . . . . . . . . . . . . . . . . . . . . 64 | |||
| 6.6.1. 500 Internal Server Error ..........................63 | 8.3.1. Media Type . . . . . . . . . . . . . . . . . . . . . 65 | |||
| 6.6.2. 501 Not Implemented ................................63 | 8.3.2. Charset . . . . . . . . . . . . . . . . . . . . . . . 66 | |||
| 6.6.3. 502 Bad Gateway ....................................63 | 8.3.3. Multipart Types . . . . . . . . . . . . . . . . . . . 66 | |||
| 6.6.4. 503 Service Unavailable ............................63 | 8.4. Content-Encoding . . . . . . . . . . . . . . . . . . . . 67 | |||
| 6.6.5. 504 Gateway Timeout ................................63 | 8.4.1. Content Codings . . . . . . . . . . . . . . . . . . . 68 | |||
| 6.6.6. 505 HTTP Version Not Supported .....................64 | 8.4.1.1. Compress Coding . . . . . . . . . . . . . . . . . 68 | |||
| 7. Response Header Fields .........................................64 | 8.4.1.2. Deflate Coding . . . . . . . . . . . . . . . . . 68 | |||
| 7.1. Control Data ..............................................64 | 8.4.1.3. Gzip Coding . . . . . . . . . . . . . . . . . . . 69 | |||
| 7.1.1. Origination Date ...................................65 | 8.5. Content-Language . . . . . . . . . . . . . . . . . . . . 69 | |||
| 7.1.2. Location ...........................................68 | 8.5.1. Language Tags . . . . . . . . . . . . . . . . . . . . 70 | |||
| 7.1.3. Retry-After ........................................69 | 8.6. Content-Length . . . . . . . . . . . . . . . . . . . . . 70 | |||
| 7.1.4. Vary ...............................................70 | 8.7. Content-Location . . . . . . . . . . . . . . . . . . . . 72 | |||
| 7.2. Validator Header Fields ...................................71 | 8.8. Validator Fields . . . . . . . . . . . . . . . . . . . . 74 | |||
| 7.3. Authentication Challenges .................................72 | 8.8.1. Weak versus Strong . . . . . . . . . . . . . . . . . 74 | |||
| 7.4. Response Context ..........................................72 | 8.8.2. Last-Modified . . . . . . . . . . . . . . . . . . . . 76 | |||
| 7.4.1. Allow ..............................................72 | 8.8.2.1. Generation . . . . . . . . . . . . . . . . . . . 76 | |||
| 7.4.2. Server .............................................73 | 8.8.2.2. Comparison . . . . . . . . . . . . . . . . . . . 77 | |||
| 8. IANA Considerations ............................................73 | 8.8.3. ETag . . . . . . . . . . . . . . . . . . . . . . . . 78 | |||
| 8.1. Method Registry ...........................................73 | 8.8.3.1. Generation . . . . . . . . . . . . . . . . . . . 79 | |||
| 8.1.1. Procedure ..........................................74 | 8.8.3.2. Comparison . . . . . . . . . . . . . . . . . . . 80 | |||
| 8.1.2. Considerations for New Methods .....................74 | 8.8.3.3. Example: Entity-Tags Varying on Content-Negotiated | |||
| 8.1.3. Registrations ......................................75 | Resources . . . . . . . . . . . . . . . . . . . . . 80 | |||
| 8.2. Status Code Registry ......................................75 | 9. Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 | |||
| 8.2.1. Procedure ..........................................75 | 9.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . 81 | |||
| 8.2.2. Considerations for New Status Codes ................76 | 9.2. Common Method Properties . . . . . . . . . . . . . . . . 84 | |||
| 8.2.3. Registrations ......................................76 | 9.2.1. Safe Methods . . . . . . . . . . . . . . . . . . . . 84 | |||
| 8.3. Header Field Registry .....................................77 | 9.2.2. Idempotent Methods . . . . . . . . . . . . . . . . . 85 | |||
| 8.3.1. Considerations for New Header Fields ...............78 | 9.2.3. Methods and Caching . . . . . . . . . . . . . . . . . 86 | |||
| 8.3.2. Registrations ......................................80 | 9.3. Method Definitions . . . . . . . . . . . . . . . . . . . 86 | |||
| 8.4. Content Coding Registry ...................................81 | 9.3.1. GET . . . . . . . . . . . . . . . . . . . . . . . . . 86 | |||
| 8.4.1. Procedure ..........................................81 | 9.3.2. HEAD . . . . . . . . . . . . . . . . . . . . . . . . 87 | |||
| 8.4.2. Registrations ......................................81 | 9.3.3. POST . . . . . . . . . . . . . . . . . . . . . . . . 88 | |||
| 9. Security Considerations ........................................81 | 9.3.4. PUT . . . . . . . . . . . . . . . . . . . . . . . . . 89 | |||
| 9.1. Attacks Based on File and Path Names ......................82 | 9.3.5. DELETE . . . . . . . . . . . . . . . . . . . . . . . 92 | |||
| 9.2. Attacks Based on Command, Code, or Query Injection ........82 | 9.3.6. CONNECT . . . . . . . . . . . . . . . . . . . . . . . 94 | |||
| 9.3. Disclosure of Personal Information ........................83 | 9.3.7. OPTIONS . . . . . . . . . . . . . . . . . . . . . . . 95 | |||
| 9.4. Disclosure of Sensitive Information in URIs ...............83 | 9.3.8. TRACE . . . . . . . . . . . . . . . . . . . . . . . . 96 | |||
| 9.5. Disclosure of Fragment after Redirects ....................84 | 10. Message Context . . . . . . . . . . . . . . . . . . . . . . . 97 | |||
| 9.6. Disclosure of Product Information .........................84 | 10.1. Request Context Fields . . . . . . . . . . . . . . . . . 97 | |||
| 9.7. Browser Fingerprinting ....................................84 | 10.1.1. Expect . . . . . . . . . . . . . . . . . . . . . . . 97 | |||
| 10. Acknowledgments ...............................................85 | 10.1.2. From . . . . . . . . . . . . . . . . . . . . . . . . 99 | |||
| 11. References ....................................................85 | 10.1.3. Referer . . . . . . . . . . . . . . . . . . . . . . 100 | |||
| 11.1. Normative References .....................................85 | 10.1.4. TE . . . . . . . . . . . . . . . . . . . . . . . . . 101 | |||
| 11.2. Informative References ...................................86 | 10.1.5. User-Agent . . . . . . . . . . . . . . . . . . . . . 102 | |||
| Appendix A. Differences between HTTP and MIME .....................89 | 10.2. Response Context Fields . . . . . . . . . . . . . . . . 103 | |||
| A.1. MIME-Version ..............................................89 | 10.2.1. Allow . . . . . . . . . . . . . . . . . . . . . . . 103 | |||
| A.2. Conversion to Canonical Form ..............................89 | 10.2.2. Location . . . . . . . . . . . . . . . . . . . . . . 104 | |||
| A.3. Conversion of Date Formats ................................90 | 10.2.3. Retry-After . . . . . . . . . . . . . . . . . . . . 105 | |||
| A.4. Conversion of Content-Encoding ..........................90 | 10.2.4. Server . . . . . . . . . . . . . . . . . . . . . . . 106 | |||
| A.5. Conversion of Content-Transfer-Encoding .................90 | 11. HTTP Authentication . . . . . . . . . . . . . . . . . . . . . 106 | |||
| A.6. MHTML and Line Length Limitations .........................90 | 11.1. Authentication Scheme . . . . . . . . . . . . . . . . . 106 | |||
| Appendix B. Changes from RFC 2616 .................................91 | 11.2. Authentication Parameters . . . . . . . . . . . . . . . 107 | |||
| Appendix C. Imported ABNF .........................................93 | 11.3. Challenge and Response . . . . . . . . . . . . . . . . . 107 | |||
| Appendix D. Collected ABNF ........................................94 | 11.4. Credentials . . . . . . . . . . . . . . . . . . . . . . 108 | |||
| Index .............................................................97 | 11.5. Establishing a Protection Space (Realm) . . . . . . . . 109 | |||
| 11.6. Authenticating Users to Origin Servers . . . . . . . . . 110 | ||||
| 11.6.1. WWW-Authenticate . . . . . . . . . . . . . . . . . . 110 | ||||
| 11.6.2. Authorization . . . . . . . . . . . . . . . . . . . 111 | ||||
| 11.6.3. Authentication-Info . . . . . . . . . . . . . . . . 111 | ||||
| 11.7. Authenticating Clients to Proxies . . . . . . . . . . . 112 | ||||
| 11.7.1. Proxy-Authenticate . . . . . . . . . . . . . . . . . 112 | ||||
| 11.7.2. Proxy-Authorization . . . . . . . . . . . . . . . . 112 | ||||
| 11.7.3. Proxy-Authentication-Info . . . . . . . . . . . . . 113 | ||||
| 12. Content Negotiation . . . . . . . . . . . . . . . . . . . . . 113 | ||||
| 12.1. Proactive Negotiation . . . . . . . . . . . . . . . . . 114 | ||||
| 12.2. Reactive Negotiation . . . . . . . . . . . . . . . . . . 115 | ||||
| 12.3. Request Content Negotiation . . . . . . . . . . . . . . 116 | ||||
| 12.4. Content Negotiation Field Features . . . . . . . . . . . 116 | ||||
| 12.4.1. Absence . . . . . . . . . . . . . . . . . . . . . . 116 | ||||
| 12.4.2. Quality Values . . . . . . . . . . . . . . . . . . . 117 | ||||
| 12.4.3. Wildcard Values . . . . . . . . . . . . . . . . . . 117 | ||||
| 12.5. Content Negotiation Fields . . . . . . . . . . . . . . . 118 | ||||
| 12.5.1. Accept . . . . . . . . . . . . . . . . . . . . . . . 118 | ||||
| 12.5.2. Accept-Charset . . . . . . . . . . . . . . . . . . . 120 | ||||
| 12.5.3. Accept-Encoding . . . . . . . . . . . . . . . . . . 121 | ||||
| 12.5.4. Accept-Language . . . . . . . . . . . . . . . . . . 123 | ||||
| 12.5.5. Vary . . . . . . . . . . . . . . . . . . . . . . . . 124 | ||||
| 13. Conditional Requests . . . . . . . . . . . . . . . . . . . . 125 | ||||
| 13.1. Preconditions . . . . . . . . . . . . . . . . . . . . . 125 | ||||
| 13.1.1. If-Match . . . . . . . . . . . . . . . . . . . . . . 126 | ||||
| 13.1.2. If-None-Match . . . . . . . . . . . . . . . . . . . 128 | ||||
| 13.1.3. If-Modified-Since . . . . . . . . . . . . . . . . . 130 | ||||
| 13.1.4. If-Unmodified-Since . . . . . . . . . . . . . . . . 132 | ||||
| 13.1.5. If-Range . . . . . . . . . . . . . . . . . . . . . . 133 | ||||
| 13.2. Evaluation of Preconditions . . . . . . . . . . . . . . 135 | ||||
| 13.2.1. When to Evaluate . . . . . . . . . . . . . . . . . . 135 | ||||
| 13.2.2. Precedence of Preconditions . . . . . . . . . . . . 136 | ||||
| 14. Range Requests . . . . . . . . . . . . . . . . . . . . . . . 137 | ||||
| 14.1. Range Units . . . . . . . . . . . . . . . . . . . . . . 138 | ||||
| 14.1.1. Range Specifiers . . . . . . . . . . . . . . . . . . 138 | ||||
| 14.1.2. Byte Ranges . . . . . . . . . . . . . . . . . . . . 139 | ||||
| 14.2. Range . . . . . . . . . . . . . . . . . . . . . . . . . 141 | ||||
| 14.3. Accept-Ranges . . . . . . . . . . . . . . . . . . . . . 142 | ||||
| 14.4. Content-Range . . . . . . . . . . . . . . . . . . . . . 143 | ||||
| 14.5. Partial PUT . . . . . . . . . . . . . . . . . . . . . . 145 | ||||
| 14.6. Media Type multipart/byteranges . . . . . . . . . . . . 146 | ||||
| 15. Status Codes . . . . . . . . . . . . . . . . . . . . . . . . 148 | ||||
| 15.1. Overview of Status Codes . . . . . . . . . . . . . . . . 149 | ||||
| 15.2. Informational 1xx . . . . . . . . . . . . . . . . . . . 149 | ||||
| 15.2.1. 100 Continue . . . . . . . . . . . . . . . . . . . . 150 | ||||
| 15.2.2. 101 Switching Protocols . . . . . . . . . . . . . . 150 | ||||
| 15.3. Successful 2xx . . . . . . . . . . . . . . . . . . . . . 150 | ||||
| 15.3.1. 200 OK . . . . . . . . . . . . . . . . . . . . . . . 150 | ||||
| 15.3.2. 201 Created . . . . . . . . . . . . . . . . . . . . 152 | ||||
| 15.3.3. 202 Accepted . . . . . . . . . . . . . . . . . . . . 152 | ||||
| 15.3.4. 203 Non-Authoritative Information . . . . . . . . . 152 | ||||
| 15.3.5. 204 No Content . . . . . . . . . . . . . . . . . . . 153 | ||||
| 15.3.6. 205 Reset Content . . . . . . . . . . . . . . . . . 153 | ||||
| 15.3.7. 206 Partial Content . . . . . . . . . . . . . . . . 154 | ||||
| 15.3.7.1. Single Part . . . . . . . . . . . . . . . . . . 155 | ||||
| 15.3.7.2. Multiple Parts . . . . . . . . . . . . . . . . . 155 | ||||
| 15.3.7.3. Combining Parts . . . . . . . . . . . . . . . . 157 | ||||
| 15.4. Redirection 3xx . . . . . . . . . . . . . . . . . . . . 157 | ||||
| 15.4.1. 300 Multiple Choices . . . . . . . . . . . . . . . . 159 | ||||
| 15.4.2. 301 Moved Permanently . . . . . . . . . . . . . . . 160 | ||||
| 15.4.3. 302 Found . . . . . . . . . . . . . . . . . . . . . 161 | ||||
| 15.4.4. 303 See Other . . . . . . . . . . . . . . . . . . . 161 | ||||
| 15.4.5. 304 Not Modified . . . . . . . . . . . . . . . . . . 162 | ||||
| 15.4.6. 305 Use Proxy . . . . . . . . . . . . . . . . . . . 163 | ||||
| 15.4.7. 306 (Unused) . . . . . . . . . . . . . . . . . . . . 163 | ||||
| 15.4.8. 307 Temporary Redirect . . . . . . . . . . . . . . . 163 | ||||
| 15.4.9. 308 Permanent Redirect . . . . . . . . . . . . . . . 163 | ||||
| 15.5. Client Error 4xx . . . . . . . . . . . . . . . . . . . . 164 | ||||
| 15.5.1. 400 Bad Request . . . . . . . . . . . . . . . . . . 164 | ||||
| 15.5.2. 401 Unauthorized . . . . . . . . . . . . . . . . . . 164 | ||||
| 15.5.3. 402 Payment Required . . . . . . . . . . . . . . . . 164 | ||||
| 15.5.4. 403 Forbidden . . . . . . . . . . . . . . . . . . . 164 | ||||
| 15.5.5. 404 Not Found . . . . . . . . . . . . . . . . . . . 165 | ||||
| 15.5.6. 405 Method Not Allowed . . . . . . . . . . . . . . . 165 | ||||
| 15.5.7. 406 Not Acceptable . . . . . . . . . . . . . . . . . 165 | ||||
| 15.5.8. 407 Proxy Authentication Required . . . . . . . . . 166 | ||||
| 15.5.9. 408 Request Timeout . . . . . . . . . . . . . . . . 166 | ||||
| 15.5.10. 409 Conflict . . . . . . . . . . . . . . . . . . . . 166 | ||||
| 15.5.11. 410 Gone . . . . . . . . . . . . . . . . . . . . . . 167 | ||||
| 15.5.12. 411 Length Required . . . . . . . . . . . . . . . . 167 | ||||
| 15.5.13. 412 Precondition Failed . . . . . . . . . . . . . . 167 | ||||
| 15.5.14. 413 Content Too Large . . . . . . . . . . . . . . . 167 | ||||
| 15.5.15. 414 URI Too Long . . . . . . . . . . . . . . . . . . 168 | ||||
| 15.5.16. 415 Unsupported Media Type . . . . . . . . . . . . . 168 | ||||
| 15.5.17. 416 Range Not Satisfiable . . . . . . . . . . . . . 168 | ||||
| 15.5.18. 417 Expectation Failed . . . . . . . . . . . . . . . 169 | ||||
| 15.5.19. 418 (Unused) . . . . . . . . . . . . . . . . . . . . 169 | ||||
| 15.5.20. 421 Misdirected Request . . . . . . . . . . . . . . 170 | ||||
| 15.5.21. 422 Unprocessable Content . . . . . . . . . . . . . 170 | ||||
| 15.5.22. 426 Upgrade Required . . . . . . . . . . . . . . . . 170 | ||||
| 15.6. Server Error 5xx . . . . . . . . . . . . . . . . . . . . 171 | ||||
| 15.6.1. 500 Internal Server Error . . . . . . . . . . . . . 171 | ||||
| 15.6.2. 501 Not Implemented . . . . . . . . . . . . . . . . 171 | ||||
| 15.6.3. 502 Bad Gateway . . . . . . . . . . . . . . . . . . 171 | ||||
| 15.6.4. 503 Service Unavailable . . . . . . . . . . . . . . 171 | ||||
| 15.6.5. 504 Gateway Timeout . . . . . . . . . . . . . . . . 172 | ||||
| 15.6.6. 505 HTTP Version Not Supported . . . . . . . . . . . 172 | ||||
| 16. Extending HTTP . . . . . . . . . . . . . . . . . . . . . . . 172 | ||||
| 16.1. Method Extensibility . . . . . . . . . . . . . . . . . . 173 | ||||
| 16.1.1. Method Registry . . . . . . . . . . . . . . . . . . 173 | ||||
| 16.1.2. Considerations for New Methods . . . . . . . . . . . 173 | ||||
| 16.2. Status Code Extensibility . . . . . . . . . . . . . . . 174 | ||||
| 16.2.1. Status Code Registry . . . . . . . . . . . . . . . . 174 | ||||
| 16.2.2. Considerations for New Status Codes . . . . . . . . 174 | ||||
| 16.3. Field Extensibility . . . . . . . . . . . . . . . . . . 175 | ||||
| 16.3.1. Field Name Registry . . . . . . . . . . . . . . . . 176 | ||||
| 16.3.2. Considerations for New Fields . . . . . . . . . . . 177 | ||||
| 16.3.2.1. Considerations for New Field Names . . . . . . . 178 | ||||
| 16.3.2.2. Considerations for New Field Values . . . . . . 179 | ||||
| 16.4. Authentication Scheme Extensibility . . . . . . . . . . 180 | ||||
| 16.4.1. Authentication Scheme Registry . . . . . . . . . . . 180 | ||||
| 16.4.2. Considerations for New Authentication Schemes . . . 180 | ||||
| 16.5. Range Unit Extensibility . . . . . . . . . . . . . . . . 181 | ||||
| 16.5.1. Range Unit Registry . . . . . . . . . . . . . . . . 182 | ||||
| 16.5.2. Considerations for New Range Units . . . . . . . . . 182 | ||||
| 16.6. Content Coding Extensibility . . . . . . . . . . . . . . 182 | ||||
| 16.6.1. Content Coding Registry . . . . . . . . . . . . . . 182 | ||||
| 16.6.2. Considerations for New Content Codings . . . . . . . 183 | ||||
| 16.7. Upgrade Token Registry . . . . . . . . . . . . . . . . . 183 | ||||
| 17. Security Considerations . . . . . . . . . . . . . . . . . . . 184 | ||||
| 17.1. Establishing Authority . . . . . . . . . . . . . . . . . 184 | ||||
| 17.2. Risks of Intermediaries . . . . . . . . . . . . . . . . 185 | ||||
| 17.3. Attacks Based on File and Path Names . . . . . . . . . . 186 | ||||
| 17.4. Attacks Based on Command, Code, or Query Injection . . . 186 | ||||
| 17.5. Attacks via Protocol Element Length . . . . . . . . . . 187 | ||||
| 17.6. Attacks using Shared-dictionary Compression . . . . . . 187 | ||||
| 17.7. Disclosure of Personal Information . . . . . . . . . . . 188 | ||||
| 17.8. Privacy of Server Log Information . . . . . . . . . . . 188 | ||||
| 17.9. Disclosure of Sensitive Information in URIs . . . . . . 189 | ||||
| 17.10. Application Handling of Field Names . . . . . . . . . . 189 | ||||
| 17.11. Disclosure of Fragment after Redirects . . . . . . . . . 190 | ||||
| 17.12. Disclosure of Product Information . . . . . . . . . . . 191 | ||||
| 17.13. Browser Fingerprinting . . . . . . . . . . . . . . . . . 191 | ||||
| 17.14. Validator Retention . . . . . . . . . . . . . . . . . . 192 | ||||
| 17.15. Denial-of-Service Attacks Using Range . . . . . . . . . 192 | ||||
| 17.16. Authentication Considerations . . . . . . . . . . . . . 193 | ||||
| 17.16.1. Confidentiality of Credentials . . . . . . . . . . 193 | ||||
| 17.16.2. Credentials and Idle Clients . . . . . . . . . . . 193 | ||||
| 17.16.3. Protection Spaces . . . . . . . . . . . . . . . . . 194 | ||||
| 17.16.4. Additional Response Fields . . . . . . . . . . . . 194 | ||||
| 18. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 194 | ||||
| 18.1. URI Scheme Registration . . . . . . . . . . . . . . . . 195 | ||||
| 18.2. Method Registration . . . . . . . . . . . . . . . . . . 195 | ||||
| 18.3. Status Code Registration . . . . . . . . . . . . . . . . 195 | ||||
| 18.4. Field Name Registration . . . . . . . . . . . . . . . . 198 | ||||
| 18.5. Authentication Scheme Registration . . . . . . . . . . . 200 | ||||
| 18.6. Content Coding Registration . . . . . . . . . . . . . . 201 | ||||
| 18.7. Range Unit Registration . . . . . . . . . . . . . . . . 201 | ||||
| 18.8. Media Type Registration . . . . . . . . . . . . . . . . 202 | ||||
| 18.9. Port Registration . . . . . . . . . . . . . . . . . . . 202 | ||||
| 18.10. Upgrade Token Registration . . . . . . . . . . . . . . . 202 | ||||
| 19. References . . . . . . . . . . . . . . . . . . . . . . . . . 202 | ||||
| 19.1. Normative References . . . . . . . . . . . . . . . . . . 202 | ||||
| 19.2. Informative References . . . . . . . . . . . . . . . . . 204 | ||||
| Appendix A. Collected ABNF . . . . . . . . . . . . . . . . . . . 211 | ||||
| Appendix B. Changes from previous RFCs . . . . . . . . . . . . . 215 | ||||
| B.1. Changes from RFC 2818 . . . . . . . . . . . . . . . . . . 215 | ||||
| B.2. Changes from RFC 7230 . . . . . . . . . . . . . . . . . . 215 | ||||
| B.3. Changes from RFC 7231 . . . . . . . . . . . . . . . . . . 216 | ||||
| B.4. Changes from RFC 7232 . . . . . . . . . . . . . . . . . . 218 | ||||
| B.5. Changes from RFC 7233 . . . . . . . . . . . . . . . . . . 219 | ||||
| B.6. Changes from RFC 7235 . . . . . . . . . . . . . . . . . . 219 | ||||
| B.7. Changes from RFC 7538 . . . . . . . . . . . . . . . . . . 219 | ||||
| B.8. Changes from RFC 7615 . . . . . . . . . . . . . . . . . . 219 | ||||
| B.9. Changes from RFC 7694 . . . . . . . . . . . . . . . . . . 219 | ||||
| Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 219 | ||||
| C.1. Between RFC723x and draft 00 . . . . . . . . . . . . . . 219 | ||||
| C.2. Since draft-ietf-httpbis-semantics-00 . . . . . . . . . . 220 | ||||
| C.3. Since draft-ietf-httpbis-semantics-01 . . . . . . . . . . 220 | ||||
| C.4. Since draft-ietf-httpbis-semantics-02 . . . . . . . . . . 222 | ||||
| C.5. Since draft-ietf-httpbis-semantics-03 . . . . . . . . . . 223 | ||||
| C.6. Since draft-ietf-httpbis-semantics-04 . . . . . . . . . . 223 | ||||
| C.7. Since draft-ietf-httpbis-semantics-05 . . . . . . . . . . 224 | ||||
| C.8. Since draft-ietf-httpbis-semantics-06 . . . . . . . . . . 225 | ||||
| C.9. Since draft-ietf-httpbis-semantics-07 . . . . . . . . . . 227 | ||||
| C.10. Since draft-ietf-httpbis-semantics-08 . . . . . . . . . . 228 | ||||
| C.11. Since draft-ietf-httpbis-semantics-09 . . . . . . . . . . 229 | ||||
| C.12. Since draft-ietf-httpbis-semantics-10 . . . . . . . . . . 229 | ||||
| C.13. Since draft-ietf-httpbis-semantics-11 . . . . . . . . . . 231 | ||||
| C.14. Since draft-ietf-httpbis-semantics-12 . . . . . . . . . . 231 | ||||
| C.15. Since draft-ietf-httpbis-semantics-13 . . . . . . . . . . 233 | ||||
| C.16. Since draft-ietf-httpbis-semantics-14 . . . . . . . . . . 234 | ||||
| C.17. Since draft-ietf-httpbis-semantics-15 . . . . . . . . . . 236 | ||||
| C.18. Since draft-ietf-httpbis-semantics-16 . . . . . . . . . . 237 | ||||
| C.19. Since draft-ietf-httpbis-semantics-17 . . . . . . . . . . 237 | ||||
| Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 239 | ||||
| Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 251 | ||||
| 1. Introduction | 1. Introduction | |||
| 1.1. Purpose | 1.1. Purpose | |||
| [new] | The Hypertext Transfer Protocol (HTTP) is a family of stateless, | |||
| application-level, request/response protocols that share a generic | ||||
| interface, extensible semantics, and self-descriptive messages to | ||||
| enable flexible interaction with network-based hypertext information | ||||
| systems. | ||||
| HTTP is a generic interface protocol for information systems. It is | HTTP hides the details of how a service is implemented by presenting | |||
| designed | ||||
| to hide the details of how a service is implemented by presenting | ||||
| a uniform interface to clients that is independent of the types of | a uniform interface to clients that is independent of the types of | |||
| resources provided. Likewise, servers do not need to be aware of | resources provided. Likewise, servers do not need to be aware of | |||
| each client's purpose: an HTTP request can be considered in isolation | each client's purpose: a request can be considered in isolation | |||
| rather than being associated with a specific type of client or a | rather than being associated with a specific type of client or a | |||
| predetermined sequence of application steps. | predetermined sequence of application steps. This allows general- | |||
| The result is a protocol that can be used effectively in many different | purpose implementations to be used effectively in many different | |||
| contexts and for which implementations can evolve independently over time. | contexts, reduces interaction complexity, and enables independent | |||
| evolution over time. | ||||
| HTTP is also designed for use as an intermediation protocol for | HTTP is also designed for use as an intermediation protocol, wherein | |||
| translating communication to and from non-HTTP information systems. | proxies and gateways can translate non-HTTP information systems into | |||
| HTTP proxies and gateways can provide access to alternative | a more generic interface. | |||
| information services by translating their diverse protocols into a | ||||
| hypertext format that can be viewed and manipulated by clients in the | ||||
| same way as HTTP services. | ||||
| One consequence of this flexibility is that the protocol cannot be | One consequence of this flexibility is that the protocol cannot be | |||
| defined in terms of what occurs behind the interface. Instead, we | defined in terms of what occurs behind the interface. Instead, we | |||
| are limited to defining the syntax of communication, the intent of | are limited to defining the syntax of communication, the intent of | |||
| received communication, and the expected behavior of recipients. If | received communication, and the expected behavior of recipients. If | |||
| the communication is considered in isolation, then successful actions | the communication is considered in isolation, then successful actions | |||
| ought to be reflected in corresponding changes to the observable | ought to be reflected in corresponding changes to the observable | |||
| 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. History and Evolution | 1.2. History and Evolution | |||
| HTTP has been in use since 1990. The first version, later referred | HTTP has been the primary information transfer protocol for the World | |||
| to as HTTP/0.9, was a simple protocol for hypertext data transfer | Wide Web since its introduction in 1990. It began as a trivial | |||
| across the Internet, using only a single request method (GET) and no | mechanism for low-latency requests, with a single method (GET) to | |||
| metadata. | request transfer of a presumed hypertext document identified by a | |||
| given pathname. 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. These protocols were eventually defined as HTTP/0.9 | ||||
| and HTTP/1.0 (see [HTTP/1.0]). | ||||
| HTTP/1.0, as defined by [RFC1945], added a range of | HTTP/1.1 was designed to refine the protocol's features while | |||
| request methods and MIME-like messaging, allowing for metadata to be | retaining compatibility with the existing text-based messaging | |||
| transferred and modifiers placed on the request/response semantics. | syntax, improving its interoperability, scalability, and robustness | |||
| However, HTTP/1.0 did not sufficiently take into consideration the | across the Internet. This included length-based data delimiters for | |||
| effects of hierarchical proxies, caching, the need for persistent | both fixed and dynamic (chunked) content, a consistent framework for | |||
| connections, or name-based virtual hosts. The proliferation of | content negotiation, opaque validators for conditional requests, | |||
| incompletely implemented applications calling themselves "HTTP/1.0" | cache controls for better cache consistency, range requests for | |||
| further necessitated a protocol version change in order for two | partial updates, and default persistent connections. HTTP/1.1 was | |||
| communicating applications to determine each other's true | introduced in 1995 and published on the standards track in 1997 | |||
| capabilities. | [RFC2068], revised in 1999 [RFC2616], and revised again in 2014 | |||
| ([RFC7230] - [RFC7235]). | ||||
| [new] | HTTP/2 ([HTTP/2]) introduced a multiplexed session layer on top of | |||
| the existing TLS and TCP protocols for exchanging concurrent HTTP | ||||
| messages with efficient field compression and server push. HTTP/3 | ||||
| ([HTTP/3]) provides greater independence for concurrent messages by | ||||
| using QUIC as a secure multiplexed transport over UDP instead of TCP. | ||||
| [new] | All three major versions of HTTP rely on the semantics defined by | |||
| this document. They have not obsoleted each other because each one | ||||
| has specific benefits and limitations depending on the context of | ||||
| use. Implementations are expected to choose the most appropriate | ||||
| transport and messaging syntax for their particular context. | ||||
| [new] | This revision of HTTP separates the definition of semantics (this | |||
| document) and caching ([CACHING]) from the current HTTP/1.1 messaging | ||||
| syntax ([HTTP/1.1]) to allow each major protocol version to progress | ||||
| independently while referring to the same core semantics. | ||||
| 1.3. Semantics | 1.3. Core Semantics | |||
| HTTP provides a uniform interface for interacting with a resource | HTTP provides a uniform interface for interacting with a resource | |||
| (Section 2), regardless of its type, nature, or implementation, via | (Section 3.1) - regardless of its type, nature, or implementation - | |||
| the manipulation and transfer of representations (Section 3). | by sending messages that manipulate or transfer representations | |||
| (Section 3.2). | ||||
| Each Hypertext Transfer Protocol (HTTP) message is either a request | Each message is either a request or a response. A client constructs | |||
| or a response. A server listens on a connection for a request, | request messages that communicate its intentions and routes those | |||
| parses each message received, interprets the message semantics in | messages toward an identified origin server. A server listens for | |||
| relation to the identified request target, and responds to that | requests, parses each message received, interprets the message | |||
| request with one or more response messages. A client constructs | semantics in relation to the identified target resource, and responds | |||
| request messages to communicate specific intentions, examines | to that request with one or more response messages. The client | |||
| received responses to see if the intentions were carried out, and | examines received responses to see if its intentions were carried | |||
| determines how to interpret the results. This document defines | out, determining what to do next based on the status codes and | |||
| HTTP/1.1 request and response semantics in terms of the architecture | content received. | |||
| defined in [RFC7230]. | ||||
| HTTP semantics include the intentions defined by each request method | HTTP semantics include the intentions defined by each request method | |||
| (Section 4), extensions to those semantics that might be described in | (Section 9), extensions to those semantics that might be described in | |||
| request header fields (Section 5), the meaning of status codes to | request header fields, status codes that describe the response | |||
| indicate a machine-readable response (Section 6), and the meaning of | (Section 15), and other control data and resource metadata that might | |||
| other control data and resource metadata that might be given in | be given in response fields. | |||
| response header fields (Section 7). | ||||
| This document also defines representation metadata that describe how | Semantics also include representation metadata that describe how | |||
| a payload is intended to be interpreted by a recipient, the request | content is intended to be interpreted by a recipient, request header | |||
| 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 3.4). | negotiation_ (Section 12). | |||
| This document defines HTTP/1.1 range requests, partial responses, and | 1.4. Specifications Obsoleted by this Document | |||
| the multipart/byteranges media type. | ||||
| This document obsoletes the following specifications: | ||||
| +============================================+===========+=========+ | ||||
| | Title | Reference | Changes | | ||||
| +============================================+===========+=========+ | ||||
| | HTTP Over TLS | [RFC2818] | B.1 | | ||||
| +--------------------------------------------+-----------+---------+ | ||||
| | HTTP/1.1 Message Syntax and Routing [*] | [RFC7230] | B.2 | | ||||
| +--------------------------------------------+-----------+---------+ | ||||
| | HTTP/1.1 Semantics and Content | [RFC7231] | B.3 | | ||||
| +--------------------------------------------+-----------+---------+ | ||||
| | HTTP/1.1 Conditional Requests | [RFC7232] | B.4 | | ||||
| +--------------------------------------------+-----------+---------+ | ||||
| | HTTP/1.1 Range Requests | [RFC7233] | B.5 | | ||||
| +--------------------------------------------+-----------+---------+ | ||||
| | HTTP/1.1 Authentication | [RFC7235] | B.6 | | ||||
| +--------------------------------------------+-----------+---------+ | ||||
| | HTTP Status Code 308 (Permanent Redirect) | [RFC7538] | B.7 | | ||||
| +--------------------------------------------+-----------+---------+ | ||||
| | HTTP Authentication-Info and Proxy- | [RFC7615] | B.8 | | ||||
| | Authentication-Info Response Header Fields | | | | ||||
| +--------------------------------------------+-----------+---------+ | ||||
| | HTTP Client-Initiated Content-Encoding | [RFC7694] | B.9 | | ||||
| +--------------------------------------------+-----------+---------+ | ||||
| Table 1 | ||||
| [*] This document only obsoletes the portions of RFC 7230 that are | ||||
| independent of the HTTP/1.1 messaging syntax and connection | ||||
| management; the remaining bits of RFC 7230 are obsoleted by | ||||
| "HTTP/1.1" [HTTP/1.1]. | ||||
| 2. Conformance | 2. Conformance | |||
| 2.1. 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] with a list extension, defined in Section 7 of | notation of [RFC5234], extended with the notation for case- | |||
| [RFC7230], that allows for compact definition of comma-separated | sensitivity in strings defined in [RFC7405]. | |||
| lists using a '#' operator (similar to how the '*' operator indicates | ||||
| repetition). Appendix C describes rules imported from other | It also uses a list extension, defined in Section 5.6.1, that allows | |||
| documents. Appendix D shows the collected grammar with all list | for compact definition of comma-separated lists using a "#" operator | |||
| operators expanded to standard ABNF notation. | (similar to how the "*" operator indicates repetition). Appendix A | |||
| shows the collected grammar with all list operators expanded to | ||||
| 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.6 defines some generic syntactic components for field | ||||
| values. | ||||
| 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]. | |||
| 2.2. Requirements Notation | 2.2. Requirements Notation | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| document are to be interpreted as described in [RFC2119]. | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
| 14 [RFC2119] [RFC8174] when, and only when, they appear in all | ||||
| Conformance criteria and considerations regarding error handling are | capitals, as shown here. | |||
| defined in Section 2.5 of [RFC7230]. | ||||
| This specification targets conformance criteria according to the role | This specification targets conformance criteria according to the role | |||
| of a participant in HTTP communication. Hence, HTTP requirements are | of a participant in HTTP communication. Hence, requirements are | |||
| placed on senders, recipients, clients, servers, user agents, | placed on senders, recipients, clients, servers, user agents, | |||
| intermediaries, origin servers, proxies, gateways, or caches, | intermediaries, origin servers, proxies, gateways, or caches, | |||
| depending on what behavior is being constrained by the requirement. | depending on what behavior is being constrained by the requirement. | |||
| Additional requirements are placed on implementations, resource | ||||
| Additional (social) requirements are placed on implementations, | owners, and protocol element registrations when they apply beyond the | |||
| resource owners, and protocol element registrations when they apply | scope of a single communication. | |||
| beyond the scope of a single communication. | ||||
| The verb "generate" is used instead of "send" where a requirement | The verb "generate" is used instead of "send" where a requirement | |||
| differentiates between creating a protocol element and merely | applies only to implementations that create the protocol element, | |||
| forwarding a received element downstream. | rather than an implementation that forwards a received element | |||
| downstream. | ||||
| An implementation is considered conformant if it complies with all of | An implementation is considered conformant if it complies with all of | |||
| the requirements associated with the roles it partakes in HTTP. | the requirements associated with the roles it partakes in HTTP. | |||
| A sender MUST NOT generate protocol elements that do not match the | A sender MUST NOT generate protocol elements that do not match the | |||
| grammar defined by the corresponding ABNF rules. Within a given | grammar defined by the corresponding ABNF rules. Within a given | |||
| message, a sender MUST NOT generate protocol elements or syntax | message, a sender MUST NOT generate protocol elements or syntax | |||
| alternatives that are only allowed to be generated by participants in | 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 | other roles (i.e., a role that the sender does not have for that | |||
| message). | message). | |||
| Conformance includes both the syntax and semantics of protocol | Conformance to HTTP includes both conformance to the particular | |||
| elements. A sender MUST NOT generate protocol elements that convey a | messaging syntax of the protocol version in use and conformance to | |||
| meaning that is known by that sender to be false. | the semantics of protocol elements sent. For example, a client that | |||
| claims conformance to HTTP/1.1 but fails to recognize the features | ||||
| required of HTTP/1.1 recipients will fail to interoperate with | ||||
| servers that adjust their responses in accordance with those claims. | ||||
| Features that reflect user choices, such as content negotiation and | ||||
| user-selected extensions, can impact application behavior beyond the | ||||
| protocol stream; sending protocol elements that inaccurately reflect | ||||
| a user's choices will confuse the user and inhibit choice. | ||||
| When an implementation fails semantic conformance, recipients of that | ||||
| implementation's messages will eventually develop workarounds to | ||||
| adjust their behavior accordingly. A recipient MAY employ such | ||||
| workarounds while remaining conformant to this protocol if the | ||||
| workarounds are limited to the implementations at fault. For | ||||
| example, servers often scan portions of the User-Agent field value, | ||||
| and user agents often scan the Server field value, to adjust their | ||||
| own behavior with respect to known bugs or poorly chosen defaults. | ||||
| 2.3. Length Requirements | 2.3. Length Requirements | |||
| When a received protocol element is parsed, the recipient MUST be | A recipient SHOULD parse a received protocol element defensively, | |||
| able to parse any value of reasonable length that is applicable to | with only marginal expectations that the element will conform to its | |||
| the recipient's role and that matches the grammar defined by the | ABNF grammar and fit within a reasonable buffer size. | |||
| corresponding ABNF rules. | ||||
| HTTP does not have specific length limitations for many of its | HTTP does not have specific length limitations for many of its | |||
| protocol elements because the lengths that might be appropriate will | protocol elements because the lengths that might be appropriate will | |||
| vary widely, depending on the deployment context and purpose of the | vary widely, depending on the deployment context and purpose of the | |||
| implementation. Hence, interoperability between senders and | implementation. Hence, interoperability between senders and | |||
| recipients depends on shared expectations regarding what is a | recipients depends on shared expectations regarding what is a | |||
| reasonable length for each protocol element. Furthermore, what is | reasonable length for each protocol element. Furthermore, what is | |||
| commonly understood to be a reasonable length for some protocol | commonly understood to be a reasonable length for some protocol | |||
| elements has changed over the course of the past two decades of HTTP | elements has changed over the course of the past two decades of HTTP | |||
| use and is expected to continue changing in the future. | use and is expected to continue changing in the future. | |||
| At a minimum, a recipient MUST be able to parse and process protocol | 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 | element lengths that are at least as long as the values that it | |||
| generates for those same protocol elements in other messages. For | generates for those same protocol elements in other messages. For | |||
| example, an origin server that publishes very long URI references to | example, an origin server that publishes very long URI references to | |||
| its own resources needs to be able to parse and process those same | its own resources needs to be able to parse and process those same | |||
| references when received as a request target. | references when received as a target URI. | |||
| Note, however, that some received protocol elements might not be parsed. For | Many received protocol elements are only parsed to the extent | |||
| example, an intermediary forwarding a message might parse a header-field | necessary to identify and forward that element downstream. For | |||
| into generic field-name and field-value components, but then forward the | example, an intermediary might parse a received field into its field | |||
| header field without further parsing inside the field-value. | name and field value components, but then forward the field without | |||
| further parsing inside the field value. | ||||
| 2.4. Error Handling | 2.4. Error Handling | |||
| A recipient MUST interpret a received protocol element according to | A recipient MUST interpret a received protocol element according to | |||
| the semantics defined for it by this specification, including | the semantics defined for it by this specification, including | |||
| extensions to this specification, unless the recipient has determined | extensions to this specification, unless the recipient has determined | |||
| (through experience or configuration) that the sender incorrectly | (through experience or configuration) that the sender incorrectly | |||
| implements what is implied by those semantics. For example, an | implements what is implied by those semantics. For example, an | |||
| origin server might disregard the contents of a received | origin server might disregard the contents of a received | |||
| Accept-Encoding header field if inspection of the User-Agent header | Accept-Encoding header field if inspection of the User-Agent header | |||
| skipping to change at line 424 ¶ | skipping to change at page 15, line 27 ¶ | |||
| Unless noted otherwise, a recipient MAY attempt to recover a usable | Unless noted otherwise, a recipient MAY attempt to recover a usable | |||
| protocol element from an invalid construct. HTTP does not define | protocol element from an invalid construct. HTTP does not define | |||
| specific error handling mechanisms except when they have a direct | specific error handling mechanisms except when they have a direct | |||
| impact on security, since different applications of the protocol | impact on security, since different applications of the protocol | |||
| require different error handling strategies. For example, a Web | require different error handling strategies. For example, a Web | |||
| browser might wish to transparently recover from a response where the | browser might wish to transparently recover from a response where the | |||
| Location header field doesn't parse according to the ABNF, whereas a | Location header field doesn't parse according to the ABNF, whereas a | |||
| systems control client might consider any form of error recovery to | systems control client might consider any form of error recovery to | |||
| be dangerous. | be dangerous. | |||
| [new] | Some requests can be automatically retried by a client in the event | |||
| of an underlying connection failure, as described in Section 9.2.2. | ||||
| 2.5. Protocol Version | 2.5. Protocol Version | |||
| The HTTP version number consists of two decimal digits separated by a | HTTP's version number consists of two decimal digits separated by a | |||
| "." (period or decimal point). The first digit ("major version") | "." (period or decimal point). The first digit ("major version") | |||
| indicates the HTTP messaging syntax, whereas the second digit ("minor | indicates the messaging syntax, whereas the second digit ("minor | |||
| version") indicates the highest minor version within that major | version") indicates the highest minor version within that major | |||
| version to which the sender is conformant and able to understand for | version to which the sender is conformant (able to understand for | |||
| future communication. | future communication). | |||
| [new] | 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 16). | ||||
| The protocol version as a whole indicates the sender's conformance with | The protocol version as a whole indicates the sender's conformance | |||
| 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. | specification of HTTP. For example, the version "HTTP/1.1" is | |||
| defined by the combined specifications of this document, "HTTP | ||||
| Caching" [CACHING], and "HTTP/1.1" [HTTP/1.1]. | ||||
| The intention of HTTP's versioning design is that the major number | HTTP's major version number is incremented when an incompatible | |||
| will only be incremented if an incompatible message syntax is | message syntax is introduced. The minor number is incremented when | |||
| introduced, and that the minor number will only be incremented when | ||||
| changes made to the protocol have the effect of adding to the message | changes made to the protocol have the effect of adding to the message | |||
| semantics or implying additional capabilities of the sender. | semantics or implying additional capabilities of the sender. | |||
| However, the minor version was not incremented for the changes | ||||
| introduced between [RFC2068] and [RFC2616], and this revision has | ||||
| specifically avoided any such changes to the protocol. | ||||
| 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). | |||
| [new] | When a major version of HTTP does not define any minor versions, the | |||
| minor version "0" is implied. The "0" is used when referring to that | ||||
| protocol within elements that require a minor version identifier. | ||||
| 3. Architecture | 3. Terminology and Core Concepts | |||
| 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 used to define HTTP. | |||
| 3.1. Resources | 3.1. Resources | |||
| The target of an HTTP request is called a "resource". HTTP does not | 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 | limit the nature of a resource; it merely defines an interface that | |||
| might be used to interact with resources. Each resource is | might be used to interact with resources. Most resources are | |||
| identified by a Uniform Resource Identifier (URI), as described in | identified by a Uniform Resource Identifier (URI), as described in | |||
| Section 2.7 of [RFC7230]. | Section 4. | |||
| One design goal of HTTP is to separate resource identification from | One design goal of HTTP is to separate resource identification from | |||
| request semantics, which is made possible by vesting the request | request semantics, which is made possible by vesting the request | |||
| semantics in the request method (Section 4) and a few | semantics in the request method (Section 9) and a few request- | |||
| request-modifying header fields (Section 5). If there is a conflict | modifying header fields. A resource cannot treat a request in a | |||
| between the method semantics and any semantic implied by the URI | manner inconsistent with the semantics of the method of the request. | |||
| itself, as described in Section 4.2.1, the method semantics take | For example, though the URI of a resource might imply semantics that | |||
| precedence. | are not safe, a client can expect the resource to avoid actions that | |||
| are unsafe when processing a request with a safe method (see | ||||
| Section 9.2.1). | ||||
| HTTP relies upon the Uniform Resource Identifier (URI) standard | HTTP relies upon the Uniform Resource Identifier (URI) standard [URI] | |||
| [RFC3986] to indicate the target resource (Section 5.1) and | to indicate the target resource (Section 7.1) and relationships | |||
| relationships between resources. | between resources. | |||
| 3.2. Representations | 3.2. Representations | |||
| For the purposes of HTTP, a "representation" is information that is | A _representation_ is information that is intended to reflect a past, | |||
| intended to reflect a past, current, or desired state of a given | current, or desired state of a given resource, in a format that can | |||
| resource, in a format that can be readily communicated via the | be readily communicated via the protocol. A representation consists | |||
| protocol, and that consists of a set of representation metadata and a | of a set of representation metadata and a potentially unbounded | |||
| potentially unbounded stream of representation data. | stream of representation data (Section 8). | |||
| [new] | HTTP allows "information hiding" behind its uniform interface by | |||
| defining 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. | ||||
| An origin server might be provided with, or be capable of generating, | A target resource might be provided with, or be capable of | |||
| multiple representations that are each intended to reflect the | generating, multiple representations that are each intended to | |||
| current state of a target resource. In such cases, some algorithm is | reflect the resource's current state. An algorithm, usually based on | |||
| used by the origin server to select one of those representations as | content negotiation (Section 12), would be used to select one of | |||
| most applicable to a given request, usually based on content | those representations as being most applicable to a given request. | |||
| negotiation. This "selected representation" is used to provide the | This _selected representation_ provides the data and metadata for | |||
| data and metadata for evaluating conditional requests [RFC7232] and | evaluating conditional requests (Section 13) and constructing the | |||
| constructing the payload for 200 (OK) and 304 (Not Modified) | content for 200 (OK), 206 (Partial Content), and 304 (Not Modified) | |||
| responses to GET (Section 4.3.1). | responses to GET (Section 9.3.1). | |||
| 3.3. Connections | 3.3. Connections, Clients and Servers | |||
| HTTP is a stateless request/response protocol that operates by | HTTP is a client/server protocol that operates over a reliable | |||
| exchanging messages (Section 3) across a reliable transport- or | transport- or session-layer _connection_. | |||
| session-layer "connection" (Section 6). | ||||
| An HTTP "client" is a program that establishes a connection to a | 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 for the purpose of sending one or more HTTP requests. An HTTP | |||
| "server" is a program that accepts connections in order to service | _server_ is a program that accepts connections in order to service | |||
| HTTP requests by sending HTTP responses. | HTTP requests by sending HTTP responses. | |||
| The terms "client" and "server" refer only to the roles that these | The terms "client" and "server" refer only to the roles that these | |||
| programs perform for a particular connection. The same program might | programs perform for a particular connection. The same program might | |||
| act as a client on some connections and a server on others. | act as a client on some connections and a server on others. | |||
| 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's semantics can be understood in isolation, and that the | |||
| on HTTP's stateless design in order to reuse proxied connections or | relationship between connections and messages on them has no impact | |||
| dynamically load balance requests across multiple servers. | on the interpretation of those messages. For example, a CONNECT | |||
| request (Section 9.3.6) or a request with the Upgrade header field | ||||
| (Section 7.8) can occur at any time, not just in the first message on | ||||
| a connection. Many implementations depend on HTTP's stateless design | ||||
| in order to reuse proxied connections or dynamically load balance | ||||
| requests across multiple servers. | ||||
| Hence, a server MUST NOT assume that two requests on the same | As a result, a server MUST NOT assume that two requests on the same | |||
| connection are from the same user agent unless the connection is | connection are from the same user agent unless the connection is | |||
| secured and specific to that agent. Some non-standard HTTP | secured and specific to that agent. Some non-standard HTTP | |||
| extensions (e.g., [RFC4559]) have been known to violate this | extensions (e.g., [RFC4559]) have been known to violate this | |||
| requirement, resulting in security and interoperability problems. | requirement, resulting in security and interoperability problems. | |||
| A connection might be used for multiple request/response exchanges, | ||||
| as defined in Section 6.3. | ||||
| 3.4. Messages | 3.4. Messages | |||
| The terms "sender" and "recipient" | 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, | refer to any implementation that sends or receives a given message, | |||
| respectively. | respectively. | |||
| A client sends an HTTP request to a server in the form of a request | A client sends requests to a server in the form of a _request_ | |||
| message, beginning with a request-line that includes a method, URI, | message with a method (Section 9) and request target (Section 7.1). | |||
| and protocol version (Section 3.1.1), followed by header fields | The request might also contain header fields (Section 6.3) for | |||
| containing request modifiers, client information, and representation | request modifiers, client information, and representation metadata, | |||
| metadata (Section 3.2), an empty line to indicate the end of the | content (Section 6.4) intended for processing in accordance with the | |||
| header section, and finally a message body containing the payload | method, and trailer fields (Section 6.5) to communicate information | |||
| body (if any, Section 3.3). | collected while sending the content. | |||
| When a client constructs an HTTP/1.1 request message, it sends the | ||||
| target URI in one of various forms, as defined in (Section 5.3 of | ||||
| [RFC7230]). When a request is received, the server reconstructs an | ||||
| effective request URI for the target resource (Section 5.5 of | ||||
| [RFC7230]). | ||||
| 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 | |||
| HTTP response messages, each beginning with a status line that includes | _response_ messages, each including a status code (Section 15). The | |||
| the protocol version, a success or error code, and textual reason | response might also contain header fields for server information, | |||
| phrase (Section 3.1.2), possibly followed by header fields containing | resource metadata, and representation metadata, content to be | |||
| server information, resource metadata, and representation metadata | interpreted in accordance with the status code, and trailer fields to | |||
| (Section 3.2), an empty line to indicate the end of the header section, | communicate information collected while sending the content. | |||
| and finally a message body containing the payload body (if any, Section | ||||
| 3.3). | ||||
| 3.5. User Agents | 3.5. User Agents | |||
| The term "user agent" refers to any of the various client programs | The term _user agent_ refers to any of the various client programs | |||
| that initiate a request, including (but not limited to) browsers, spiders | that initiate a request. | |||
| (web-based robots), command-line tools, custom applications, and | ||||
| mobile apps. | ||||
| When considering the design of HTTP, it is easy to fall into a trap | The most familiar form of user agent is the general-purpose Web | |||
| of thinking that all user agents are general-purpose browsers and all | browser, but that's only a small percentage of implementations. | |||
| origin servers are large public websites. That is not the case in | Other common user agents include spiders (web-traversing robots), | |||
| practice. Common HTTP user agents include household appliances, | command-line tools, billboard screens, household appliances, scales, | |||
| stereos, scales, firmware update scripts, command-line programs, | light bulbs, firmware update scripts, mobile apps, and communication | |||
| mobile apps, and communication devices in a multitude of shapes and | devices in a multitude of shapes and sizes. | |||
| sizes. | ||||
| The term "user agent" does not imply that there is a human user | Being a user agent does not imply that there is a human user directly | |||
| directly interacting with the software agent at the time of a | interacting with the software agent at the time of a request. In | |||
| request. In many cases, a user agent is installed or configured to | many cases, a user agent is installed or configured to run in the | |||
| run in the background and save its results for later inspection (or | background and save its results for later inspection (or save only a | |||
| save only a subset of those results that might be interesting or | subset of those results that might be interesting or erroneous). | |||
| erroneous). Spiders, for example, are typically given a start URI | Spiders, for example, are typically given a start URI and configured | |||
| and configured to follow certain behavior while crawling the Web as a | to follow certain behavior while crawling the Web as a hypertext | |||
| hypertext graph. | graph. | |||
| The implementation diversity of HTTP means that not all user agents | Many user agents cannot, or choose not to, make interactive | |||
| can make interactive suggestions to their user or provide adequate | suggestions to their user or provide adequate warning for security or | |||
| warning for security or privacy concerns. In the few cases where | privacy concerns. In the few cases where this specification requires | |||
| this specification requires reporting of errors to the user, it is | reporting of errors to the user, it is acceptable for such reporting | |||
| acceptable for such reporting to only be observable in an error | to only be observable in an error console or log file. Likewise, | |||
| console or log file. Likewise, requirements that an automated action | requirements that an automated action be confirmed by the user before | |||
| be confirmed by the user before proceeding might be met via advance | proceeding might be met via advance configuration choices, run-time | |||
| configuration choices, run-time options, or simple avoidance of the | options, or simple avoidance of the unsafe action; confirmation does | |||
| unsafe action; confirmation does not imply any specific user | not imply any specific user interface or interruption of normal | |||
| interface or interruption of normal processing if the user has | processing if the user has already made that choice. | |||
| already made that choice. | ||||
| 3.6. Origin Server | 3.6. Origin Server | |||
| The term "origin server" refers to the program that can originate | The term _origin server_ refers to a program that can originate | |||
| authoritative responses for a given target resource. | authoritative responses for a given target resource. | |||
| Likewise, common HTTP | The most familiar form of origin server are large public websites. | |||
| origin servers include home automation units, configurable | 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 | networking components, office machines, autonomous robots, news | |||
| feeds, traffic cameras, ad selectors, and video-delivery | feeds, traffic cameras, real-time ad selectors, and video-on-demand | |||
| platforms. | platforms. | |||
| Most HTTP communication consists of a retrieval request (GET) for a | Most HTTP communication consists of a retrieval request (GET) for a | |||
| representation of some resource identified by a URI. In the simplest | representation of some resource identified by a URI. In the simplest | |||
| case, this might be accomplished via a single bidirectional | case, this might be accomplished via a single bidirectional | |||
| connection (===) between the user agent (UA) and the origin | connection (===) between the user agent (UA) and the origin server | |||
| server (O). | (O). | |||
| request > | request > | |||
| UA ======================================= O | UA ======================================= O | |||
| < response | < response | |||
| Figure 1 | ||||
| 3.7. 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 | |||
| < < < < | < < < < | |||
| Figure 2 | ||||
| The figure above shows three intermediaries (A, B, and C) between the | The figure above shows three intermediaries (A, B, and C) between the | |||
| user agent and origin server. A request or response message that | user agent and origin server. A request or response message that | |||
| travels the whole chain will pass through four separate connections. | travels the whole chain will pass through four separate connections. | |||
| Some HTTP communication options might apply only to the connection | Some HTTP communication options might apply only to the connection | |||
| with the nearest, non-tunnel neighbor, only to the endpoints of the | with the nearest, non-tunnel neighbor, only to the endpoints of the | |||
| chain, or to all connections along the chain. Although the diagram | chain, or to all connections along the chain. Although the diagram | |||
| is linear, each participant might be engaged in multiple, | is linear, each participant might be engaged in multiple, | |||
| simultaneous communications. For example, B might be receiving | simultaneous communications. For example, B might be receiving | |||
| requests from many clients other than A, and/or forwarding requests | requests from many clients other than A, and/or forwarding requests | |||
| to servers other than C, at the same time that it is handling A's | to servers other than C, at the same time that it is handling A's | |||
| request. Likewise, later requests might be sent through a different | request. Likewise, later requests might be sent through a different | |||
| 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 | content while they are being forwarded, as described in Section 7.7. | |||
| Section 5.7.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 | |||
| the outbound communication of a gateway. A gateway communicates with | the outbound communication of a gateway. A gateway communicates with | |||
| inbound servers using any protocol that it desires, including private | inbound servers using any protocol that it desires, including private | |||
| extensions to HTTP that are outside the scope of this specification. | extensions to HTTP that are outside the scope of this specification. | |||
| However, an HTTP-to-HTTP gateway that wishes to interoperate with | However, an HTTP-to-HTTP gateway that wishes to interoperate with | |||
| third-party HTTP servers ought to conform to user agent requirements | third-party HTTP servers needs to conform to user agent requirements | |||
| on the gateway's inbound connection. | on the gateway's inbound connection. | |||
| A "tunnel" acts as a blind relay between two connections without | A _tunnel_ acts as a blind relay between two connections without | |||
| changing the messages. Once active, a tunnel is not considered a | changing the messages. Once active, a tunnel is not considered a | |||
| party to the HTTP communication, though the tunnel might have been | party to the HTTP communication, though the tunnel might have been | |||
| initiated by an HTTP request. A tunnel ceases to exist when both | initiated by an HTTP request. A tunnel ceases to exist when both | |||
| ends of the relayed connection are closed. Tunnels are used to | ends of the relayed connection are closed. Tunnels are used to | |||
| extend a virtual connection through an intermediary, such as when | extend a virtual connection through an intermediary, such as when | |||
| Transport Layer Security (TLS, [RFC5246]) is used to establish | Transport Layer Security (TLS, [TLS13]) is used to establish | |||
| confidential communication through a shared firewall proxy. | confidential communication through a shared firewall proxy. | |||
| The above categories for intermediary only consider those acting as | The above categories for intermediary only consider those acting as | |||
| 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 a man-in-the-middle | indistinguishable (at a protocol level) from an on-path attacker, | |||
| attack, often introducing security flaws or interoperability problems | often introducing security flaws or interoperability problems due to | |||
| 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]) differs from an HTTP proxy | |||
| an HTTP proxy because it is not selected by the client. Instead, an | because it is not chosen by the client. Instead, an interception | |||
| interception proxy filters or redirects outgoing TCP port 80 packets | proxy filters or redirects outgoing TCP port 80 packets (and | |||
| (and occasionally other common port traffic). Interception proxies | occasionally other common port traffic). Interception proxies are | |||
| are commonly found on public network access points, as a means of | 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. | |||
| 3.8. 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 while 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 | |||
| applicable to that request. The following illustrates the resulting | applicable to that request. The following illustrates the resulting | |||
| chain if B has a cached copy of an earlier response from O (via C) | chain if B has a cached copy of an earlier response from O (via C) | |||
| for a request that has not been cached by UA or A. | for a request that has not been cached by UA or A. | |||
| > > | > > | |||
| UA =========== A =========== B - - - - - - C - - - - - - O | UA =========== A =========== B - - - - - - C - - - - - - O | |||
| < < | < < | |||
| A response is "cacheable" if a cache is allowed to store a copy of | Figure 3 | |||
| A response is _cacheable_ if a cache is allowed to store a copy of | ||||
| the response message for use in answering subsequent requests. Even | the response message for use in answering subsequent requests. Even | |||
| when a response is cacheable, there might be additional constraints | when a response is cacheable, there might be additional constraints | |||
| placed by the client or by the origin server on when that cached | placed by the client or by the origin server on when that cached | |||
| response can be used for a particular request. HTTP requirements for | response can be used for a particular request. HTTP requirements for | |||
| cache behavior and cacheable responses are defined in Section 2 of | cache behavior and cacheable responses are defined in [CACHING]. | |||
| [RFC7234]. | ||||
| 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 bandwidth | |||
| transoceanic bandwidth, collaborative systems that broadcast or | and reduce latency, Content Delivery Networks that use gateway | |||
| multicast cache entries, archives of pre-fetched cache entries for | caching to optimise regional and global distribution of popular | |||
| use in off-line or high-latency environments, and so on. | sites, collaborative systems that broadcast or multicast cache | |||
| entries, archives of pre-fetched cache entries for use in off-line or | ||||
| high-latency environments, and so on. | ||||
| 3.9. Example Request and Response | 3.9. Example Message Exchange | |||
| The following example illustrates a typical message exchange for a | The following example illustrates a typical HTTP/1.1 message exchange | |||
| GET request (Section 4.3.1 of [RFC7231]) on the URI | for a GET request (Section 9.3.1) on the URI "http://www.example.com/ | |||
| "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.64.1 | |||
| Host: www.example.com | Host: www.example.com | |||
| Accept-Language: en, mi | Accept-Language: en, mi | |||
| Server response: | Server response: | |||
| HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
| Date: Mon, 27 Jul 2009 12:28:53 GMT | Date: Mon, 27 Jul 2009 12:28:53 GMT | |||
| 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 content includes a trailing CRLF. | |||
| 4. Identifiers in HTTP | 4. Identifiers in HTTP | |||
| Uniform Resource Identifiers (URIs) [RFC3986] are used throughout | Uniform Resource Identifiers (URIs) [URI] are used throughout HTTP as | |||
| HTTP as the means for identifying resources (Section 2 of [RFC7231]). | the means for identifying resources (Section 3.1). | |||
| 4.1. URI References | 4.1. URI References | |||
| URI references are used to target requests, indicate redirects, and | 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", | |||
| "scheme", "authority", "port", "host", "path-abempty", "segment", | "authority", "port", "host", "path-abempty", "segment", and "query" | |||
| "query", and "fragment" are adopted from the URI generic syntax. An | are adopted from the URI generic syntax. An "absolute-path" rule is | |||
| "absolute-path" rule is defined for protocol elements that can | defined for protocol elements that can contain a non-empty path | |||
| contain a non-empty path component. (This rule differs slightly from | component. (This rule differs slightly from the path-abempty rule of | |||
| the path-abempty rule of RFC 3986, which allows for an empty path to | RFC 3986, which allows for an empty path, and path-absolute rule, | |||
| be used in references, and path-absolute rule, which does not allow | which does not allow paths that begin with "//".) A "partial-URI" | |||
| paths that begin with "//".) A "partial-URI" rule is defined for | rule is defined for protocol elements that can contain a relative URI | |||
| protocol elements that can contain a relative URI but not a fragment | but not a fragment component. | |||
| component. | ||||
| URI-reference = <URI-reference, see [RFC3986], Section 4.1> | URI-reference = <URI-reference, see [URI], Section 4.1> | |||
| absolute-URI = <absolute-URI, see [RFC3986], Section 4.3> | absolute-URI = <absolute-URI, see [URI], Section 4.3> | |||
| relative-part = <relative-part, see [RFC3986], Section 4.2> | relative-part = <relative-part, see [URI], Section 4.2> | |||
| scheme = <scheme, see [RFC3986], Section 3.1> | authority = <authority, see [URI], Section 3.2> | |||
| authority = <authority, see [RFC3986], Section 3.2> | uri-host = <host, see [URI], Section 3.2.2> | |||
| uri-host = <host, see [RFC3986], Section 3.2.2> | port = <port, see [URI], Section 3.2.3> | |||
| port = <port, see [RFC3986], Section 3.2.3> | path-abempty = <path-abempty, see [URI], Section 3.3> | |||
| path-abempty = <path-abempty, see [RFC3986], Section 3.3> | segment = <segment, see [URI], Section 3.3> | |||
| segment = <segment, see [RFC3986], Section 3.3> | query = <query, see [URI], Section 3.4> | |||
| query = <query, see [RFC3986], Section 3.4> | ||||
| fragment = <fragment, see [RFC3986], Section 3.5> | ||||
| absolute-path = 1*( "/" segment ) | absolute-path = 1*( "/" segment ) | |||
| partial-URI = relative-part [ "?" query ] | partial-URI = relative-part [ "?" query ] | |||
| Each protocol element in HTTP that allows a URI reference will | Each protocol element in HTTP that allows a URI reference will | |||
| indicate in its ABNF production whether the element allows any form | indicate in its ABNF production whether the element allows any form | |||
| of reference (URI-reference), only a URI in absolute form | of reference (URI-reference), only a URI in absolute form (absolute- | |||
| (absolute-URI), only the path and optional query components, or some | URI), only the path and optional query components (partial-URI), or | |||
| combination of the above. Unless otherwise indicated, URI references | some combination of the above. Unless otherwise indicated, URI | |||
| are parsed relative to the effective request URI (Section 5.5). | references are parsed relative to the target URI (Section 7.1). | |||
| [new] | It is RECOMMENDED that all senders and recipients support, at a | |||
| minimum, URIs with lengths of 8000 octets in protocol elements. Note | ||||
| that this implies some structures and on-wire representations (for | ||||
| example, the request line in HTTP/1.1) will necessarily be larger in | ||||
| some cases. | ||||
| 4.2. URI Schemes | 4.2. HTTP-Related URI Schemes | |||
| IANA maintains the registry of URI Schemes [BCP115] at | IANA maintains the registry of URI Schemes [BCP35] at | |||
| <http://www.iana.org/assignments/uri-schemes/>. | <https://www.iana.org/assignments/uri-schemes/>. Although requests | |||
| might target any URI scheme, the following schemes are inherent to | ||||
| HTTP servers: | ||||
| This document defines the following URI schemes. | +============+====================================+=======+ | |||
| | URI Scheme | Description | Ref. | | ||||
| +============+====================================+=======+ | ||||
| | http | Hypertext Transfer Protocol | 4.2.1 | | ||||
| +------------+------------------------------------+-------+ | ||||
| | https | Hypertext Transfer Protocol Secure | 4.2.2 | | ||||
| +------------+------------------------------------+-------+ | ||||
| +------------+------------------------------------+---------------+ | Table 2 | |||
| | URI Scheme | Description | Reference | | ||||
| +------------+------------------------------------+---------------+ | ||||
| | http | Hypertext Transfer Protocol | Section 2.7.1 | | ||||
| | https | Hypertext Transfer Protocol Secure | Section 2.7.2 | | ||||
| +------------+------------------------------------+---------------+ | ||||
| Note that the presence of a URI with a given authority component does | Note that the presence of an "http" or "https" URI does not imply | |||
| not imply that there is always an HTTP server listening for | that there is always an HTTP server at the identified origin | |||
| connections on that host and port. Anyone can mint a URI. What the | listening for connections. Anyone can mint a URI, whether or not a | |||
| authority component determines is who has the right to respond | server exists and whether or not that server currently maps that | |||
| authoritatively to requests that target the identified resource. The | identifier to a resource. The delegated nature of registered names | |||
| delegated nature of registered names and IP addresses creates a | and IP addresses creates a federated namespace whether or not an HTTP | |||
| federated namespace, based on control over the indicated host and | server is present. | |||
| port, whether or not an HTTP server is present. | ||||
| 4.2.1. http URI Scheme | 4.2.1. http URI Scheme | |||
| The "http" URI scheme is hereby defined for the purpose of minting | The "http" URI scheme is hereby defined for minting identifiers | |||
| identifiers according to their association with the hierarchical | within the hierarchical namespace governed by a potential HTTP origin | |||
| namespace governed by a potential HTTP origin server listening for | server listening for TCP ([TCP]) connections on a given port. | |||
| TCP ([RFC0793]) connections on a given port. | ||||
| http-URI = "http:" "//" authority path-abempty [ "?" query ] | http-URI = "http" "://" authority path-abempty [ "?" query ] | |||
| [ "#" fragment ] | ||||
| 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 TCP port | component, which includes a host identifier ([URI], Section 3.2.2) | |||
| ([RFC3986], Section 3.2.2). If the port subcomponent is empty or not | and optional port number ([URI], Section 3.2.3). If the port | |||
| given, TCP port 80 (the reserved port for WWW services) is the | subcomponent is empty or not given, TCP port 80 (the reserved port | |||
| default. | for WWW services) is the default. The origin determines who has the | |||
| right to respond authoritatively to requests that target the | ||||
| identified resource, as 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 serve | The hierarchical path component and optional query component identify | |||
| as an identifier for a potential target resource within that | the target resource within that origin server's name space. | |||
| origin server's name space. | ||||
| 4.2.2. https URI Scheme | 4.2.2. https URI Scheme | |||
| The "https" URI scheme is hereby defined for the purpose of minting | The "https" URI scheme is hereby defined for minting identifiers | |||
| identifiers according to their association with the hierarchical | within the hierarchical namespace governed by a potential origin | |||
| namespace governed by a potential HTTP origin server listening to a | server listening for TCP connections on a given port and capable of | |||
| given TCP port for TLS-secured connections ([RFC5246]). | establishing a TLS ([TLS13]) connection that has been secured for | |||
| HTTP communication. In this context, _secured_ specifically means | ||||
| that the server has been authenticated as acting on behalf of the | ||||
| identified authority and all HTTP communication with that server has | ||||
| confidentiality and integrity protection that is acceptable to both | ||||
| client and server. | ||||
| https-URI = "https:" "//" authority path-abempty [ "?" query ] | https-URI = "https" "://" authority path-abempty [ "?" query ] | |||
| [ "#" fragment ] | ||||
| All of the requirements listed above for the "http" scheme are also | The origin server for an "https" URI is identified by the authority | |||
| requirements for the "https" scheme, except that TCP port 443 is the | component, which includes a host identifier ([URI], Section 3.2.2) | |||
| default if the port subcomponent is empty or not given, and the user | and optional port number ([URI], Section 3.2.3). If the port | |||
| agent MUST ensure that its connection to the origin server is secured | subcomponent is empty or not given, TCP port 443 (the reserved port | |||
| through the use of strong encryption, end-to-end, prior to sending | for HTTP over TLS) is the default. The origin determines who has the | |||
| the first HTTP request. | right to respond authoritatively to requests that target the | |||
| identified resource, as defined in Section 4.3.3. | ||||
| Note that the "https" URI scheme depends on both TLS and TCP for | A sender MUST NOT generate an "https" URI with an empty host | |||
| establishing authority. | identifier. A recipient that processes such a URI reference MUST | |||
| reject it as invalid. | ||||
| The process for authoritative access to an "https" identified | The hierarchical path component and optional query component identify | |||
| resource is defined in [RFC2818]. | the target resource within that origin server's name space. | |||
| A client MUST ensure that its HTTP requests for an "https" resource | ||||
| are secured, prior to being communicated, and that it only accepts | ||||
| secured responses to those requests. Note that the definition of | ||||
| what cryptographic mechanisms are acceptable to client and server are | ||||
| usually negotiated and can change over time. | ||||
| 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 even if their resource identifiers | identity with the "http" scheme. They are distinct origins with | |||
| indicate the same authority (the same host listening to the same TCP | separate namespaces. However, extensions to HTTP that are defined as | |||
| port). They are distinct namespaces and are considered to be distinct | applying to all origins with the same host, such as the Cookie | |||
| origin servers. However, an extension to HTTP that is defined | protocol [COOKIE], allow information set by one service to impact | |||
| to apply to entire host domains, such as the Cookie | communication with other services within a matching group of host | |||
| protocol [RFC6265], can allow information set by one service to | domains. Such extensions ought to be designed with great care to | |||
| impact communication with other services within a matching group of | prevent information obtained from a secured connection being | |||
| host domains. | inadvertently exchanged within an unsecured context. | |||
| 4.2.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 | The "http" and "https" URI are normalized and compared according to | |||
| syntax, such URIs are normalized and compared according to the | the methods defined in Section 6 of [URI], 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 | HTTP does not require use of a specific method for determining | |||
| form is to omit the port subcomponent. When not being used in | equivalence. For example, a cache key might be compared as a simple | |||
| absolute form as the request target of an OPTIONS request, an empty | string, after syntax-based normalization, or after scheme-based | |||
| path component is equivalent to an absolute path of "/", so the | normalization. | |||
| normal form is to provide a path of "/" instead. The scheme and host | ||||
| are case-insensitive and normally provided in lowercase; all other | Scheme-based normalization (Section 6.2.3 of [URI]) of "http" and | |||
| components are compared in a case-sensitive manner. Characters other | "https" URIs involves the following additional rules: | |||
| than those in the "reserved" set are equivalent to their | ||||
| percent-encoded octets: the normal form is to not encode them (see | * If the port is equal to the default port for a scheme, the normal | |||
| Sections 2.1 and 2.2 of [RFC3986]). | form is to omit the port subcomponent. | |||
| * When not being used as the 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 of "/" instead. | ||||
| * The scheme and host are case-insensitive and normally provided in | ||||
| lowercase; all other components are compared in a case-sensitive | ||||
| manner. | ||||
| * Characters other than those in 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 [URI]). | ||||
| 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 | |||
| 4.2.4. Deprecated userinfo | Two HTTP URIs that are equivalent after normalization (using any | |||
| method) can be assumed to identify the same resource, and any HTTP | ||||
| component MAY perform normalization. As a result, distinct resources | ||||
| SHOULD NOT be identified by HTTP URIs that are equivalent after | ||||
| normalization (using any method defined in Section 6.2 of [URI]). | ||||
| The URI generic syntax for authority also includes a deprecated | 4.2.4. Deprecation of userinfo in http(s) URIs | |||
| userinfo subcomponent ([RFC3986], Section 3.2.1) for including user | ||||
| authentication information in the URI. | The URI generic syntax for authority also includes a userinfo | |||
| subcomponent ([URI], Section 3.2.1) for including user authentication | ||||
| information in the URI. In that subcomponent, the use 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" URI reference is generated | delimiter) when an "http" or "https" URI reference is generated | |||
| within a message as a request target or header field value. | within a message as a target URI or field value. | |||
| Before making use of an "http" 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. | |||
| 4.2.5. Fragment Identifiers on http(s) URI References | 4.2.5. http(s) References with Fragment Identifiers | |||
| The optional fragment component allows for indirect identification of a | Fragment identifiers allow for indirect identification of a secondary | |||
| secondary resource, independent of the URI scheme, as defined in Section | resource, independent of the URI scheme, as defined in Section 3.5 of | |||
| 3.5 of [RFC3986]. | [URI]. Some protocol elements that refer to a URI allow inclusion of | |||
| a fragment, while others do not. They are distinguished by use of | ||||
| the ABNF rule for elements where fragment is allowed; otherwise, a | ||||
| specific rule that excludes fragments is used. | ||||
| [new] | | *Note:* The fragment identifier component is not part of the | |||
| | scheme definition for a URI scheme (see Section 4.3 of [URI]), | ||||
| | thus does not appear in the ABNF definitions for the "http" and | ||||
| | "https" URI schemes above. | ||||
| 4.3. Authoritative Access | 4.3. Authoritative Access | |||
| [new] | Authoritative access refers to dereferencing a given identifier, for | |||
| the sake of access to the identified resource, in a way that the | ||||
| client believes is authoritative (controlled by the resource owner). | ||||
| The process for determining whether access is granted is defined by | ||||
| the URI scheme and often uses data within the URI components, such as | ||||
| the authority component when the generic syntax is used. However, | ||||
| authoritative access is not limited to the identified mechanism. | ||||
| [new] | Section 4.3.1 defines the concept of an origin as an aid to such | |||
| uses, and the subsequent subsections explain how to establish that a | ||||
| peer has the authority to represent an origin. | ||||
| See Section 9.1 for security considerations related to establishing | See Section 17.1 for security considerations related to establishing | |||
| authority. | authority. | |||
| 4.3.1. URI Origin | 4.3.1. URI Origin | |||
| [new] | The _origin_ for a given URI is the triple of scheme, host, and port | |||
| after normalizing the scheme and host to lowercase and normalizing | ||||
| the port to remove any leading zeros. If port is elided from the | ||||
| URI, the default port for that scheme is used. For example, the URI | ||||
| [new] | https://Example.Com/happy.js | |||
| [new] | would have the origin | |||
| [new] | { "https", "example.com", "443" } | |||
| [new] | which can also be described as the normalized URI prefix with port | |||
| always present: | ||||
| [new] | https://example.com:443 | |||
| [new] | Each origin defines its own namespace and controls how identifiers | |||
| 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. | ||||
| [new] | Two origins are distinct if they differ in scheme, host, or port. | |||
| Even when it can be verified that the same entity controls two | ||||
| 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 | ||||
| scope of this document, as described in [RFC6454]. | ||||
| 4.3.2. http origins | 4.3.2. http origins | |||
| Although HTTP is independent of the transport protocol, the "http" | Although HTTP is independent of the transport protocol, the "http" | |||
| scheme is specific to TCP-based services because the name delegation | scheme (Section 4.2.1) is specific to associating authority with | |||
| process depends on TCP for establishing authority. An HTTP service | whomever controls the origin server listening for TCP connections on | |||
| based on some other underlying connection protocol would presumably | the indicated port of whatever host is identified within the | |||
| be identified using a different URI scheme, just as the "https" | authority component. This is a very weak sense of authority because | |||
| scheme (below) is used for resources that require an end-to-end | it depends on both client-specific name resolution mechanisms and | |||
| secured connection. Other protocols might also be used to provide | communication that might not be secured from an on-path attacker. | |||
| access to "http" identified resources -- it is only the authoritative | Nevertheless, it is a sufficient minimum for binding "http" | |||
| interface that is specific to TCP. | identifiers to an origin server for consistent resolution within a | |||
| trusted environment. | ||||
| If the host identifier is provided as an IP address, the origin | 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 | 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 | address. If host is a registered name, the registered name is an | |||
| indirect identifier for use with a name resolution service, such as | indirect identifier for use with a name resolution service, such as | |||
| DNS, to find an address for that origin server. | DNS, to find an address for an appropriate origin server. | |||
| When an "http" URI is used within a context that calls for access to | 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 | the indicated resource, a client MAY attempt access by resolving the | |||
| host to an IP address, establishing a TCP connection to that address | host identifier to an IP address, establishing a TCP connection to | |||
| on the indicated port, and sending an HTTP request message | that address on the indicated port, and sending over that connection | |||
| (Section 3) containing the URI's identifying data (Section 5) to the | an HTTP request message containing a request target that matches the | |||
| server. | client's target URI (Section 7.1). | |||
| If the server responds to that request with a non-interim HTTP | If the server responds to such a request with a non-interim HTTP | |||
| response message, as described in Section 6 of [RFC7231], then that response | response message, as described in Section 15, then that response is | |||
| is | ||||
| considered an authoritative answer to the client's request. | considered an authoritative answer to the client's request. | |||
| [new] | 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 [ALTSVC] 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. | ||||
| 4.3.3. https origins | 4.3.3. https origins | |||
| [new] | 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). | ||||
| [new] | In HTTP/1.1 and earlier, a client will only attribute authority to a | |||
| server when they are communicating over a successfully established | ||||
| and secured connection specifically to that URI origin's host. The | ||||
| connection establishment and certificate verification are used as | ||||
| proof of authority. | ||||
| [new] | 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]. | ||||
| [new] | The request target's host and port value are passed within each HTTP | |||
| request, identifying the origin and distinguishing it from other | ||||
| namespaces that might be controlled by the same server (Section 7.2). | ||||
| 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 (Section 7.4). | ||||
| [new] | An origin server might be unwilling to process requests for certain | |||
| target URIs even when they have the authority to do so. For example, | ||||
| when a host operates distinct services on different ports (e.g., 443 | ||||
| and 8000), checking the target URI at the origin server is necessary | ||||
| (even after the connection has been secured) because a network | ||||
| attacker might cause connections for one port to be received at some | ||||
| other port. Failing to check the target URI might allow such an | ||||
| attacker to replace a response to one target URI (e.g., | ||||
| "https://example.com/foo") with a seemingly authoritative response | ||||
| from the other port (e.g., "https://example.com:8000/foo"). | ||||
| [new] | Note that the "https" scheme does not rely on TCP and the connected | |||
| port number for associating authority, since both are outside the | ||||
| secured communication and thus cannot be trusted as definitive. | ||||
| Hence, the HTTP communication might take place over any channel that | ||||
| has been secured, as defined in Section 4.2.2, including protocols | ||||
| that don't use TCP. | ||||
| [new] | When an "https" 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, securing the connection end-to- | ||||
| end by successfully initiating TLS over TCP with confidentiality and | ||||
| integrity protection, and sending over that connection an HTTP | ||||
| request message containing a request target that matches the client's | ||||
| target URI (Section 7.1). | ||||
| [new] | If the server responds to such a request with a non-interim HTTP | |||
| response message, as described in Section 15, then that response is | ||||
| considered an authoritative answer to the client's request. | ||||
| [new] | 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]). | ||||
| 4.3.4. https certificate verification | 4.3.4. https certificate verification | |||
| In general, HTTP/TLS requests are generated by dereferencing a URI. | To establish a secured connection to dereference a URI, a client MUST | |||
| As a consequence, the hostname for the server is known to the client. | verify that the service's identity is an acceptable match for the | |||
| If the hostname is available, the client MUST check it against the | URI's origin server. Certificate verification is used to prevent | |||
| server's identity as presented in the server's Certificate message, | server impersonation by an on-path attacker or by an attacker that | |||
| in order to prevent man-in-the-middle attacks. | controls name resolution. This process requires that a client be | |||
| If a subjectAltName extension of type dNSName is present, that MUST | configured with a set of trust anchors. | |||
| be used as the identity. Otherwise, the (most specific) Common Name | ||||
| field in the Subject field of the certificate MUST be used. Although | ||||
| the use of the Common Name is existing practice, it is deprecated and | ||||
| Certification Authorities are encouraged to use the dNSName instead. | ||||
| Matching is performed using the matching rules specified by | In general, a client MUST verify the service identity using the | |||
| [RFC2459]. If more than one identity of a given type is present in | verification process defined in Section 6 of [RFC6125]. The client | |||
| the certificate (e.g., more than one dNSName name, a match in any one | MUST construct a reference identity from the service's host: if the | |||
| of the set is considered acceptable.) Names may contain the wildcard | host is a literal IP address (Section 4.3.5), the reference identity | |||
| character * which is considered to match any single domain name | is an IP-ID, otherwise the host is a name and the reference identity | |||
| component or component fragment. E.g., *.a.com matches foo.a.com but | is a DNS-ID. | |||
| not bar.foo.a.com. f*.com matches foo.com but not bar.com. | ||||
| [new] | A reference identity of type CN-ID MUST NOT be used by clients. As | |||
| noted in Section 6.2.1 of [RFC6125] a reference identity of type CN- | ||||
| ID might be used by older clients. | ||||
| If the client has external information as to the expected identity of | A client might be specially configured to accept an alternative form | |||
| the server, the hostname check MAY be omitted. | of server identity verification. For example, a client might be | |||
| (For instance, a client may be connecting to a machine whose address | connecting to a server whose address and hostname are dynamic, with | |||
| and hostname are dynamic but the client knows the certificate that | an expectation that the service will present a specific certificate | |||
| the server will present.) In such cases, it is important to narrow | (or a certificate matching some externally defined reference | |||
| the scope of acceptable certificates as much as possible in order | identity) rather than one matching the target URI's origin. | |||
| to prevent man in the middle attacks. | ||||
| In special cases, it may be appropriate for the client to simply | In special cases, it might be appropriate for a client to simply | |||
| ignore the server's identity, but it must be understood that this | ignore the server's identity, but it must be understood that this | |||
| leaves the connection open to active attack. | leaves a connection open to active attack. | |||
| If the hostname does not match the identity in the certificate, user | ||||
| oriented clients MUST either notify the user (clients MAY give the | ||||
| user the opportunity 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. | ||||
| Note that in many cases the URI itself comes from an untrusted | If the certificate is not valid for the target URI's origin, a user | |||
| source. The above-described check provides no protection against | agent MUST either obtain confirmation from the user before proceeding | |||
| attacks where this source is compromised. For example, if the URI was | (see Section 3.5) or terminate the connection with a bad certificate | |||
| obtained by clicking on an HTML page which was itself obtained | error. Automated clients MUST log the error to an appropriate audit | |||
| without using HTTP/TLS, a man in the middle could have replaced the | log (if available) and SHOULD terminate the connection (with a bad | |||
| URI. In order to prevent this form of attack, users should carefully | certificate error). Automated clients MAY provide a configuration | |||
| examine the certificate presented by the server to determine if it | setting that disables this check, but MUST provide a setting which | |||
| meets their expectations. | enables it. | |||
| *3.2. Client Identity [paras squished together to anchor context]* | ||||
| Typically, the server has no external knowledge of what the client's | ||||
| identity ought to be and so checks (other than that the client has a | ||||
| certificate chain rooted in an appropriate CA) are not possible. If a | ||||
| server has such knowledge (typically from some source external to | ||||
| HTTP or TLS) it SHOULD check the identity as described above. | ||||
| 4.3.5. IP-ID reference identity | 4.3.5. IP-ID reference identity | |||
| In some cases, the URI is specified as an IP address rather than a | A server that is identified using an IP address literal in the "host" | |||
| hostname. In this case, the iPAddress subjectAltName must be present | field of an "https" URI has a reference identity of type IP-ID. An | |||
| in the certificate and must exactly match the IP in the URI. | IP version 4 address uses the "IPv4address" ABNF rule and an IP | |||
| version 6 address uses the "IP-literal" production with the | ||||
| "IPv6address" option; see Section 3.2.2 of [URI]. A reference | ||||
| identity of IP-ID contains the decoded bytes of the IP address. | ||||
| [new] | An IP version 4 address is 4 octets and an IP version 6 address is 16 | |||
| octets. Use of IP-ID is not defined for any other IP version. The | ||||
| iPAddress choice in the certificate subjectAltName extension does not | ||||
| explicitly include the IP version and so relies on the length of the | ||||
| address to distinguish versions; see Section 4.2.1.6 of [RFC5280]. | ||||
| [new] | A reference identity of type IP-ID matches if the address is | |||
| identical to an iPAddress value of the subjectAltName extension of | ||||
| the certificate. | ||||
| 5. Fields | 5. Fields | |||
| Header fields are key:value pairs that can be used to communicate | HTTP uses _fields_ to provide data in the form of extensible key/ | |||
| data about the message, its payload, the target resource, or the | value pairs with a registered key namespace. Fields are sent and | |||
| connection (i.e., control data). See Section 3.2 of [RFC7230] for a | received within the header and trailer sections of messages | |||
| general definition of header field syntax in HTTP messages. | (Section 6). | |||
| 5.1. Field Names | 5.1. Field Names | |||
| The field-name token labels the corresponding field-value as having | A field name labels the corresponding field value as having the | |||
| the semantics defined by that header field. For example, the Date | semantics defined by that name. For example, the Date header field | |||
| header field is defined in Section 7.1.1.2 of [RFC7231] as containing | is defined in Section 6.6.1 as containing the origination timestamp | |||
| the origination timestamp for the message in which it appears. | for the message in which it appears. | |||
| field-name = token | field-name = token | |||
| The requirements for header field names are defined in [BCP90]. | Field names are case-insensitive and ought to be registered within | |||
| the "Hypertext Transfer Protocol (HTTP) Field Name Registry"; see | ||||
| Section 16.3.1. | ||||
| The interpretation of a header 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, header fields defined in HTTP/1.1 are defined | specified otherwise, fields are defined for all versions of HTTP. In | |||
| for all versions of HTTP/1.x. In | particular, the Host and Connection fields ought to be recognized by | |||
| particular, the Host and Connection header fields ought to be implemented by | all HTTP implementations whether or not they advertise conformance | |||
| all HTTP/1.x implementations whether or not they advertise conformance | ||||
| with HTTP/1.1. | with HTTP/1.1. | |||
| New header 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. Header field extensibility is | that do not recognize them; see Section 16.3. | |||
| discussed in Section 3.2.1. | ||||
| A proxy MUST forward unrecognized header fields unless the field-name | A proxy MUST forward unrecognized header fields unless the field name | |||
| is listed in the Connection header field (Section 6.1) or the proxy | is listed in the Connection header field (Section 7.6.1) or the proxy | |||
| is specifically configured to block, or otherwise transform, such | is specifically configured to block, or otherwise transform, such | |||
| fields. Other recipients SHOULD ignore unrecognized header fields. | fields. Other recipients SHOULD ignore unrecognized header and | |||
| These requirements allow HTTP's functionality to be enhanced without | trailer fields. Adhering to these requirements allows HTTP's | |||
| requiring prior update of deployed intermediaries. | functionality to be extended without updating or removing deployed | |||
| intermediaries. | ||||
| 5.2. Field Lines and Combined Field Value | ||||
| Field sections are composed of any number of _field lines_, each with | ||||
| a _field name_ (see Section 5.1) identifying the field, and a _field | ||||
| line value_ that conveys data for that instance of the field. | ||||
| When a field name is only present once in a section, the combined | ||||
| _field value_ for that field consists of the corresponding field line | ||||
| value. When a field name is repeated within a section, its combined | ||||
| field value consists of the list of corresponding field line values | ||||
| within that section, concatenated in order, with each field line | ||||
| value separated by a comma. | ||||
| For example, this section: | ||||
| Example-Field: Foo, Bar | ||||
| Example-Field: Baz | ||||
| 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 | ||||
| second field line value is "Baz". The field value for "Example- | ||||
| Field" is the list "Foo, Bar, Baz". | ||||
| 5.3. Field Order | 5.3. Field Order | |||
| A recipient MAY combine multiple header fields with the same field | A recipient MAY combine multiple field lines within a field section | |||
| name into one "field-name: field-value" pair, without changing the | that have the same field name into one field line, without changing | |||
| semantics of the message, by appending each subsequent field value to | the semantics of the message, by appending each subsequent field line | |||
| the combined field value in order, separated by a comma. | value to the initial field line value in order, separated by a comma | |||
| (",") and optional whitespace (OWS, defined in Section 5.6.3). For | ||||
| consistency, use comma SP. | ||||
| The order in which header fields with the same field name are received is | The order in which field lines with the same name are received is | |||
| therefore significant to the interpretation of the combined field value; a | therefore significant to the interpretation of the field value; a | |||
| proxy MUST NOT change the order of these field values when | proxy MUST NOT change the order of these field line values when | |||
| forwarding a message. | forwarding a message. | |||
| A sender MUST NOT generate multiple header fields with the same field | This means that, aside from the well-known exception noted below, a | |||
| name in a message unless either the entire field value for that | sender MUST NOT generate multiple field lines with the same name in a | |||
| header field is defined as a comma-separated list [i.e., #(values)] | message (whether in the headers or trailers), or append a field line | |||
| or the header field is a well-known exception (as noted below). | when a field line of the same name already exists in the message, | |||
| unless that field's definition allows multiple field line values to | ||||
| be recombined as a comma-separated list [i.e., at least one | ||||
| alternative of the field's definition allows a comma-separated list, | ||||
| such as an ABNF rule of #(values) defined in Section 5.6.1]. | ||||
| Note: In practice, the "Set-Cookie" header field ([RFC6265]) often | | *Note:* In practice, the "Set-Cookie" header field ([COOKIE]) | |||
| appears multiple times in a response message and does not use the | | often appears in a response message across multiple field lines | |||
| list syntax, violating the above requirements on multiple header | | and does not use the list syntax, violating the above | |||
| fields with the same name. Since it cannot be combined into a | | requirements on multiple field lines with the same field name. | |||
| single field-value, recipients ought to handle "Set-Cookie" as a | | Since it cannot be combined into a single field value, | |||
| special case while processing header fields. (See Appendix A.2.3 | | recipients ought to handle "Set-Cookie" as a special case while | |||
| of [Kri2001] for details.) | | processing fields. (See Appendix A.2.3 of [Kri2001] for | |||
| | details.) | ||||
| The order in which header fields with differing field names are | The order in which field lines with differing field names are | |||
| received is not significant. However, it is good practice to send | received in a section is not significant. However, it is good | |||
| header fields that contain control data first, such as Host on | practice to send header fields that contain additional control data | |||
| requests and Date on responses, so that implementations can decide | first, such as Host on requests and Date on responses, so that | |||
| when not to handle a message as early as possible. | implementations can decide when not to handle a message as early as | |||
| possible. | ||||
| A server MUST NOT apply a request to the target resource until the | A server MUST NOT apply a request to the target resource until it | |||
| entire request header section is received, since later header fields | receives the entire request header section, since later header field | |||
| might include conditionals, authentication credentials, or | lines might include conditionals, authentication credentials, or | |||
| deliberately misleading duplicate header fields that would impact | deliberately misleading duplicate header fields that could impact | |||
| request processing. | request processing. | |||
| 5.4. Field Limits | 5.4. Field Limits | |||
| HTTP does not place a predefined limit on the length of each header | HTTP does not place a predefined limit on the length of each field | |||
| field or on the length of the header section as a whole, as described | line, field value, or on the length of a header or trailer section as | |||
| in Section 2.5. Various ad hoc limitations on individual header | a whole, as described in Section 2. Various ad hoc limitations on | |||
| field length are found in practice, often depending on the specific | individual lengths are found in practice, often depending on the | |||
| field semantics. | specific field's semantics. | |||
| A server that receives a request header field, or set of fields, | A server that receives a request header field line, field value, or | |||
| larger than it wishes to process MUST respond with an appropriate 4xx | set of fields larger than it wishes to process MUST respond with an | |||
| (Client Error) status code. Ignoring such header fields would | appropriate 4xx (Client Error) status code. Ignoring such header | |||
| increase the server's vulnerability to request smuggling attacks | fields would increase the server's vulnerability to request smuggling | |||
| (Section 9.5). | attacks (Section 11.2 of [HTTP/1.1]). | |||
| A client MAY discard or truncate received header fields that are | A client MAY discard or truncate received field lines that are larger | |||
| larger than the client wishes to process if the field semantics are | than the client wishes to process if the field semantics are such | |||
| such that the dropped value(s) can be safely ignored without changing | that the dropped value(s) can be safely ignored without changing the | |||
| the message framing or response semantics. | message framing or response semantics. | |||
| 5.5. Field Values | 5.5. Field Values | |||
| New header field values typically have their syntax defined using | HTTP field values consist of a sequence of characters in a format | |||
| ABNF ([RFC5234]), using the extension defined in Section 7 of [RFC7230] | defined by the field's grammar. Each field's grammar is usually | |||
| as necessary, and | defined using ABNF ([RFC5234]). | |||
| field-value = *( field-content / obs-fold ) | field-value = *field-content | |||
| field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] | field-content = field-vchar | |||
| [ 1*( SP / HTAB / field-vchar ) field-vchar ] | ||||
| field-vchar = VCHAR / obs-text | field-vchar = VCHAR / obs-text | |||
| obs-text = %x80-FF | ||||
| Leading and trailing whitespace in raw field values is removed upon | A field value does not include leading or trailing whitespace. When | |||
| field parsing (Section 3.2.4 of [RFC7230]). Field definitions where | a specific version of HTTP allows such whitespace to appear in a | |||
| leading or trailing whitespace in values is significant will have to | message, a field parsing implementation MUST exclude such whitespace | |||
| use a container syntax such as quoted-string (Section 3.2.6 of | prior to evaluating the field value. | |||
| [RFC7230]). | ||||
| are usually constrained to the range of | Field values are usually constrained to the range of US-ASCII | |||
| US-ASCII characters. Header fields needing a greater range of | characters [USASCII]. Fields needing a greater range of characters | |||
| characters can use an encoding such as the one defined in [RFC5987]. | can use an encoding, such as the one defined in [RFC8187]. | |||
| Historically, HTTP has allowed field content with text in the | Historically, HTTP allowed field content with text in the ISO-8859-1 | |||
| ISO-8859-1 charset [ISO-8859-1], supporting other charsets only | charset [ISO-8859-1], supporting other charsets only through use of | |||
| through use of [RFC2047] encoding. In practice, most HTTP header | [RFC2047] encoding. Specifications for newly defined fields SHOULD | |||
| field values use only a subset of the US-ASCII charset [USASCII]. | limit their values to visible US-ASCII octets (VCHAR), SP, and HTAB. | |||
| Newly defined header fields SHOULD limit their field values to | A recipient SHOULD treat other allowed octets in field content (i.e., | |||
| US-ASCII octets. A recipient SHOULD treat other octets in field | obs-text) as opaque data. | |||
| content (obs-text) as opaque data. | ||||
| [new] | Field values containing CR, LF, or NUL characters are invalid and | |||
| dangerous, due to the varying ways that implementations might parse | ||||
| and interpret those characters; a recipient of CR, LF, or NUL within | ||||
| a field value MUST either reject the message or replace each of those | ||||
| characters with SP before further processing or forwarding of that | ||||
| message. Field values containing other CTL characters are also | ||||
| invalid; however, recipients MAY retain such characters for the sake | ||||
| of robustness when they appear within a safe context (e.g., an | ||||
| application-specific quoted string that will not be processed by any | ||||
| downstream HTTP parser). | ||||
| [new] | Fields that only anticipate a single member as the field value are | |||
| referred to as _singleton fields_. | ||||
| [new] | Fields that allow multiple members as the field value are referred to | |||
| as _list-based fields_. The list operator extension of Section 5.6.1 | ||||
| is used as a common notation for defining field values that can | ||||
| contain multiple members. | ||||
| Because commas (",") are used as a generic delimiter between | Because commas (",") are used as the delimiter between members, they | |||
| field-values, they need to be treated with care if they are allowed | need to be treated with care if they are allowed as data within a | |||
| in the field-value. Typically, components that might contain a comma | member. This is true for both list-based and singleton fields, since | |||
| are protected with double-quotes using the quoted-string ABNF | a singleton field might be erroneously sent with multiple members and | |||
| production. | detecting such errors improves interoperability. Fields that expect | |||
| to contain a comma within a member, such as within an HTTP-date or | ||||
| URI-reference element, ought to be defined with delimiters around | ||||
| that element to distinguish any comma within that data from potential | ||||
| list separators. | ||||
| For example, a textual date and a URI (either of which might contain | For example, a textual date and a URI (either of which might contain | |||
| a comma) could be safely carried in field-values like these: | a comma) could be safely carried in list-based field values like | |||
| these: | ||||
| Example-URI-Field: "http://example.com/a.html,foo", | Example-URIs: "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-Dates: "Sat, 04 May 1996", "Wed, 14 Sep 2005" | |||
| Note that double-quote delimiters almost always are used with the | Note that double-quote delimiters are almost always used with the | |||
| quoted-string production; using a different syntax inside | quoted-string production (Section 5.6.4); using a different syntax | |||
| double-quotes will likely cause unnecessary confusion. | inside double-quotes will likely cause unnecessary confusion. | |||
| Many header fields use a format including (case-insensitively) named | Many fields (such as Content-Type, defined in Section 8.3) use a | |||
| parameters (for instance, Content-Type, defined in Section 3.1.1.5). | common syntax for parameters that allows both unquoted (token) and | |||
| Allowing both unquoted (token) and quoted (quoted-string) syntax for | quoted (quoted-string) syntax for a parameter value (Section 5.6.6). | |||
| the parameter value enables recipients to use existing parser | ||||
| components. When allowing both forms, the meaning of a parameter | ||||
| value ought to be independent of the syntax used for it (for an | ||||
| example, see the notes on parameter handling for media types in | ||||
| Section 3.1.1.1). | ||||
| Historically, HTTP header field values could be extended over | Use of common syntax allows recipients to reuse existing parser | |||
| multiple lines by preceding each extra line with at least one space | components. When allowing both forms, the meaning of a parameter | |||
| or horizontal tab (obs-fold). | value ought to be the same whether it was received as a token or a | |||
| quoted string. | ||||
| Consequently, this specification does not use ABNF rules | | *Note:* For defining field value syntax, this specification | |||
| to define each "Field-Name: Field Value" pair, as was done in | | uses an ABNF rule named after the field name to define the | |||
| previous editions. Instead, this specification uses ABNF rules that | | allowed grammar for that field's value (after said value has | |||
| are named according to each registered field name, wherein the rule | | been extracted from the underlying messaging syntax and | |||
| defines the valid grammar for that field's corresponding field values | | multiple instances combined into a list). | |||
| (i.e., after the field-value has been extracted from the header | ||||
| section by a generic field parser). | ||||
| 5.6. Field Value Components | 5.6. Common Rules for Defining Field Values | |||
| 5.6.1. ABNF List Extension: #rule | 5.6.1. Lists (#rule ABNF Extension) | |||
| A #rule extension to the ABNF rules of [RFC5234] is used to improve | A #rule extension to the ABNF rules of [RFC5234] is used to improve | |||
| readability in the definitions of some header field values. | readability in the definitions of some list-based field values. | |||
| A construct "#" is defined, similar to "*", for defining | A construct "#" is defined, similar to "*", for defining comma- | |||
| comma-delimited lists of elements. The full form is "<n>#<m>element" | delimited lists of elements. The full form is "<n>#<m>element" | |||
| indicating at least <n> and at most <m> elements, each separated by a | indicating at least <n> and at most <m> elements, each separated by a | |||
| single comma (",") and optional whitespace (OWS). | single comma (",") and optional whitespace (OWS, defined in | |||
| Section 5.6.3). | ||||
| 5.6.1.1. Sender Requirements | 5.6.1.1. Sender Requirements | |||
| In any production that uses the list construct, a sender MUST NOT | In any production that uses the list construct, a sender MUST NOT | |||
| generate empty list elements. In other words, a sender MUST generate | generate empty list elements. In other words, a sender has to | |||
| lists that satisfy the following syntax: | generate lists that satisfy the following syntax: | |||
| 1#element => element *( OWS "," OWS element ) | 1#element => element *( OWS "," OWS element ) | |||
| and: | and: | |||
| #element => [ 1#element ] | #element => [ 1#element ] | |||
| and for n >= 1 and m > 1: | and for n >= 1 and m > 1: | |||
| <n>#<m>element => element <n-1>*<m-1>( OWS "," OWS element ) | <n>#<m>element => element <n-1>*<m-1>( OWS "," OWS element ) | |||
| Appendix B shows the collected ABNF for recipients after the list | Appendix A shows the collected ABNF for senders after the list | |||
| constructs have been expanded. | constructs have been expanded. | |||
| 5.6.1.2. Recipient Requirements | 5.6.1.2. Recipient Requirements | |||
| For compatibility with legacy list rules, a | Empty elements do not contribute to the count of elements present. A | |||
| recipient MUST parse and ignore a reasonable number of empty list | recipient MUST parse and ignore a reasonable number of empty list | |||
| elements: enough to handle common mistakes by senders that merge | elements: enough to handle common mistakes by senders that merge | |||
| values, but not so much that they could be used as a denial-of- | values, but not so much that they could be used as a denial-of- | |||
| service mechanism. In other words, a recipient MUST accept lists | service mechanism. In other words, a recipient MUST accept lists | |||
| that satisfy the following syntax: | that satisfy the following syntax: | |||
| #element => [ ( "," / element ) *( OWS "," [ OWS element ] ) ] | #element => [ element ] *( OWS "," OWS [ element ] ) | |||
| 1#element => *( "," OWS ) element *( OWS "," [ OWS element ] ) | ||||
| Empty elements do not contribute to the count of elements present. | 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: | For example, given these ABNF productions: | |||
| example-list = 1#example-list-elmt | example-list = 1#example-list-elmt | |||
| example-list-elmt = token ; see Section 3.2.6 | example-list-elmt = token ; see Section 5.6.2 | |||
| Then the following are valid values for example-list (not including | Then the following are valid values for example-list (not including | |||
| the double quotes, which are present for delimitation only): | the double quotes, which are present for delimitation only): | |||
| "foo,bar" | "foo,bar" | |||
| "foo ,bar," | "foo ,bar," | |||
| "foo , ,bar,charlie " | "foo , ,bar,charlie" | |||
| In contrast, the following values would be invalid, since at least | In contrast, the following values would be invalid, since at least | |||
| one non-empty element is required by the example-list production: | one non-empty element is required by the example-list production: | |||
| "" | "" | |||
| "," | "," | |||
| ", ," | ", ," | |||
| 5.6.2. Tokens | 5.6.2. Tokens | |||
| [new] | Tokens are short textual identifiers that do not include whitespace | |||
| or delimiters. | ||||
| token = 1*tchar | token = 1*tchar | |||
| tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" | tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" | |||
| / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" | / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" | |||
| / DIGIT / ALPHA | / DIGIT / ALPHA | |||
| ; any VCHAR, except delimiters | ; any VCHAR, except delimiters | |||
| Most HTTP header field values are defined using common syntax | Many HTTP field values are defined using common syntax components, | |||
| components (token, quoted-string, and comment) separated by | separated by whitespace or specific delimiting characters. | |||
| whitespace or specific delimiting characters. Delimiters are chosen | Delimiters are chosen from the set of US-ASCII visual characters not | |||
| from the set of US-ASCII visual characters not allowed in a token | allowed in a token (DQUOTE and "(),/:;<=>?@[\]{}"). | |||
| (DQUOTE and "(),/:;<=>?@[\]{}"). | ||||
| 5.6.3. Whitespace | 5.6.3. Whitespace | |||
| This specification uses three rules to denote the use of linear | This specification uses three rules to denote the use of linear | |||
| whitespace: OWS (optional whitespace), RWS (required whitespace), and | whitespace: OWS (optional whitespace), RWS (required whitespace), and | |||
| BWS ("bad" whitespace). | BWS ("bad" whitespace). | |||
| The OWS rule is used where zero or more linear whitespace octets | The OWS rule is used where zero or more linear whitespace octets | |||
| might appear. For protocol elements where optional whitespace is | might appear. For protocol elements where optional whitespace is | |||
| preferred to improve readability, a sender SHOULD generate the | preferred to improve readability, a sender SHOULD generate the | |||
| optional whitespace as a single SP; otherwise, a sender SHOULD NOT | optional whitespace as a single SP; otherwise, a sender SHOULD NOT | |||
| generate optional whitespace except as needed to white out invalid or | generate optional whitespace except as needed to overwrite invalid or | |||
| unwanted protocol elements during in-place message filtering. | unwanted protocol elements during in-place message filtering. | |||
| The RWS rule is used when at least one linear whitespace octet is | 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 | required to separate field tokens. A sender SHOULD generate RWS as a | |||
| single SP. | 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 | The BWS rule is used where the grammar allows optional whitespace | |||
| only for historical reasons. A sender MUST NOT generate BWS in | only for historical reasons. A sender MUST NOT generate BWS in | |||
| messages. A recipient MUST parse for such bad whitespace and remove | messages. A recipient MUST parse for such bad whitespace and remove | |||
| it before interpreting the protocol element. | 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 ) | OWS = *( SP / HTAB ) | |||
| ; optional whitespace | ; optional whitespace | |||
| RWS = 1*( SP / HTAB ) | RWS = 1*( SP / HTAB ) | |||
| ; required whitespace | ; required whitespace | |||
| BWS = OWS | BWS = OWS | |||
| ; "bad" whitespace | ; "bad" whitespace | |||
| 5.6.4. Quoted Strings | 5.6.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 | ||||
| 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 | |||
| that process the value of a quoted-string MUST handle a quoted-pair | that process the value of a quoted-string MUST handle a quoted-pair | |||
| 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.6.5. Comments | 5.6.5. Comments | |||
| Comments can be included in some HTTP header fields by surrounding | Comments can be included in some HTTP fields by surrounding the | |||
| the comment text with parentheses. Comments are only allowed in | comment text with parentheses. Comments are only allowed in fields | |||
| 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.6.6. Parameters | 5.6.6. Parameters | |||
| [new] | Parameters are instances of name=value pairs; they are often used in | |||
| field values as a common syntax for appending auxiliary information | ||||
| to an item. Each parameter is usually delimited by an immediately | ||||
| preceding semicolon. | ||||
| parameter = token "=" ( token / quoted-string ) | parameters = *( OWS ";" OWS [ parameter ] ) | |||
| parameter = parameter-name "=" parameter-value | ||||
| parameter-name = token | ||||
| parameter-value = ( token / quoted-string ) | ||||
| The parameter name tokens are case-insensitive. | Parameter names are case-insensitive. Parameter values might or | |||
| Parameter values might or might not be case-sensitive, depending on | might not be case-sensitive, depending on the semantics of the | |||
| the semantics of the parameter name. | parameter name. Examples of parameters and some equivalent forms can | |||
| be seen in media types (Section 8.3.1) and the Accept header field | ||||
| (Section 12.5.1). | ||||
| 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: Unlike some similar constructs in other header fields, media | | *Note:* Parameters do not allow whitespace (not even "bad" | |||
| type parameters do not allow whitespace (even "bad" whitespace) | | whitespace) around the "=" character. | |||
| around the "=" character. | ||||
| 5.6.7. Date/Time Formats | 5.6.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 | |||
| Sun, 06 Nov 1994 08:49:37 GMT ; IMF-fixdate | Sun, 06 Nov 1994 08:49:37 GMT ; IMF-fixdate | |||
| Examples of the two obsolete formats are | Examples of the two obsolete formats are | |||
| Sunday, 06-Nov-94 08:49:37 GMT ; obsolete RFC 850 format | Sunday, 06-Nov-94 08:49:37 GMT ; obsolete RFC 850 format | |||
| Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format | Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format | |||
| A recipient that parses a timestamp value in an HTTP header field | A recipient that parses a timestamp value in an HTTP field MUST | |||
| MUST accept all three HTTP-date formats. When a sender generates a | accept all three HTTP-date formats. When a sender generates a field | |||
| header field that contains one or more timestamps defined as | that contains one or more timestamps defined as HTTP-date, the sender | |||
| HTTP-date, the sender MUST generate those timestamps in the | MUST generate those timestamps in the IMF-fixdate format. | |||
| IMF-fixdate format. | ||||
| An HTTP-date value represents time as an instance of Coordinated | An HTTP-date value represents time as an instance of Coordinated | |||
| Universal Time (UTC). The first two formats indicate UTC by the | Universal Time (UTC). The first two formats indicate UTC by the | |||
| three-letter abbreviation for Greenwich Mean Time, "GMT", a | three-letter abbreviation for Greenwich Mean Time, "GMT", a | |||
| predecessor of the UTC name; values in the asctime format are assumed | predecessor of the UTC name; values in the asctime format are assumed | |||
| to be in UTC. A sender that generates HTTP-date values from a local | to be in UTC. | |||
| clock ought to use NTP ([RFC5905]) or some similar protocol to | ||||
| synchronize its clock to UTC. | A _clock_ is an implementation capable of providing a reasonable | |||
| approximation of the current instant in UTC. A clock implementation | ||||
| ought to use NTP ([RFC5905]), or some similar protocol, to | ||||
| synchronize with UTC. | ||||
| Preferred format: | Preferred format: | |||
| IMF-fixdate = day-name "," SP date1 SP time-of-day SP GMT | IMF-fixdate = day-name "," SP date1 SP time-of-day SP GMT | |||
| ; fixed length/zone/capitalization subset of the format | ; fixed length/zone/capitalization subset of the format | |||
| ; see Section 3.3 of [RFC5322] | ; see Section 3.3 of [RFC5322] | |||
| day-name = %x4D.6F.6E ; "Mon", case-sensitive | day-name = %s"Mon" / %s"Tue" / %s"Wed" | |||
| / %x54.75.65 ; "Tue", case-sensitive | / %s"Thu" / %s"Fri" / %s"Sat" / %s"Sun" | |||
| / %x57.65.64 ; "Wed", case-sensitive | ||||
| / %x54.68.75 ; "Thu", case-sensitive | ||||
| / %x46.72.69 ; "Fri", case-sensitive | ||||
| / %x53.61.74 ; "Sat", case-sensitive | ||||
| / %x53.75.6E ; "Sun", case-sensitive | ||||
| date1 = day SP month SP year | date1 = day SP month SP year | |||
| ; e.g., 02 Jun 1982 | ; e.g., 02 Jun 1982 | |||
| day = 2DIGIT | day = 2DIGIT | |||
| month = %x4A.61.6E ; "Jan", case-sensitive | month = %s"Jan" / %s"Feb" / %s"Mar" / %s"Apr" | |||
| / %x46.65.62 ; "Feb", case-sensitive | / %s"May" / %s"Jun" / %s"Jul" / %s"Aug" | |||
| / %x4D.61.72 ; "Mar", case-sensitive | / %s"Sep" / %s"Oct" / %s"Nov" / %s"Dec" | |||
| / %x41.70.72 ; "Apr", case-sensitive | ||||
| / %x4D.61.79 ; "May", case-sensitive | ||||
| / %x4A.75.6E ; "Jun", case-sensitive | ||||
| / %x4A.75.6C ; "Jul", case-sensitive | ||||
| / %x41.75.67 ; "Aug", case-sensitive | ||||
| / %x53.65.70 ; "Sep", case-sensitive | ||||
| / %x4F.63.74 ; "Oct", case-sensitive | ||||
| / %x4E.6F.76 ; "Nov", case-sensitive | ||||
| / %x44.65.63 ; "Dec", case-sensitive | ||||
| year = 4DIGIT | year = 4DIGIT | |||
| GMT = %x47.4D.54 ; "GMT", case-sensitive | GMT = %s"GMT" | |||
| time-of-day = hour ":" minute ":" second | time-of-day = hour ":" minute ":" second | |||
| ; 00:00:00 - 23:59:60 (leap second) | ; 00:00:00 - 23:59:60 (leap second) | |||
| hour = 2DIGIT | hour = 2DIGIT | |||
| minute = 2DIGIT | minute = 2DIGIT | |||
| second = 2DIGIT | second = 2DIGIT | |||
| Obsolete formats: | Obsolete formats: | |||
| obs-date = rfc850-date / asctime-date | obs-date = rfc850-date / asctime-date | |||
| rfc850-date = day-name-l "," SP date2 SP time-of-day SP GMT | rfc850-date = day-name-l "," SP date2 SP time-of-day SP GMT | |||
| date2 = day "-" month "-" 2DIGIT | date2 = day "-" month "-" 2DIGIT | |||
| ; e.g., 02-Jun-82 | ; e.g., 02-Jun-82 | |||
| day-name-l = %x4D.6F.6E.64.61.79 ; "Monday", case-sensitive | day-name-l = %s"Monday" / %s"Tuesday" / %s"Wednesday" | |||
| / %x54.75.65.73.64.61.79 ; "Tuesday", case-sensitive | / %s"Thursday" / %s"Friday" / %s"Saturday" | |||
| / %x57.65.64.6E.65.73.64.61.79 ; "Wednesday", case-sensitive | / %s"Sunday" | |||
| / %x54.68.75.72.73.64.61.79 ; "Thursday", case-sensitive | ||||
| / %x46.72.69.64.61.79 ; "Friday", case-sensitive | ||||
| / %x53.61.74.75.72.64.61.79 ; "Saturday", case-sensitive | ||||
| / %x53.75.6E.64.61.79 ; "Sunday", case-sensitive | ||||
| asctime-date = day-name SP date3 SP time-of-day SP year | asctime-date = day-name SP date3 SP time-of-day SP year | |||
| date3 = month SP ( 2DIGIT / ( SP 1DIGIT )) | date3 = month SP ( 2DIGIT / ( SP 1DIGIT )) | |||
| ; e.g., Jun 2 | ; e.g., Jun 2 | |||
| HTTP-date is case sensitive. A sender MUST NOT generate additional | HTTP-date is case sensitive. Note that Section 4.2 of [CACHING] | |||
| whitespace in an HTTP-date beyond that specifically included as SP in | relaxes this for cache recipients. | |||
| the grammar. The semantics of day-name, day, month, year, and | ||||
| time-of-day are the same as those defined for the Internet Message | A sender MUST NOT generate additional whitespace in an HTTP-date | |||
| Format constructs with the corresponding name ([RFC5322], Section | beyond that specifically included as SP in the grammar. The | |||
| 3.3). | semantics of day-name, day, month, year, and time-of-day are the same | |||
| as those defined for the Internet Message Format constructs with the | ||||
| corresponding name ([RFC5322], Section 3.3). | ||||
| Recipients of a timestamp value in rfc850-date format, which uses a | Recipients of a timestamp value in rfc850-date format, which uses a | |||
| two-digit year, MUST interpret a timestamp that appears to be more | two-digit year, MUST interpret a timestamp that appears to be more | |||
| than 50 years in the future as representing the most recent year in | than 50 years in the future as representing the most recent year in | |||
| the past that had the same last two digits. | the past that had the same last two digits. | |||
| Recipients of timestamp values are encouraged to be robust in parsing | Recipients of timestamp values are encouraged to be robust in parsing | |||
| 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 | example, messages are occasionally forwarded over HTTP from a non- | |||
| 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 only | | *Note:* HTTP requirements for the date/time stamp format apply | |||
| to their usage within the protocol stream. Implementations are | | only to their usage within the protocol stream. | |||
| not required to use these formats for user presentation, request | | Implementations are not required to use these formats for user | |||
| logging, etc. | | presentation, request logging, etc. | |||
| 6. Message Abstraction | 6. Message Abstraction | |||
| [new] | Each major version of HTTP defines its own syntax for communicating | |||
| messages. This section defines an abstract data type for HTTP | ||||
| messages based on a generalization of those message characteristics, | ||||
| common structure, and capacity for conveying semantics. This | ||||
| abstraction is used to define requirements on senders and recipients | ||||
| that are independent of the HTTP version, such that a message in one | ||||
| version can be relayed through other versions without changing its | ||||
| meaning. | ||||
| A _message_ consists of control data to describe and route the | ||||
| message, a headers lookup table of key/value pairs for extending that | ||||
| control data and conveying additional information about the sender, | ||||
| message, content, or context, a potentially unbounded stream of | ||||
| content, and a trailers lookup table of key/value pairs for | ||||
| communicating information obtained while sending the content. | ||||
| Framing and control data is sent first, followed by a header section | ||||
| containing fields for the headers table. When a message includes | ||||
| content, the content is sent after the header section, potentially | ||||
| followed by a trailer section that might contain fields for the | ||||
| trailers table. | ||||
| Messages are expected to be processed as a stream, wherein the | ||||
| purpose of that stream and its continued processing is revealed while | ||||
| being read. Hence, control data describes what the recipient needs | ||||
| to know immediately, header fields describe what needs to be known | ||||
| before receiving content, the content (when present) presumably | ||||
| contains what the recipient wants or needs to fulfill the message | ||||
| semantics, and trailer fields provide optional metadata that was | ||||
| unknown prior to sending the content. | ||||
| Messages are intended to be _self-descriptive_: 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). However, a client MUST retain knowledge of the | ||||
| request when parsing, interpreting, or caching a corresponding | ||||
| response. For example, responses to the HEAD method look just like | ||||
| the beginning of a response to GET, but cannot be parsed in the same | ||||
| manner. | ||||
| Note that this message abstraction is a generalization across many | ||||
| versions of HTTP, including features that might not be found in some | ||||
| versions. For example, trailers were introduced within the HTTP/1.1 | ||||
| chunked transfer coding as a trailer section after the content. An | ||||
| equivalent feature is present in HTTP/2 and HTTP/3 within the header | ||||
| block that terminates each stream. | ||||
| 6.1. Framing and Completeness | 6.1. Framing and Completeness | |||
| [new] | Message framing indicates how each message begins and ends, such that | |||
| each message can be distinguished from other messages or noise on the | ||||
| same connection. Each major version of HTTP defines its own framing | ||||
| mechanism. | ||||
| [new] | HTTP/0.9 and early deployments of HTTP/1.0 used closure of the | |||
| underlying connection to end a response. For backwards | ||||
| compatibility, this implicit framing is also allowed in HTTP/1.1. | ||||
| However, implicit framing can fail to distinguish an incomplete | ||||
| response if the connection closes early. For that reason, almost all | ||||
| modern implementations use explicit framing in the form of length- | ||||
| delimited sequences of message data. | ||||
| 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 underlying 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. | ||||
| 6.2. Control Data | 6.2. Control Data | |||
| HTTP communication is initiated by a user agent for some purpose. | Messages start with control data that describe its primary purpose. | |||
| The purpose is a combination of request semantics, which are defined | Request message control data includes a request method (Section 9), | |||
| in [RFC7231], and a target resource upon which to apply those | request target (Section 7.1), and protocol version (Section 2.5). | |||
| semantics. | Response message control data includes a status code (Section 15), | |||
| optional reason phrase, and protocol version. | ||||
| In HTTP/1.1 ([HTTP/1.1]) and earlier, control data is sent as the | ||||
| first line of a message. In HTTP/2 ([HTTP/2]) and HTTP/3 ([HTTP/3]), | ||||
| control data is sent as pseudo-header fields with a reserved name | ||||
| prefix (e.g., ":authority"). | ||||
| Every HTTP message has a protocol version. Depending on the version | ||||
| in use, it might be identified within the message explicitly or | ||||
| inferred by the connection over which the message is received. | ||||
| Recipients use that version information to determine limitations or | ||||
| potential for later communication with that sender. | ||||
| When a message is forwarded by an intermediary, the protocol version | ||||
| is updated to reflect the version used by that intermediary. The Via | ||||
| header field (Section 7.6.3) is used to communicate upstream protocol | ||||
| information within a forwarded message. | ||||
| 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 | |||
| conformant. | conformant. | |||
| A client MAY send a lower request version if it is known that the | A client MAY send a lower request version if it is known that the | |||
| server incorrectly implements the HTTP specification, but only after | server incorrectly implements the HTTP specification, but only after | |||
| the client has attempted at least one normal request and determined | the client has attempted at least one normal request and determined | |||
| 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. | |||
| When an HTTP message is received with a major version number that the | A recipient that receives a message with a major version number that | |||
| recipient implements, but a higher minor version number than what the | it implements and a minor version number higher than what it | |||
| recipient implements, the recipient SHOULD process the message as if | implements SHOULD process the message as if it were in the highest | |||
| it were in the highest minor version within that major version to | minor version within that major version to which the recipient is | |||
| which the recipient is conformant. A recipient can assume that a | conformant. A recipient can assume that a message with a higher | |||
| message with a higher minor version, when sent to a recipient that | minor version, when sent to a recipient that has not yet indicated | |||
| has not yet indicated support for that higher version, is | support for that higher version, is sufficiently backwards-compatible | |||
| sufficiently backwards-compatible to be safely processed by any | to be safely processed by any implementation of the same major | |||
| implementation of the same major version. | version. | |||
| 6.3. Header Fields | 6.3. Header Fields | |||
| [new] | Fields (Section 5) that are sent/received before the content are | |||
| referred to as "header fields" (or just "headers", colloquially). | ||||
| The _header section_ of a message consists of a sequence of header | ||||
| field lines. Each header field might modify or extend message | ||||
| semantics, describe the sender, define the content, or provide | ||||
| additional context. | ||||
| | *Note:* We refer to named fields specifically as a "header | ||||
| | field" when they are only allowed to be sent in the header | ||||
| | section. | ||||
| 6.4. Content | 6.4. Content | |||
| Some HTTP messages transfer a complete or partial representation as | HTTP messages often transfer a complete or partial representation as | |||
| the message "payload". In some cases, a payload might contain only | the message _content_: a stream of octets sent after the header | |||
| the associated representation's header fields (e.g., responses to | section, as delineated by the message framing. | |||
| HEAD) or only some part(s) of the representation data (e.g., the 206 | ||||
| (Partial Content) status code). | ||||
| [new] | This abstract definition of content reflects the data after it has | |||
| been extracted from the message framing. For example, an HTTP/1.1 | ||||
| message body (Section 6 of [HTTP/1.1]) might consist of a stream of | ||||
| data encoded with the chunked transfer coding - a sequence of data | ||||
| chunks, one zero-length chunk, and a trailer section - whereas the | ||||
| content of that same message includes only the data stream after the | ||||
| transfer coding has been decoded; it does not include the chunk | ||||
| lengths, chunked framing syntax, nor the trailer fields | ||||
| (Section 6.5). | ||||
| | *Note:* Some field names have a "Content-" prefix. This is an | ||||
| | informal convention; while some of these fields refer to the | ||||
| | content of the message, as defined above, others are scoped to | ||||
| | the selected representation (Section 3.2). See the individual | ||||
| | field's definition to disambiguate. | ||||
| 6.4.1. Content Semantics | 6.4.1. Content Semantics | |||
| The purpose of a payload in a request is defined by the method | The purpose of content in a request is defined by the method | |||
| semantics. | semantics (Section 9). | |||
| For example, a representation in the payload of a PUT request | For example, a representation in the content of a PUT request | |||
| (Section 4.3.4) represents the desired state of the target resource | (Section 9.3.4) represents the desired state of the target resource | |||
| if the request is successfully applied, whereas a representation | after the request is successfully applied, whereas a representation | |||
| in the payload of a POST request (Section 4.3.3) represents | in the content of a POST request (Section 9.3.3) represents | |||
| information to be processed by the target resource. | information to be processed by the target resource. | |||
| In a response, the payload's purpose is defined by both the request | In a response, the content's purpose is defined by the request | |||
| method and the response status code. For example, the payload of a | method, response status code (Section 15), and response fields | |||
| 200 (OK) response to GET (Section 4.3.1) represents the current state | describing that content. For example, the content of a 200 (OK) | |||
| of the target resource, as observed at the time of the message | response to GET (Section 9.3.1) represents the current state of the | |||
| origination date (Section 7.1.1.2), whereas the payload of the same | target resource, as observed at the time of the message origination | |||
| status code in a response to POST might represent either the | date (Section 6.6.1), whereas the content of the same status code in | |||
| processing result or the new state of the target resource after | a response to POST might represent either the processing result or | |||
| applying the processing. | the new state of the target resource after applying the processing. | |||
| [new] | The content of a 206 (Partial Content) response to GET contains | |||
| either a single part of the selected representation or a multipart | ||||
| message body containing multiple parts of that representation, as | ||||
| described in Section 15.3.7. | ||||
| Response messages with an error status code usually contain a payload | Response messages with an error status code usually contain content | |||
| that represents the error condition, such that it describes | that represents the error condition, such that the content describes | |||
| the error state and what next steps are suggested for resolving it. | the error state and what steps are suggested for resolving it. | |||
| Responses to the HEAD request method (Section 4.3.2 | Responses to the HEAD request method (Section 9.3.2) never include | |||
| of [RFC7231]) never include a message body because the associated | content; the associated response header fields indicate only what | |||
| response header fields (e.g., Transfer-Encoding, Content-Length, | their values would have been if the request method had been GET | |||
| etc.), if present, indicate only what their values would have been if | (Section 9.3.1). | |||
| the request method had been GET (Section 4.3.1 of [RFC7231]). | ||||
| 2xx (Successful) responses to a CONNECT request method | 2xx (Successful) responses to a CONNECT request method | |||
| (Section 4.3.6 of [RFC7231]) switch to tunnel mode instead of | (Section 9.3.6) switch the connection to tunnel mode instead of | |||
| having a message body. | having content. | |||
| All 1xx (Informational), 204 (No Content), and 304 (Not Modified) | All 1xx (Informational), 204 (No Content), and 304 (Not Modified) | |||
| responses do not include a message body. | responses do not include content. | |||
| All other responses do include a message body, although the body | All other responses do include content, although that content might | |||
| might be of zero length. | be of zero length. | |||
| 6.4.2. Identifying Content | 6.4.2. Identifying Content | |||
| When a complete or partial representation is transferred in a message | When a complete or partial representation is transferred as message | |||
| payload, it is often desirable for the sender to supply, or the | content, it is often desirable for the sender to supply, or the | |||
| recipient to determine, an identifier for a resource corresponding to | recipient to determine, an identifier for a resource corresponding to | |||
| that representation. | that specific representation. For example, a client making a GET | |||
| request on a resource for "the current weather report" might want an | ||||
| identifier specific to the content returned (e.g., "weather report | ||||
| for Laguna Beach at 20210720T1711"). This can be useful for sharing | ||||
| or bookmarking content from resources that are expected to have | ||||
| changing representations over time. | ||||
| For a request message: | For a request message: | |||
| o If the request has a Content-Location header field, then the | * If the request has a Content-Location header field, then the | |||
| sender asserts that the payload is a representation of the | sender asserts that the content is a representation of the | |||
| resource identified by the Content-Location field-value. However, | resource identified by the Content-Location field value. However, | |||
| such an assertion cannot be trusted unless it can be verified by | such an assertion cannot be trusted unless it can be verified by | |||
| other means (not defined by this specification). The information | other means (not defined by this specification). The information | |||
| might still be useful for revision history links. | might still be useful for revision history links. | |||
| o Otherwise, the payload is unidentified. | * Otherwise, the content is unidentified by HTTP, but a more | |||
| specific identifier might be supplied within the content itself. | ||||
| For a response message, the following rules are applied in order | For a response message, the following rules are applied in order | |||
| until a match is found: | until a match is found: | |||
| 1. If the request method is GET or HEAD and the response status code | 1. If the request method is HEAD or the response status code is 204 | |||
| is 200 (OK), 204 (No Content), 206 (Partial Content), or 304 (Not | (No Content) or 304 (Not Modified), there is no content in the | |||
| Modified), the payload is a representation of the resource | response. | |||
| identified by the effective request URI (Section 5.5 of | ||||
| [RFC7230]). | ||||
| 2. If the request method is GET or HEAD and the response status code | 2. If the request method is GET and the response status code is 200 | |||
| is 203 (Non-Authoritative Information), the payload is a potentially | (OK), the content is a representation of the target resource | |||
| (Section 7.1). | ||||
| 3. If the request method is GET and the response status code is 203 | ||||
| (Non-Authoritative Information), the content is a potentially | ||||
| modified or enhanced representation of the target resource as | modified or enhanced representation of the target resource as | |||
| provided by an intermediary. | provided by an intermediary. | |||
| 3. If the response has a Content-Location header field and its | 4. If the request method is GET and the response status code is 206 | |||
| field-value is a reference to the same URI as the effective | (Partial Content), the content is one or more parts of a | |||
| request URI, the payload is a representation of the resource | representation of the target resource. | |||
| identified by the effective request URI. | ||||
| 4. If the response has a Content-Location header field and its | 5. If the response has a Content-Location header field and its field | |||
| field-value is a reference to a URI different from the effective | value is a reference to the same URI as the target URI, the | |||
| request URI, then the sender asserts that the | content is a representation of the target resource. | |||
| payload is a representation of the resource identified by the | ||||
| Content-Location field-value. | 6. 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 content is a representation of the | ||||
| resource identified by the Content-Location field value. | ||||
| However, such an assertion cannot be trusted unless it can be | However, such an assertion cannot be trusted unless it can be | |||
| verified by other means (not defined by this specification). | verified by other means (not defined by this specification). | |||
| 5. Otherwise, the payload is unidentified. | 7. Otherwise, the content is unidentified by HTTP, but a more | |||
| specific identifier might be supplied within the content itself. | ||||
| 6.4.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. | ||||
| 6.5. Trailer Fields | 6.5. Trailer Fields | |||
| A trailer allows the sender to include additional fields at the end | Fields (Section 5) that are located within a _trailer section_ are | |||
| of a chunked message in order to supply metadata that might be | referred to as "trailer fields" (or just "trailers", colloquially). | |||
| dynamically generated while the message body is sent, such as a | Trailer fields can be useful for supplying message integrity checks, | |||
| message integrity check, digital signature, or post-processing | digital signatures, delivery metrics, or post-processing status | |||
| status. The trailer fields are identical to header fields, except | information. | |||
| they are sent in a chunked trailer instead of the message's 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. | ||||
| 6.5.1. Limitations on use of Trailers | 6.5.1. Limitations on use of Trailers | |||
| A sender MUST NOT generate a trailer that contains a field necessary | A trailer section is only possible when supported by the version of | |||
| for message framing (e.g., Transfer-Encoding and Content-Length), | HTTP in use and enabled by an explicit framing mechanism. For | |||
| routing (e.g., Host), request modifiers (e.g., controls and | example, the chunked coding in HTTP/1.1 allows a trailer section to | |||
| conditionals in Section 5 of [RFC7231]), authentication (e.g., see | be sent after the content (Section 7.1.2 of [HTTP/1.1]). | |||
| [RFC7235] and [RFC6265]), response control data (e.g., see Section | ||||
| 7.1 of [RFC7231]), or determining how to process the payload (e.g., | ||||
| Content-Encoding, Content-Type, Content-Range, and Trailer). | ||||
| When a chunked message containing a non-empty trailer is received, | Many fields cannot be processed outside the header section because | |||
| the recipient MAY process the fields (aside from those forbidden | their evaluation is necessary prior to receiving the content, such as | |||
| above) as if they were appended to the message's header section. A | those that describe message framing, routing, authentication, request | |||
| recipient MUST ignore (or consider as an error) any fields that are | modifiers, response controls, or content format. A sender MUST NOT | |||
| forbidden to be sent in a trailer, since processing them as if they | generate a trailer field unless the sender knows the corresponding | |||
| were present in the header section might bypass external security | header field name's definition permits the field to be sent in | |||
| filters. | trailers. | |||
| [new] | 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. | ||||
| [new] | The presence of the keyword "trailers" in the TE header field | |||
| (Section 10.1.4) of a request 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. | ||||
| Unless the request includes a TE header field indicating "trailers" | Because of the potential for trailer fields to be discarded in | |||
| is acceptable, as described in Section 4.3, a server SHOULD NOT | transit, a server SHOULD NOT generate trailer fields that it believes | |||
| generate trailer fields that it believes are necessary for the user | are necessary for the user agent to receive. | |||
| agent to receive. Without a TE containing "trailers", the server | ||||
| ought to assume that the trailer fields might be silently discarded | ||||
| along the path to the user agent. This requirement allows | ||||
| intermediaries to forward a de-chunked message to an HTTP/1.0 | ||||
| recipient without buffering the entire response. | ||||
| 6.5.2. Processing Trailer Fields | 6.5.2. Processing Trailer Fields | |||
| [new] | The "Trailer" header field (Section 6.6.2) can be sent to indicate | |||
| fields likely to be sent in the trailer section, which allows | ||||
| [new] | recipients to prepare for their receipt before processing the | |||
| content. For example, this could be useful if a field name indicates | ||||
| that a dynamic checksum should be calculated as the content is | ||||
| received and then immediately checked upon receipt of the trailer | ||||
| field value. | ||||
| [new] | 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. Trailer fields that might be generated more | ||||
| than once during a message MUST be defined as a list-based field even | ||||
| if each member value is only processed once per field line received. | ||||
| [new] | At the end of a message, a recipient MAY treat the set of received | |||
| trailer fields as a data structure of key/value pairs, similar to | ||||
| (but separate from) the header fields. Additional processing | ||||
| expectations, if any, can be defined within the field specification | ||||
| for a field intended for use in trailers. | ||||
| 6.6. Message Metadata | 6.6. Message Metadata | |||
| [new] | Fields that describe the message itself, such as when and how the | |||
| message has been generated, can appear in both requests and | ||||
| responses. | ||||
| 6.6.1. Date | 6.6.1. Date | |||
| The "Date" header field represents the date and time at which the | The "Date" header field represents the date and time at which the | |||
| message was originated, having the same semantics as the Origination | message was originated, having the same semantics as the Origination | |||
| Date Field (orig-date) defined in Section 3.6.1 of [RFC5322]. The | Date Field (orig-date) defined in Section 3.6.1 of [RFC5322]. The | |||
| field value is an HTTP-date, as defined in Section 7.1.1.1. | field value is an HTTP-date, as defined in Section 5.6.7. | |||
| Date = HTTP-date | Date = HTTP-date | |||
| An example is | An example is | |||
| Date: Tue, 15 Nov 1994 08:12:31 GMT | Date: Tue, 15 Nov 1994 08:12:31 GMT | |||
| When a Date header field is generated, the sender SHOULD generate its | A sender that generates a Date header field SHOULD generate its field | |||
| field value as the best available approximation of the date and time | value as the best available approximation of the date and time of | |||
| of message generation. In theory, the date ought to represent the | message generation. In theory, the date ought to represent the | |||
| moment just before the payload is generated. In practice, the date | moment just before generating the message content. In practice, a | |||
| can be generated at any time during message origination. | sender can generate the date value at any time during message | |||
| origination. | ||||
| An origin server MUST NOT send a Date header field if it does not | An origin server with a clock (as defined in Section 5.6.7) MUST | |||
| have a clock capable of providing a reasonable approximation of the | generate a Date header field in all 2xx (Successful), 3xx | |||
| current instance in Coordinated Universal Time. An origin server MAY | (Redirection), and 4xx (Client Error) responses, and MAY generate a | |||
| send a Date header field if the response is in the 1xx | Date header field in 1xx (Informational) and 5xx (Server Error) | |||
| (Informational) or 5xx (Server Error) class of status codes. An | responses. | |||
| origin server MUST send a Date header field in all other cases. | ||||
| An origin server without a clock MUST NOT generate a Date header | ||||
| field. | ||||
| A recipient with a clock that receives a response message without a | 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 | 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 | corresponding Date header field to the message's header section if it | |||
| is cached or forwarded downstream. | is cached or forwarded downstream. | |||
| A recipient with a clock that receives a response with an invalid | ||||
| Date header field value MAY replace that value with the time that | ||||
| response was received. | ||||
| A user agent MAY send a Date header field in a request, though | 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 | generally will not do so unless it is believed to convey useful | |||
| information to the server. For example, custom applications of HTTP | information to the server. For example, custom applications of HTTP | |||
| might convey a Date if the server is expected to adjust its | might convey a Date if the server is expected to adjust its | |||
| interpretation of the user's request based on differences between the | interpretation of the user's request based on differences between the | |||
| user agent and server clocks. | user agent and server clocks. | |||
| 6.6.2. Trailer | 6.6.2. Trailer | |||
| This allows the recipient to prepare for receipt of that | The "Trailer" header field provides a list of field names that the | |||
| metadata before it starts processing the body, which is useful | sender anticipates sending as trailer fields within that message. | |||
| if the message is being streamed and the recipient wishes to | This allows a recipient to prepare for receipt of the indicated | |||
| confirm an integrity check on the fly. | metadata before it starts processing the content. | |||
| Trailer = 1#field-name | Trailer = #field-name | |||
| [new] | For example, a sender might indicate that a signature will be | |||
| computed as the content 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 it receives the content. | ||||
| When a message includes a message body encoded with the chunked | A sender that intends to generate one or more trailer fields in a | |||
| transfer coding and the sender desires to send metadata in the form | message SHOULD generate a Trailer header field in the header section | |||
| of trailer fields at the end of the message, the sender SHOULD | of that message to indicate which fields might be present in the | |||
| generate a Trailer header field before the message body to indicate | trailers. | |||
| which fields will be present in the trailers. | ||||
| If an intermediary discards the trailer section in transit, the | ||||
| Trailer field could provide a hint of what metadata was lost, though | ||||
| there is no guarantee that a sender of Trailer will always follow | ||||
| through by sending the named fields. | ||||
| 7. Routing HTTP Messages | 7. Routing HTTP Messages | |||
| 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. | |||
| 7.1. Determining the Target Resource | 7.1. Determining the Target Resource | |||
| HTTP is used in a wide variety of applications, ranging from | Although HTTP is used in a wide variety of applications, most clients | |||
| general-purpose computers to home appliances. In some cases, | rely on the same resource identification mechanism and configuration | |||
| communication options are hard-coded in a client's configuration. | techniques as general-purpose Web browsers. Even when communication | |||
| However, most HTTP clients rely on the same resource identification | options are hard-coded in a client's configuration, we can think of | |||
| mechanism and configuration techniques as general-purpose Web | their combined effect as a URI reference (Section 4.1). | |||
| browsers. | ||||
| A URI reference (Section 2.7) is typically used as an | A URI reference is resolved to its absolute form in order to obtain | |||
| identifier for the "target resource", which a user agent would | the _target URI_. The target URI excludes the reference's fragment | |||
| resolve to its absolute form in order to obtain the "target URI". | component, if any, since fragment identifiers are reserved for | |||
| The target URI excludes the reference's fragment component, if any, | client-side processing ([URI], Section 3.5). | |||
| since fragment identifiers are reserved for client-side processing | ||||
| ([RFC3986], Section 3.5). | ||||
| [new] | To perform an action on a _target resource_, the client sends a | |||
| request message containing enough components of its parsed target URI | ||||
| to enable recipients to identify that same resource. For historical | ||||
| reasons, the parsed target URI components, collectively referred to | ||||
| as the _request target_, are sent within the message control data and | ||||
| the Host header field (Section 7.2). | ||||
| 6.1.3. Reconstructing the Target URI | There are two unusual cases for which the request target components | |||
| are in a method-specific form: | ||||
| Once an inbound connection is obtained, the client sends an HTTP | * For CONNECT (Section 9.3.6), the request target is the host name | |||
| request message (Section 3) with a request-target derived from the | and port number of the tunnel destination, separated by a colon. | |||
| target URI. | ||||
| Since the request-target often contains only part of the user agent's | * For OPTIONS (Section 9.3.7), the request target can be a single | |||
| target URI, a server reconstructs the intended target as an | asterisk ("*"). | |||
| "effective request URI" to properly service the request. This | ||||
| reconstruction involves both the server's local configuration and | ||||
| information communicated in the request-target, Host header field, | ||||
| and connection context. | ||||
| For a user agent, the effective request URI is the target URI. | See the respective method definitions for details. These forms MUST | |||
| NOT be used with other methods. | ||||
| Once the effective request URI has been constructed, an origin server | Upon receipt of a client's request, a server reconstructs the target | |||
| needs to decide whether or not to provide service for that URI via | URI from the received components in accordance with their local | |||
| the connection in which the request was received. For example, the | configuration and incoming connection context. This reconstruction | |||
| request might have been misdirected, deliberately or accidentally, | is specific to each major protocol version. For example, Section 3.3 | |||
| such that the information within a received request-target or Host | of [HTTP/1.1] defines how a server determines the target URI of an | |||
| header field differs from the host or port upon which the connection | HTTP/1.1 request. | |||
| has been made. If the connection is from a trusted gateway, that | ||||
| inconsistency might be expected; otherwise, it might indicate an | | *Note:* Previous specifications defined the recomposed target | |||
| attempt to bypass security filters, trick the server into delivering | | URI as a distinct concept, the _effective request URI_. | |||
| non-public content, or poison a cache. See Section 9 for security | ||||
| considerations regarding message routing. | ||||
| 7.2. Host and :authority | 7.2. Host and :authority | |||
| The "Host" header field in a request provides the host and port | The "Host" header field in a request provides the host and port | |||
| information from the target URI, enabling the origin server to | information from the target URI, enabling the origin server to | |||
| distinguish among resources while servicing requests for multiple | distinguish among resources while servicing requests for multiple | |||
| host names on a single IP address. | host names. | |||
| [new] | In HTTP/2 [HTTP/2] and HTTP/3 [HTTP/3], the Host header field is, in | |||
| some cases, supplanted by the ":authority" pseudo-header field of a | ||||
| request's control data. | ||||
| Host = uri-host [ ":" port ] ; Section 2.7.1 | Host = uri-host [ ":" port ] ; Section 4 | |||
| Since the Host field-value is critical information for handling a | The target URI's authority information is critical for handling a | |||
| request, a user agent SHOULD generate Host as the first header field | request. A user agent MUST generate a Host header field in a request | |||
| following the request-line. | unless it sends that information as an ":authority" pseudo-header | |||
| field. A user agent that sends Host SHOULD send it as the first | ||||
| field in the header section of a request. | ||||
| For example, a GET request to the origin server for | For example, a GET request to the origin server for | |||
| <http://www.example.org/pub/WWW/> would begin with: | <http://www.example.org/pub/WWW/> would begin with: | |||
| GET /pub/WWW/ HTTP/1.1 | GET /pub/WWW/ HTTP/1.1 | |||
| Host: www.example.org | Host: www.example.org | |||
| Since the Host header field acts as an application-level routing | Since the host and port information acts as an application-level | |||
| mechanism, it is a frequent target for malware seeking to poison a | routing mechanism, it is a frequent target for malware seeking to | |||
| shared cache or redirect a request to an unintended server. An | poison a shared cache or redirect a request to an unintended server. | |||
| interception proxy is particularly vulnerable if it relies on the | An interception proxy is particularly vulnerable if it relies on the | |||
| Host field-value for redirecting requests to internal servers, or for | host and port information for redirecting requests to internal | |||
| use as a cache key in a shared cache, without first verifying that | servers, or for use as a cache key in a shared cache, without first | |||
| the intercepted connection is targeting a valid IP address for that | verifying that the intercepted connection is targeting a valid IP | |||
| host. | address for that host. | |||
| 7.3. Routing Inbound | 7.3. Routing Inbound Requests | |||
| Once the target URI is determined, a client needs to decide whether a | Once the target URI and its origin are determined, a client decides | |||
| network request is necessary to accomplish the desired semantics and, | whether a network request is necessary to accomplish the desired | |||
| if so, where that request is to be directed. | semantics and, if so, where that request is to be directed. | |||
| If the client has a cache [RFC7234] and the request can be satisfied | 7.3.1. To a Cache | |||
| 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. | |||
| 7.3.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. | |||
| the client connects inbound by establishing (or reusing) a connection | ||||
| to that proxy. | If an "http" or "https" proxy is applicable, the client connects | |||
| inbound by establishing (or reusing) a connection to that proxy and | ||||
| then sending it an HTTP request message containing a request target | ||||
| that matches the client's target URI. | ||||
| 7.3.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 (specific to the target URI's scheme) to obtain access to the | |||
| directly to an authority for the target resource. How that is | identified resource. How that is accomplished is dependent on the | |||
| accomplished is dependent on the target URI scheme and defined by its | target URI scheme and defined by its associated specification. | |||
| associated specification, similar to how this specification defines | ||||
| origin server access for resolution of the "http" (Section 2.7.1) and | ||||
| "https" (Section 2.7.2) schemes. | ||||
| HTTP requirements regarding connection management are defined in | Section 4.3.2 defines how to obtain access to an "http" resource by | |||
| Section 6. | establishing (or reusing) an inbound connection to the identified | |||
| origin server and then sending it an HTTP request message containing | ||||
| a request target that matches the client's target URI. | ||||
| Section 4.3.3 defines how to obtain access to an "https" resource by | ||||
| establishing (or reusing) an inbound secured connection to an origin | ||||
| server that is authoritative for the identified origin and then | ||||
| sending it an HTTP request message containing a request target that | ||||
| matches the client's target URI. | ||||
| 7.4. Rejecting Misdirected Requests | 7.4. Rejecting Misdirected Requests | |||
| [new] | Once a request is received by a server and parsed sufficiently to | |||
| determine its target URI, the server decides whether to process the | ||||
| request itself, forward the request to another server, redirect the | ||||
| client to a different resource, respond with an error, or drop the | ||||
| connection. This decision can be influenced by anything about the | ||||
| request or connection context, but is specifically directed at | ||||
| whether the server has been configured to process requests for that | ||||
| target URI and whether the connection context is appropriate for that | ||||
| request. | ||||
| [new] | For example, a request might have been misdirected, deliberately or | |||
| accidentally, such that the information within a received Host header | ||||
| field differs from the connection's host or port. If the connection | ||||
| is from a trusted gateway, such 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 17 for security considerations regarding message | ||||
| routing. | ||||
| [new] | Unless the connection is from a trusted gateway, an origin server | |||
| MUST reject a request if any scheme-specific requirements for the | ||||
| target URI are not met. In particular, a request for an "https" | ||||
| resource MUST be rejected unless it has been received over a | ||||
| connection that has been secured via a certificate valid for that | ||||
| target URI's origin, as defined by Section 4.2.2. | ||||
| The 421 (Misdirected Request) status code in a response indicates | ||||
| that the origin server has rejected the request because it appears to | ||||
| have been misdirected (Section 15.5.20). | ||||
| 7.5. Response Correlation | 7.5. Response Correlation | |||
| [new] | A connection might be used for multiple request/response exchanges. | |||
| The mechanism used to correlate between request and response messages | ||||
| is version dependent; some versions of HTTP use implicit ordering of | ||||
| messages, while others use an explicit identifier. | ||||
| [new] | All responses, regardless of the status code (including interim | |||
| responses) can be sent at any time after a request is received, even | ||||
| if the request is not yet complete. A response can complete before | ||||
| its corresponding request is complete (Section 6.1). Likewise, | ||||
| clients are not expected to wait any specific amount of time for a | ||||
| response. Clients (including intermediaries) might abandon a request | ||||
| if the response is not forthcoming within a reasonable period of | ||||
| time. | ||||
| A client that receives a response while it is still sending the | ||||
| associated request SHOULD continue sending that request, unless it | ||||
| receives an explicit indication to the contrary (see, e.g., | ||||
| Section 9.5 of [HTTP/1.1] and Section 6.4 of [HTTP/2]). | ||||
| 7.6. Message Forwarding | 7.6. Message Forwarding | |||
| As described in Section 2.3, intermediaries can serve a variety of | As described in Section 3.7, intermediaries can serve a variety of | |||
| roles in the processing of HTTP requests and responses. Some | roles in the processing of HTTP requests and responses. Some | |||
| intermediaries are used to improve performance or availability. | intermediaries are used to improve performance or availability. | |||
| Others are used for access control or to filter content. Since an | Others are used for access control or to filter content. Since an | |||
| HTTP stream has characteristics similar to a pipe-and-filter | HTTP stream has characteristics similar to a pipe-and-filter | |||
| architecture, there are no inherent limits to the extent an | architecture, there are no inherent limits to the extent an | |||
| intermediary can enhance (or interfere) with either direction of the | intermediary can enhance (or interfere) with either direction of the | |||
| stream. | stream. | |||
| Intermediaries are expected to forward messages even when protocol | ||||
| elements are not recognized (e.g., new methods, status codes, or | ||||
| field names), since that preserves extensibility for downstream | ||||
| recipients. | ||||
| An intermediary not acting as a tunnel MUST implement the Connection | An intermediary not acting as a tunnel MUST implement the Connection | |||
| header field, as specified in Section 6.1, and exclude fields from | header field, as specified in Section 7.6.1, and exclude fields from | |||
| being forwarded that are only intended for the incoming connection. | being forwarded that are only intended for the incoming connection. | |||
| An intermediary MUST NOT forward a message to itself unless it is | An intermediary MUST NOT forward a message to itself unless it is | |||
| protected from an infinite request loop. In general, an intermediary | protected from an infinite request loop. In general, an intermediary | |||
| ought to recognize its own server names, including any aliases, local | ought to recognize its own server names, including any aliases, local | |||
| variations, or literal IP addresses, and respond to such requests | variations, or literal IP addresses, and respond to such requests | |||
| directly. | directly. | |||
| An HTTP message can be parsed as a stream for incremental processing | An HTTP message can be parsed as a stream for incremental processing | |||
| or forwarding downstream. However, recipients cannot rely on | or forwarding downstream. However, senders and recipients cannot | |||
| incremental delivery of partial messages, since some implementations | rely on incremental delivery of partial messages, since some | |||
| will buffer or delay message forwarding for the sake of network | implementations will buffer or delay message forwarding for the sake | |||
| efficiency, security checks, or payload transformations. | of network efficiency, security checks, or content transformations. | |||
| 7.6.1. Connection | 7.6.1. Connection | |||
| The "Connection" header field allows the sender to indicate desired | The "Connection" header field allows the sender to list desired | |||
| control options for the current connection. In order to avoid | control options for the current connection. | |||
| confusing downstream recipients, a proxy or gateway MUST remove or | ||||
| replace any received connection options before forwarding the | ||||
| message. | ||||
| When a header field aside from Connection is used to supply control | When a field aside from Connection is used to supply control | |||
| information for or about the current connection, the sender MUST list | information for or about the current connection, the sender MUST list | |||
| the corresponding field-name within the Connection header field. | 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. | ||||
| A proxy or gateway MUST parse a received Connection header field before a | Intermediaries MUST parse a received Connection header field before a | |||
| message is forwarded and, for each connection-option in this field, | message is forwarded and, for each connection-option in this field, | |||
| remove any header field(s) from the message with the same | remove any header or trailer field(s) from the message with the same | |||
| name as the connection-option, and then remove the Connection header | name as the connection-option, and then remove the Connection header | |||
| field itself (or replace it with the intermediary's own connection | field itself (or replace it with the intermediary's own connection | |||
| options for the forwarded message). | options for the forwarded message). | |||
| Hence, the Connection header field provides a declarative way of | Hence, the Connection header field provides a declarative way of | |||
| distinguishing header fields that are only intended for the immediate | distinguishing fields that are only intended for the immediate | |||
| recipient ("hop-by-hop") from those fields that are intended for all | recipient ("hop-by-hop") from those fields that are intended for all | |||
| recipients on the chain ("end-to-end"), enabling the message to be | recipients on the chain ("end-to-end"), enabling the message to be | |||
| self-descriptive and allowing future connection-specific extensions | self-descriptive and allowing future connection-specific extensions | |||
| to be deployed without fear that they will be blindly forwarded by | to be deployed without fear that they will be blindly forwarded by | |||
| older intermediaries. | older intermediaries. | |||
| [new] | 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: | ||||
| [new] | * Proxy-Connection (Appendix C.2.2 of [HTTP/1.1]) | |||
| [new] | * Keep-Alive (Section 19.7.1 of [RFC2068]) | |||
| [new] | * TE (Section 10.1.4) | |||
| [new] | * Transfer-Encoding (Section 6.1 of [HTTP/1.1]) | |||
| * Upgrade (Section 7.8) | ||||
| The Connection header field's value has the following grammar: | The Connection header field's value has the following grammar: | |||
| Connection = 1#connection-option | Connection = #connection-option | |||
| connection-option = token | connection-option = token | |||
| Connection options are case-insensitive. | Connection options are case-insensitive. | |||
| A sender MUST NOT send a connection option corresponding to a header | A sender MUST NOT send a connection option corresponding to a field | |||
| field that is intended for all recipients of the payload. For | that is intended for all recipients of the content. For example, | |||
| example, Cache-Control is never appropriate as a connection option | Cache-Control is never appropriate as a connection option | |||
| (Section 5.2 of [RFC7234]). | (Section 5.2 of [CACHING]). | |||
| The connection options do not always correspond to a header field | Connection options do not always correspond to a field present in the | |||
| present in the | message, since a connection-specific field might not be needed if | |||
| message, since a connection-specific header field might not be needed if | there are no parameters associated with a connection option. In | |||
| there are no parameters associated with a connection option. In | contrast, a connection-specific field received without a | |||
| contrast, a connection-specific header field that is received without a | ||||
| corresponding connection option usually indicates that the field has | corresponding connection option usually indicates that the field has | |||
| been improperly forwarded by an intermediary and ought to be ignored | been improperly forwarded by an intermediary and ought to be ignored | |||
| by the recipient. | by the recipient. | |||
| When defining new connection options, specification authors ought to | When defining a new connection option that does not correspond to a | |||
| survey existing header field names and ensure that the new connection | field, specification authors ought to reserve the corresponding field | |||
| option does not share the same name as an already deployed header | name anyway in order to avoid later collisions. Such reserved field | |||
| field. Defining a new connection option essentially reserves that | names are registered in the Hypertext Transfer Protocol (HTTP) Field | |||
| potential field-name for carrying additional information related to | Name Registry (Section 16.3.1). | |||
| the connection option, since it would be unwise for senders to use | ||||
| that field-name for anything else. | ||||
| The "close" connection option is defined for a sender to signal that | ||||
| this connection will be closed after completion of the response. For | ||||
| example, | ||||
| Connection: close | ||||
| in either the request or the response header fields indicates that | ||||
| the sender is going to close the connection after the current | ||||
| request/response is complete (Section 6.6). | ||||
| 7.6.2. Max-Forwards | 7.6.2. Max-Forwards | |||
| The "Max-Forwards" header field provides a mechanism with the TRACE | The "Max-Forwards" header field provides a mechanism with the TRACE | |||
| (Section 4.3.8) and OPTIONS (Section 4.3.7) request methods to limit | (Section 9.3.8) and OPTIONS (Section 9.3.7) request methods to limit | |||
| the number of times that the request is forwarded by proxies. This | 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 | can be useful when the client is attempting to trace a request that | |||
| appears to be failing or looping mid-chain. | appears to be failing or looping mid-chain. | |||
| Max-Forwards = 1*DIGIT | Max-Forwards = 1*DIGIT | |||
| The Max-Forwards value is a decimal integer indicating the remaining | The Max-Forwards value is a decimal integer indicating the remaining | |||
| number of times this request message can be forwarded. | number of times this request message can be forwarded. | |||
| Each intermediary that receives a TRACE or OPTIONS request containing | Each intermediary that receives a TRACE or OPTIONS request containing | |||
| a Max-Forwards header field MUST check and update its value prior to | a Max-Forwards header field MUST check and update its value prior to | |||
| forwarding the request. If the received value is zero (0), the | forwarding the request. If the received value is zero (0), the | |||
| intermediary MUST NOT forward the request; instead, the intermediary | intermediary MUST NOT forward the request; instead, the intermediary | |||
| MUST respond as the final recipient. If the received Max-Forwards | MUST respond as the final recipient. If the received Max-Forwards | |||
| value is greater than zero, the intermediary MUST generate an updated | value is greater than zero, the intermediary MUST generate an updated | |||
| Max-Forwards field in the forwarded message with a field-value that | 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) | is the lesser of a) the received value decremented by one (1) or b) | |||
| the recipient's maximum supported value for Max-Forwards. | the recipient's maximum supported value for Max-Forwards. | |||
| A recipient MAY ignore a Max-Forwards header field received with any | A recipient MAY ignore a Max-Forwards header field received with any | |||
| other request methods. | other request methods. | |||
| 7.6.3. Via | 7.6.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 = 1#( 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 7.8 | |||
| received-by = ( uri-host [ ":" port ] ) / pseudonym | received-by = pseudonym [ ":" port ] | |||
| pseudonym = token | pseudonym = token | |||
| Multiple Via field values represent each proxy or gateway that has | Each member of the Via field value represents a proxy or gateway that | |||
| forwarded the message. Each intermediary appends its own information | has forwarded the message. Each intermediary appends its own | |||
| about how the message was received, such that the end result is | information about how the message was received, such that the end | |||
| 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 2.6. | response, or within a later request, as described in Section 2.5. | |||
| 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 of the field value is normally the host and | The received-by portion is normally the host and optional port number | |||
| optional port number of a recipient server or client that | of a recipient server or client that subsequently forwarded the | |||
| subsequently forwarded the message. However, if the real host is | message. However, if the real host is considered to be sensitive | |||
| considered to be sensitive information, a sender MAY replace it with | information, a sender MAY replace it with a pseudonym. If a port is | |||
| a pseudonym. If a port is not provided, a recipient MAY interpret | not provided, a recipient MAY interpret that as meaning it was | |||
| that as meaning it was received on the default TCP port, if any, for | received on the default port, if any, for the received-protocol. | |||
| the received-protocol. | ||||
| A sender MAY generate comments in the Via header field to identify | A sender MAY generate comments to identify the software of each | |||
| the software of each recipient, analogous to the User-Agent and | recipient, analogous to the User-Agent and Server header fields. | |||
| Server header fields. However, all comments in the Via field are | However, comments in Via are optional, and a recipient MAY remove | |||
| optional, and a recipient MAY remove them prior to forwarding the | them prior to forwarding the message. | |||
| message. | ||||
| For example, a request message could be sent from an HTTP/1.0 user | For example, a request message could be sent from an HTTP/1.0 user | |||
| agent to an internal proxy code-named "fred", which uses HTTP/1.1 to | agent to an internal proxy code-named "fred", which uses HTTP/1.1 to | |||
| forward the request to a public proxy at p.example.net, which | forward the request to a public proxy at p.example.net, which | |||
| completes the request by forwarding it to the origin server at | completes the request by forwarding it to the origin server at | |||
| www.example.com. The request received by www.example.com would then | www.example.com. The request received by www.example.com would then | |||
| have the following Via header field: | have the following Via header field: | |||
| Via: 1.0 fred, 1.1 p.example.net | Via: 1.0 fred, 1.1 p.example.net | |||
| An intermediary used as a portal through a network firewall SHOULD | An intermediary used as a portal through a network firewall SHOULD | |||
| NOT forward the names and ports of hosts within the firewall region | NOT forward the names and ports of hosts within the firewall region | |||
| unless it is explicitly enabled to do so. If not enabled, such an | unless it is explicitly enabled to do so. If not enabled, such an | |||
| intermediary SHOULD replace each received-by host of any host behind | intermediary SHOULD replace each received-by host of any host behind | |||
| the firewall by an appropriate pseudonym for that host. | the firewall by an appropriate pseudonym for that host. | |||
| An intermediary MAY combine an ordered subsequence of Via header | An intermediary MAY combine an ordered subsequence of Via header | |||
| field entries into a single such entry if the entries have identical | field list members into a single member if the entries have identical | |||
| received-protocol values. For example, | received-protocol values. For example, | |||
| Via: 1.0 ricky, 1.1 ethel, 1.1 fred, 1.0 lucy | Via: 1.0 ricky, 1.1 ethel, 1.1 fred, 1.0 lucy | |||
| 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 entries 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 entries that have | replaced by pseudonyms. A sender MUST NOT combine members that have | |||
| different received-protocol values. | different received-protocol values. | |||
| 7.7. Message Transformations | 7.7. Message 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 content. 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 content 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 content received is identical to the | |||
| original. | original. | |||
| 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 request-target with a host name that is not a | If a proxy receives a target URI with a host name that is not a fully | |||
| fully qualified domain name, it MAY add its own domain to the host | qualified domain name, it MAY add its own domain to the host name it | |||
| name it received when forwarding the request. A proxy MUST NOT | received when forwarding the request. A proxy MUST NOT change the | |||
| change the host name if the request-target contains a fully qualified | host name if the target URI contains a fully qualified domain name. | |||
| 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 request-target when forwarding it to the next inbound | received target URI when forwarding it to the next inbound server | |||
| server, except as noted above to replace an empty path with "/" or | except as required by that forwarding protocol. For example, a proxy | |||
| "*". | forwarding a request to an origin server via HTTP/1.1 will replace an | |||
| empty path with "/" (Section 3.2.1 of [HTTP/1.1]) or "*" | ||||
| A proxy MAY modify the message body through application or removal of | (Section 3.2.4 of [HTTP/1.1]), depending on the request method. | |||
| a transfer coding (Section 4). | ||||
| A proxy MUST NOT transform the payload (Section 3.3 of [RFC7231]) of | A proxy MUST NOT transform the content (Section 6.4) of a message | |||
| a message that contains a no-transform cache-control directive | that contains a no-transform cache-control response directive | |||
| (Section 5.2 of [RFC7234]). | (Section 5.2 of [CACHING]). Note that this does not include changes | |||
| to the message body that do not affect the content, such as transfer | ||||
| codings (Section 7 of [HTTP/1.1]). | ||||
| A proxy MAY transform the payload of a message that does not contain | A proxy MAY transform the content of a message that does not contain | |||
| a no-transform cache-control directive. A proxy that transforms a | a no-transform cache-control directive. A proxy that transforms the | |||
| payload MUST add a Warning header field with the warn-code of 214 | content of a 200 (OK) response can inform downstream recipients that | |||
| ("Transformation Applied") if one is not already in the message (see | a transformation has been applied by changing the response status | |||
| Section 5.5 of [RFC7234]). A proxy that transforms the payload of a | code to 203 (Non-Authoritative Information) (Section 15.3.4). | |||
| 200 (OK) response can further inform downstream recipients that a | ||||
| transformation has been applied by changing the response status code | ||||
| to 203 (Non-Authoritative Information) (Section 6.3.4 of [RFC7231]). | ||||
| 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 content) 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. | |||
| 7.8. Upgrade | 7.8. 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. A client MAY send a list of protocols in the Upgrade | connection. | |||
| header field of a request to invite the server to switch to one or | ||||
| more of those protocols, in order of descending preference, before | 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 | ||||
| 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 | |||
| that connection. Upgrade cannot be used to insist on a protocol | that connection. Upgrade cannot be used to insist on a protocol | |||
| change. | change. | |||
| Upgrade = 1#protocol | Upgrade = #protocol | |||
| protocol = protocol-name ["/" protocol-version] | protocol = protocol-name ["/" protocol-version] | |||
| protocol-name = token | protocol-name = token | |||
| protocol-version = token | protocol-version = token | |||
| Although protocol names are registered with a preferred case, | ||||
| recipients SHOULD use case-insensitive comparison when matching each | ||||
| protocol-name to supported protocols. | ||||
| A server that sends a 101 (Switching Protocols) response MUST send an | A server that sends a 101 (Switching Protocols) response MUST send an | |||
| Upgrade header field to indicate the new protocol(s) to which the | Upgrade header field to indicate the new protocol(s) to which the | |||
| connection is being switched; if multiple protocol layers are being | connection is being switched; if multiple protocol layers are being | |||
| switched, the sender MUST list the protocols in layer-ascending | switched, the sender MUST list the protocols in layer-ascending | |||
| order. A server MUST NOT switch to a protocol that was not indicated | order. A server MUST NOT switch to a protocol that was not indicated | |||
| by the client in the corresponding request's Upgrade header field. A | by the client in the corresponding request's Upgrade header field. A | |||
| server MAY choose to ignore the order of preference indicated by the | server MAY choose to ignore the order of preference indicated by the | |||
| client and select the new protocol(s) based on other factors, such as | client and select the new protocol(s) based on other factors, such as | |||
| the nature of the request or the current load on the server. | the nature of the request or the current load on the server. | |||
| skipping to change at line 2246 ¶ | skipping to change at page 62, line 44 ¶ | |||
| Upgrade header field to indicate the acceptable protocols, in order | Upgrade header field to indicate the acceptable protocols, in order | |||
| of descending preference. | of descending preference. | |||
| A server MAY send an Upgrade header field in any other response to | A server MAY send an Upgrade header field in any other response to | |||
| advertise that it implements support for upgrading to the listed | advertise that it implements support for upgrading to the listed | |||
| protocols, in order of descending preference, when appropriate for a | protocols, in order of descending preference, when appropriate for a | |||
| future request. | future request. | |||
| The following is a hypothetical example sent by a client: | The following is a hypothetical example sent by a client: | |||
| GET /hello.txt HTTP/1.1 | GET /hello HTTP/1.1 | |||
| Host: www.example.com | Host: www.example.com | |||
| Connection: upgrade | Connection: upgrade | |||
| Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 | Upgrade: websocket, IRC/6.9, RTA/x11 | |||
| The capabilities and nature of the application-level communication | The capabilities and nature of the application-level communication | |||
| after the protocol change is entirely dependent upon the new | after the protocol change is entirely dependent upon the new | |||
| protocol(s) chosen. However, immediately after sending the 101 | protocol(s) chosen. However, immediately after sending the 101 | |||
| (Switching Protocols) response, the server is expected to continue | (Switching Protocols) response, the server is expected to continue | |||
| responding to the original request as if it had received its | responding to the original request as if it had received its | |||
| equivalent within the new protocol (i.e., the server still has an | equivalent within the new protocol (i.e., the server still has an | |||
| outstanding request to satisfy after the protocol has been changed, | outstanding request to satisfy after the protocol has been changed, | |||
| and is expected to do so without requiring the request to be | and is expected to do so without requiring the request to be | |||
| repeated). | repeated). | |||
| skipping to change at line 2274 ¶ | skipping to change at page 63, line 23 ¶ | |||
| follows that with the new protocol's equivalent of a response to a | follows that with the new protocol's equivalent of a response to a | |||
| GET on the target resource. This allows a connection to be upgraded | GET on the target resource. This allows a connection to be upgraded | |||
| to protocols with the same semantics as HTTP without the latency cost | to protocols with the same semantics as HTTP without the latency cost | |||
| of an additional round trip. A server MUST NOT switch protocols | of an additional round trip. A server MUST NOT switch protocols | |||
| unless the received message semantics can be honored by the new | unless the received message semantics can be honored by the new | |||
| protocol; an OPTIONS request can be honored by any protocol. | protocol; an OPTIONS request can be honored by any protocol. | |||
| The following is an example response to the above hypothetical | The following is an example response to the above hypothetical | |||
| request: | request: | |||
| HTTP/1.1 101 Switching Protocols | HTTP/1.1 101 Switching Protocols | |||
| Connection: upgrade | Connection: upgrade | |||
| Upgrade: HTTP/2.0 | Upgrade: websocket | |||
| [... data stream switches to HTTP/2.0 with an appropriate response | [... data stream switches to websocket with an appropriate response | |||
| (as defined by new protocol) to the "GET /hello.txt" request ...] | (as defined by new protocol) to the "GET /hello" request ...] | |||
| When Upgrade is sent, the sender MUST also send a Connection header | A sender of Upgrade MUST also send an "Upgrade" connection option in | |||
| field (Section 6.1) that contains an "upgrade" connection option, in | the Connection header field (Section 7.6.1) to inform intermediaries | |||
| order to prevent Upgrade from being accidentally forwarded by | not to forward this field. A server that receives an Upgrade header | |||
| intermediaries that might not implement the listed protocols. A | field in an HTTP/1.0 request MUST ignore that Upgrade field. | |||
| server MUST ignore an Upgrade header field that is received in an | ||||
| 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 5.1.1 of [RFC7231]), the | the "100-continue" expectation (Section 10.1.1), the server MUST send | |||
| server MUST send a 100 (Continue) response before sending a 101 | a 100 (Continue) response before sending a 101 (Switching Protocols) | |||
| (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 6.4 of [RFC7231]). | (Section 15.4). | |||
| 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 2.6 and future updates to this | version rules of Section 2.5 and future updates to this | |||
| specification. Additional tokens ought to be registered with IANA | specification. Additional protocol names ought to be registered | |||
| using the registration procedure defined in Section 8.6. | using the registration procedure defined in Section 16.7. | |||
| 8. Representation Data and Metadata | 8. Representation Data and Metadata | |||
| 8.1. Representation Data | 8.1. Representation 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 content of the message or referred to by the message | |||
| message semantics and the effective request URI. The representation | semantics and the target URI. The representation data is in a format | |||
| data is in a format and encoding defined by the representation | and encoding defined by the representation metadata header fields. | |||
| metadata header 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( data ) ) | |||
| 8.2. Representation Metadata | 8.2. Representation Metadata | |||
| Representation header fields provide metadata about the | Representation header fields provide metadata about the | |||
| representation. When a message includes a payload body, the | representation. When a message includes content, the representation | |||
| representation header fields describe how to interpret the | header fields describe how to interpret that data. In a response to | |||
| representation data enclosed in the payload body. In a response to a | a HEAD request, the representation header fields describe the | |||
| HEAD request, the representation header fields describe the | representation data that would have been enclosed in the content if | |||
| representation data that would have been enclosed in the payload body | the same request had been a GET. | |||
| if the same request had been a GET. | ||||
| The following header fields convey representation metadata: | ||||
| 8.3. Content-Type | 8.3. Content-Type | |||
| The "Content-Type" header field indicates the media type of the | The "Content-Type" header field indicates the media type of the | |||
| associated representation: either the representation enclosed in the | associated representation: either the representation enclosed in the | |||
| message payload or the selected representation, as determined by the | message content or the selected representation, as determined by the | |||
| message semantics. The indicated media type defines both the data | message semantics. The indicated media type defines both the data | |||
| format and how that data is intended to be processed by a recipient, | format and how that data is intended to be processed by a recipient, | |||
| within the scope of the received message semantics, after any content | within the scope of the received message semantics, after any content | |||
| codings indicated by Content-Encoding are decoded. | codings indicated by Content-Encoding are decoded. | |||
| Content-Type = media-type | Content-Type = media-type | |||
| Media types are defined in Section 3.1.1.1. An example of the field | Media types are defined in Section 8.3.1. An example of the field is | |||
| is | ||||
| Content-Type: text/html; charset=ISO-8859-4 | ||||
| A sender that generates a message containing a payload body SHOULD | Content-Type: text/html; charset=ISO-8859-4 | |||
| generate a Content-Type header field in that message unless the | A sender that generates a message containing content SHOULD generate | |||
| intended media type of the enclosed representation is unknown to the | a Content-Type header field in that message unless the intended media | |||
| sender. If a Content-Type header field is not present, the recipient | type of the enclosed representation is unknown to the sender. If a | |||
| MAY either assume a media type of "application/octet-stream" | Content-Type header field is not present, the recipient MAY either | |||
| ([RFC2046], Section 4.5.1) or examine the data to determine its type. | 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 | In practice, resource owners do not always properly configure their | |||
| origin server to provide the correct Content-Type for a given | origin server to provide the correct Content-Type for a given | |||
| representation, with the result that some clients will examine a | representation. Some user agents examine the content and, in certain | |||
| payload's content and override the specified type. Clients that do | cases, override the received type (for example, see [Sniffing]). | |||
| so risk drawing incorrect conclusions, which might expose additional | This "MIME sniffing" risks drawing incorrect conclusions about the | |||
| security risks (e.g., "privilege escalation"). Furthermore, it is | data, which might expose the user to additional security risks (e.g., | |||
| impossible to determine the sender's intent by examining the data | "privilege escalation"). Furthermore, distinct media types often | |||
| format: many data formats match multiple media types that differ only | share a common data format, differing only in how the data is | |||
| in processing semantics. Implementers are encouraged to provide a | intended to be processed, which is impossible to distinguish by | |||
| means of disabling such "content sniffing" when it is used. | inspecting the data alone. When sniffing is implemented, | |||
| implementers are encouraged to provide a means for the user to | ||||
| disable it. | ||||
| 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, leading to potential interoperability and | ||||
| security issues if different implementations have different error | ||||
| handling behaviors. | ||||
| 8.3.1. Media Type | 8.3.1. Media Type | |||
| HTTP uses Internet media types [RFC2046] in the Content-Type | HTTP uses media types [RFC2046] in the Content-Type (Section 8.3) and | |||
| (Section 3.1.1.5) and Accept (Section 5.3.2) header fields in order | Accept (Section 12.5.1) header fields in order to provide open and | |||
| to provide open and extensible data typing and type negotiation. | extensible data typing and type negotiation. Media types define both | |||
| Media types define both a data format and various processing models: | a data format and various processing models: how to process that data | |||
| how to process that data in accordance with each context in which it | in accordance with the message context. | |||
| is received. | ||||
| media-type = type "/" subtype *( OWS ";" OWS parameter ) | media-type = type "/" subtype parameters | |||
| type = token | type = token | |||
| subtype = token | subtype = token | |||
| The type/subtype MAY be followed by parameters in the form of | The type and subtype tokens are case-insensitive. | |||
| name=value pairs. | ||||
| The type, subtype, and parameter name tokens are case-insensitive. | The type/subtype MAY be followed by semicolon-delimited parameters | |||
| Parameter values might or might not be case-sensitive, depending on | (Section 5.6.6) in the form of name=value pairs. The presence or | |||
| the semantics of the parameter name. The presence or absence of a | absence of a parameter might be significant to the processing of a | |||
| parameter might be significant to the processing of a media-type, | media type, depending on its definition within the media type | |||
| depending on its definition within the media type registry. | registry. Parameter values might or might not be case-sensitive, | |||
| depending on the semantics of the parameter name. | ||||
| For example, the following | For example, the following media types are equivalent in describing | |||
| examples are all equivalent, but the first is preferred for | HTML text data encoded in the UTF-8 character encoding scheme, but | |||
| consistency: | the first is preferred for consistency (the "charset" parameter value | |||
| 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 | ||||
| Internet media types ought to be registered with IANA according to | Media types ought to be registered with IANA according to the | |||
| the procedures defined in [BCP13]. | procedures defined in [BCP13]. | |||
| 8.3.2. Charset | 8.3.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 ([RFC6365], Section 1.3) of a textual representation. | |||
| identified by a case-insensitive token. | In the fields defined by this document, charset names appear either | |||
| in parameters (Content-Type), or, for Accept-Encoding, in the form of | ||||
| charset = token | a plain token. In both cases, charset names are matched case- | |||
| insensitively. | ||||
| Charset names ought to be registered in the IANA "Character Sets" | Charset names ought to be registered in the IANA "Character Sets" | |||
| registry (<http://www.iana.org/assignments/character-sets>) according | registry (<https://www.iana.org/assignments/character-sets>) | |||
| to the procedures defined in [RFC2978]. | according to the procedures defined in Section 2 of [RFC2978]. | |||
| 8.3.3. Canonicalization and Text Defaults | ||||
| Internet media types are registered with a canonical form in order to | ||||
| be interoperable among systems with varying native encoding formats. | ||||
| Representations selected or transferred via HTTP ought to be in | ||||
| canonical form, for many of the same reasons described by the | ||||
| Multipurpose Internet Mail Extensions (MIME) [RFC2045]. However, the | ||||
| performance characteristics of email deployments (i.e., store and | ||||
| forward messages to peers) are significantly different from those | ||||
| common to HTTP and the Web (server-based information services). | ||||
| Furthermore, MIME's constraints for the sake of compatibility with | ||||
| older mail transfer protocols do not apply to HTTP (see Appendix A). | ||||
| MIME's canonical form requires that media subtypes of the "text" type | ||||
| use CRLF as the text line break. HTTP allows the transfer of text | ||||
| media with plain CR or LF alone representing a line break, when such | ||||
| line breaks are consistent for an entire representation. An HTTP | ||||
| sender MAY generate, and a recipient MUST be able to parse, line | ||||
| breaks in text media that consist of CRLF, bare CR, or bare LF. In | ||||
| addition, text media in HTTP is not limited to charsets that use | ||||
| octets 13 and 10 for CR and LF, respectively. This flexibility | ||||
| regarding line breaks applies only to text within a representation | ||||
| that has been assigned a "text" media type; it does not apply to | ||||
| "multipart" types or HTTP elements outside the payload body (e.g., | ||||
| header fields). | ||||
| If a representation is encoded with a content-coding, the underlying | | *Note:* In theory, charset names are defined by the "mime- | |||
| data ought to be in a form defined above prior to being encoded. | | charset" ABNF rule defined in Section 2.3 of [RFC2978] (as | |||
| | corrected in [Err1912]). That rule allows two characters that | ||||
| | are not included in "token" ("{" and "}"), but no charset name | ||||
| | registered at the time of this writing includes braces (see | ||||
| | [Err5433]). | ||||
| 8.3.4. Multipart Types | 8.3.3. 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 content. 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 [RFC2388], 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 [RFC7233]. | (Partial Content) responses (see Section 15.3.7). | |||
| 8.4. Content-Encoding | 8.4. 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 = 1#content-coding | Content-Encoding = #content-coding | |||
| An example of its use is | An example of its use is | |||
| Content-Encoding: gzip | Content-Encoding: gzip | |||
| If one or more encodings have been applied to a representation, the | If one or more encodings have been applied to a representation, the | |||
| sender that applied the encodings MUST generate a Content-Encoding | sender that applied the encodings MUST generate a Content-Encoding | |||
| header field that lists the content codings in the order in which | header field that lists the content codings in the order in which | |||
| they were applied. Additional information about the encoding | they were applied. Note that the coding named "identity" is reserved | |||
| parameters can be provided by other header fields not defined by this | for its special role in Accept-Encoding, and thus SHOULD NOT be | |||
| specification. | included. | |||
| [new] | Additional information about the encoding parameters can be provided | |||
| by other header fields not defined by this specification. | ||||
| Unlike Transfer-Encoding (Section 3.3.1 of [RFC7230]), the codings | Unlike Transfer-Encoding (Section 6.1 of [HTTP/1.1]), the codings | |||
| listed in Content-Encoding are a characteristic of the | listed in Content-Encoding are a characteristic of the | |||
| representation; the representation is defined in terms of the coded | representation; the representation is defined in terms of the coded | |||
| form, and all other metadata about the representation is about the | form, and all other metadata about the representation is about the | |||
| coded form unless otherwise noted in the metadata definition. | coded form unless otherwise noted in the metadata definition. | |||
| Typically, the representation is only decoded just prior to rendering | Typically, the representation is only decoded just prior to rendering | |||
| or analogous usage. | or analogous usage. | |||
| If the media type includes an inherent encoding, such as a data | If the media type includes an inherent encoding, such as a data | |||
| format that is always compressed, then that encoding would not be | format that is always compressed, then that encoding would not be | |||
| restated in Content-Encoding even if it happens to be the same | restated in Content-Encoding even if it happens to be the same | |||
| skipping to change at line 2525 ¶ | skipping to change at page 68, line 26 ¶ | |||
| Content coding values indicate an encoding transformation that has | Content coding values indicate an encoding transformation that has | |||
| been or can be applied to a representation. Content codings are | been or can be applied to a representation. Content codings are | |||
| primarily used to allow a representation to be compressed or | primarily used to allow a representation to be compressed or | |||
| otherwise usefully transformed without losing the identity of its | otherwise usefully transformed without losing the identity of its | |||
| underlying media type and without loss of information. Frequently, | underlying media type and without loss of information. Frequently, | |||
| the representation is stored in coded form, transmitted directly, and | the representation is stored in coded form, transmitted directly, and | |||
| only decoded by the final recipient. | only decoded by the final recipient. | |||
| content-coding = token | content-coding = token | |||
| All content-coding values are case-insensitive and ought to be | All content codings are case-insensitive and ought to be registered | |||
| registered within the "HTTP Content Coding Registry", as defined in | within the "HTTP Content Coding Registry", as described in | |||
| Section 8.4. | Section 16.6 | |||
| The following content-coding values are defined by this | ||||
| specification: | ||||
| compress (and x-compress): See Section 4.2.1 of [RFC7230]. | ||||
| deflate: See Section 4.2.2 of [RFC7230]. | ||||
| gzip (and x-gzip): See Section 4.2.3 of [RFC7230]. | ||||
| The codings defined below can be used to compress the payload of a | Content-coding values are used in the Accept-Encoding | |||
| message. They are used in the Accept-Encoding | (Section 12.5.3) and Content-Encoding (Section 8.4) header fields. | |||
| (Section 5.3.4) and Content-Encoding (Section 3.1.2.2) header fields. | ||||
| 8.4.1.1. Compress Coding | 8.4.1.1. Compress Coding | |||
| The "compress" coding is an adaptive Lempel-Ziv-Welch (LZW) coding | The "compress" coding is an adaptive Lempel-Ziv-Welch (LZW) coding | |||
| [Welch] that is commonly produced by the UNIX file compression | [Welch] that is commonly produced by the UNIX file compression | |||
| program "compress". A recipient SHOULD consider "x-compress" to be | program "compress". A recipient SHOULD consider "x-compress" to be | |||
| equivalent to "compress". | equivalent to "compress". | |||
| 8.4.1.2. Deflate Coding | 8.4.1.2. Deflate Coding | |||
| The "deflate" coding is a "zlib" data format [RFC1950] containing a | The "deflate" coding is a "zlib" data format [RFC1950] containing a | |||
| "deflate" compressed data stream [RFC1951] that uses a combination of | "deflate" compressed data stream [RFC1951] that uses a combination of | |||
| the Lempel-Ziv (LZ77) compression algorithm and Huffman coding. | the Lempel-Ziv (LZ77) compression algorithm and Huffman coding. | |||
| Note: Some non-conformant implementations send the "deflate" | | *Note:* Some non-conformant implementations send the "deflate" | |||
| compressed data without the zlib wrapper. | | compressed data without the zlib wrapper. | |||
| 8.4.1.3. Gzip Coding | 8.4.1.3. Gzip Coding | |||
| The "gzip" coding is an LZ77 coding with a 32-bit Cyclic Redundancy | The "gzip" coding is an LZ77 coding with a 32-bit Cyclic Redundancy | |||
| Check (CRC) that is commonly produced by the gzip file compression | Check (CRC) that is commonly produced by the gzip file compression | |||
| program [RFC1952]. A recipient SHOULD consider "x-gzip" to be | program [RFC1952]. A recipient SHOULD consider "x-gzip" to be | |||
| equivalent to "gzip". | equivalent to "gzip". | |||
| 8.5. Content-Language | 8.5. 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 = 1#language-tag | Content-Language = #language-tag | |||
| Language tags are defined in Section 3.1.3.1. The primary purpose of | Language tags are defined in Section 8.5.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, | |||
| or that the sender does not know for which language it is intended. | or that the sender does not know for which language it is intended. | |||
| Multiple languages MAY be listed for content that is intended for | Multiple languages MAY be listed for content that is intended for | |||
| multiple audiences. For example, a rendition of the "Treaty of | multiple audiences. For example, a rendition of the "Treaty of | |||
| Waitangi", presented simultaneously in the original Maori and English | Waitangi", presented simultaneously in the original Maori and English | |||
| versions, would call for | versions, would call for | |||
| Content-Language: mi, en | Content-Language: mi, en | |||
| 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 | Content-Language MAY be applied to any media type - it is not limited | |||
| limited to textual documents. | to textual documents. | |||
| 8.5.1. Language Tags | 8.5.1. Language Tags | |||
| A language tag, as defined in [RFC5646], identifies a natural | A language tag, as defined in [RFC5646], identifies a natural | |||
| language spoken, written, or otherwise conveyed by human beings for | language spoken, written, or otherwise conveyed by human beings for | |||
| communication of information to other human beings. Computer | communication of information to other human beings. Computer | |||
| languages are explicitly excluded. | languages are explicitly excluded. | |||
| HTTP uses language tags within the Accept-Language and | HTTP uses language tags within the Accept-Language and | |||
| Content-Language header fields. Accept-Language uses the broader | Content-Language header fields. Accept-Language uses the broader | |||
| language-range production defined in Section 5.3.5, whereas | language-range production defined in Section 12.5.4, whereas | |||
| Content-Language uses the language-tag production defined below. | Content-Language uses the language-tag production defined below. | |||
| language-tag = <Language-Tag, see [RFC5646], Section 2.1> | language-tag = <Language-Tag, see [RFC5646], Section 2.1> | |||
| A language tag is a sequence of one or more case-insensitive subtags, | A language tag is a sequence of one or more case-insensitive subtags, | |||
| each separated by a hyphen character ("-", %x2D). In most cases, a | each separated by a hyphen character ("-", %x2D). In most cases, a | |||
| language tag consists of a primary language subtag that identifies a | language tag consists of a primary language subtag that identifies a | |||
| broad family of related languages (e.g., "en" = English), which is | broad family of related languages (e.g., "en" = English), which is | |||
| optionally followed by a series of subtags that refine or narrow that | optionally followed by a series of subtags that refine or narrow that | |||
| language's range (e.g., "en-CA" = the variety of English as | language's range (e.g., "en-CA" = the variety of English as | |||
| communicated in Canada). Whitespace is not allowed within a language | communicated in Canada). Whitespace is not allowed within a language | |||
| tag. Example tags include: | tag. Example tags include: | |||
| fr, en-US, es-419, az-Arab, x-pig-latin, man-Nkoo-GN | fr, en-US, es-419, az-Arab, x-pig-latin, man-Nkoo-GN | |||
| See [RFC5646] for further information. | See [RFC5646] for further information. | |||
| 8.6. Content-Length | 8.6. Content-Length | |||
| The "Content-Length" header field indicates the associated | ||||
| representation's data length as a decimal non-negative integer number | ||||
| of octets. When transferring a representation as content, Content- | ||||
| Length refers specifically to the amount of data enclosed so that it | ||||
| can be used to delimit framing (e.g., Section 6.2 of [HTTP/1.1]). In | ||||
| other cases, Content-Length indicates the selected representation's | ||||
| current length, which can be used by recipients to estimate transfer | ||||
| time or compare to previously stored representations. | ||||
| Content-Length = 1*DIGIT | Content-Length = 1*DIGIT | |||
| An example is | An example is | |||
| Content-Length: 3495 | Content-Length: 3495 | |||
| A sender MUST NOT send a Content-Length header field in any message | ||||
| that contains a Transfer-Encoding header field. | ||||
| A user agent SHOULD send a Content-Length in a request message when | A user agent SHOULD send Content-Length in a request when the method | |||
| no Transfer-Encoding is sent and the request method defines a meaning | defines a meaning for enclosed content and it is not sending | |||
| for an enclosed payload body. For example, a Content-Length header | Transfer-Encoding. For example, a user agent normally sends Content- | |||
| field is normally sent in a POST request even when the value is 0 | Length in a POST request even when the value is 0 (indicating empty | |||
| (indicating an empty payload body). A user agent SHOULD NOT send a | content). A user agent SHOULD NOT send a Content-Length header field | |||
| Content-Length header field when the request message does not contain | when the request message does not contain content and the method | |||
| a payload body and the method semantics do not anticipate such a | semantics do not anticipate such data. | |||
| 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 4.3.2 of [RFC7231]); a server MUST NOT send | HEAD request (Section 9.3.2); a server MUST NOT send Content-Length | |||
| Content-Length in such a response unless its field-value equals the | in such a response unless its field value equals the decimal number | |||
| decimal number of octets that would have been sent in the payload | of octets that would have been sent in the content of a response if | |||
| body of a response if the same request had used the GET method. | 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 4.1 of | Modified) response to a conditional GET request (Section 15.4.5); a | |||
| [RFC7232]); a server MUST NOT send Content-Length in such a response | server MUST NOT send Content-Length in such a response unless its | |||
| unless its field-value equals the decimal number of octets that would | field value equals the decimal number of octets that would have been | |||
| have been sent in the payload body of a 200 (OK) response to the same | sent in the content of a 200 (OK) response to the same request. | |||
| 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 4.3.6 of | (Successful) response to a CONNECT request (Section 9.3.6). | |||
| [RFC7231]). | ||||
| Aside from the cases defined above, in the absence of | Aside from the cases defined above, in the absence of Transfer- | |||
| Transfer-Encoding, an origin server SHOULD send a Content-Length | Encoding, an origin server SHOULD send a Content-Length header field | |||
| header field when the payload body size is known prior to sending the | when the content size is known prior to sending the complete header | |||
| complete header section. This will allow downstream recipients to | section. This will allow downstream recipients to measure transfer | |||
| measure transfer progress, know when a received message is complete, | progress, know when a received message is complete, and potentially | |||
| and potentially reuse the connection for additional requests. | 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 content, | |||
| payload, a recipient MUST anticipate potentially large decimal | a recipient MUST anticipate potentially large decimal numerals and | |||
| numerals and prevent parsing errors due to integer conversion | prevent parsing errors due to integer conversion overflows or | |||
| overflows (Section 9.3). | precision loss due to integer conversion (Section 17.5). | |||
| If a message is received that has multiple Content-Length header | Because Content-Length is used for message delimitation in HTTP/1.1, | |||
| fields with field-values consisting of the same decimal value, or a | its field value can impact how the message is parsed by downstream | |||
| single Content-Length header field with a field value containing a | recipients even when the immediate connection is not using HTTP/1.1. | |||
| list of identical decimal values (e.g., "Content-Length: 42, 42"), | If the message is forwarded by a downstream intermediary, a Content- | |||
| indicating | Length field value that is inconsistent with the received message | |||
| that duplicate Content-Length header fields have been generated or | framing might cause a security failure due to request smuggling or | |||
| combined by an upstream message processor, then the recipient MUST | response splitting. | |||
| either reject the message as invalid or replace the duplicated | ||||
| field-values with a single valid Content-Length field containing that | As a result, a sender MUST NOT forward a message with a Content- | |||
| decimal value prior to determining the message body length or | Length header field value that is known to be incorrect. | |||
| forwarding the message. | ||||
| Likewise, a sender MUST NOT forward a message with a Content-Length | ||||
| header field value that does not match the ABNF above, with one | ||||
| exception: A recipient of a Content-Length header field value | ||||
| consisting of the same decimal value repeated as a comma-separated | ||||
| list (e.g, "Content-Length: 42, 42"), MAY either reject the message | ||||
| as invalid or replace that invalid field value with a single instance | ||||
| of the decimal value, since this likely indicates that a duplicate | ||||
| was generated or combined by an upstream message processor. | ||||
| 8.7. Content-Location | 8.7. 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 content. 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 content in this message. | |||
| Content-Location = absolute-URI / partial-URI | Content-Location = absolute-URI / partial-URI | |||
| [new] | 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 ([URI], Section 5). | ||||
| The Content-Location value is not a replacement for the effective | The Content-Location value is not a replacement for the target URI | |||
| Request URI (Section 5.5 of [RFC7230]). It is representation | (Section 7.1). It is representation metadata. It has the same | |||
| metadata. It has the same syntax and semantics as the header field | syntax and semantics as the header field of the same name defined for | |||
| of the same name defined for MIME body parts in Section 4 of | MIME body parts in Section 4 of [RFC2557]. However, its appearance | |||
| [RFC2557]. However, its appearance in an HTTP message has some | in an HTTP message has some special implications for HTTP recipients. | |||
| 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 effective request URI, then the recipient | URI that is the same as the target URI, then the recipient MAY | |||
| MAY consider the payload to be a current representation of that | consider the content to be a current representation of that resource | |||
| resource at the time indicated by the message origination date. For | at the time indicated by the message origination date. For a GET | |||
| a GET (Section 4.3.1) or HEAD (Section 4.3.2) request, this is the | (Section 9.3.1) or HEAD (Section 9.3.2) request, this is the same as | |||
| same as the default semantics when no Content-Location is provided by | the default semantics when no Content-Location is provided by the | |||
| the server. For a state-changing request like PUT (Section 4.3.4) or | server. For a state-changing request like PUT (Section 9.3.4) or | |||
| POST (Section 4.3.3), it implies that the server's response contains | POST (Section 9.3.3), it implies that the server's response contains | |||
| the new representation of that resource, thereby distinguishing it | the new representation of that resource, thereby distinguishing it | |||
| from representations that might only report about the action (e.g., | from representations that might only report about the action (e.g., | |||
| "It worked!"). This allows authoring applications to update their | "It worked!"). This allows authoring applications to update their | |||
| local copies without the need for a subsequent GET request. | local copies without the need for a subsequent GET request. | |||
| If Content-Location is included in a 2xx (Successful) response | If Content-Location is included in a 2xx (Successful) response | |||
| message and its field-value refers to a URI that differs from the | message and its field value refers to a URI that differs from the | |||
| effective request URI, then the origin server claims that the URI is | target URI, then the origin server claims that the URI is an | |||
| an identifier for a different resource corresponding to the enclosed | identifier for a different resource corresponding to the enclosed | |||
| representation. Such a claim can only be trusted if both identifiers | representation. Such a claim can only be trusted if both identifiers | |||
| share the same resource owner, which cannot be programmatically | share the same resource owner, which cannot be programmatically | |||
| determined via HTTP. | determined via HTTP. | |||
| o For a response to a GET or HEAD request, this is an indication | * For a response to a GET or HEAD request, this is an indication | |||
| that the effective request URI refers to a resource that is | that the target URI refers to a resource that is subject to | |||
| subject to content negotiation and the Content-Location | content negotiation and the Content-Location field value is a more | |||
| field-value is a more specific identifier for the selected | specific identifier for the selected representation. | |||
| representation. | ||||
| o For a 201 (Created) response to a state-changing method, a | * For a 201 (Created) response to a state-changing method, a | |||
| Content-Location field-value that is identical to the Location | Content-Location field value that is identical to the Location | |||
| field-value indicates that this payload is a current | field value indicates that this content is a current | |||
| representation of the newly created resource. | representation of the newly created resource. | |||
| o Otherwise, such a Content-Location indicates that this payload is | * Otherwise, such a Content-Location indicates that this content is | |||
| a representation reporting on the requested action's status and | a representation reporting on the requested action's status and | |||
| that the same report is available (for future access with GET) at | that the same report is available (for future access with GET) at | |||
| the given URI. For example, a purchase transaction made via a | the given URI. For example, a purchase transaction made via a | |||
| POST request might include a receipt document as the payload of | POST request might include a receipt document as the content of | |||
| the 200 (OK) response; the Content-Location field-value provides | the 200 (OK) response; the Content-Location field value provides | |||
| an identifier for retrieving a copy of that same receipt in the | an identifier for retrieving a copy of that same receipt in the | |||
| future. | future. | |||
| A user agent that sends Content-Location in a request message is | A user agent that sends Content-Location in a request message is | |||
| stating that its value refers to where the user agent originally | stating that its value refers to where the user agent originally | |||
| obtained the content of the enclosed representation (prior to any | obtained the content of the enclosed representation (prior to any | |||
| modifications made by that user agent). In other words, the user | modifications made by that user agent). In other words, the user | |||
| agent is providing a back link to the source of the original | agent is providing a back link to the source of the original | |||
| representation. | representation. | |||
| skipping to change at line 2781 ¶ | skipping to change at page 74, line 5 ¶ | |||
| 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. | |||
| 8.8. Validator Header Fields | 8.8. Validator Fields | |||
| Validator header fields convey metadata about the selected | Resource metadata is referred to as a _validator_ if it can be used | |||
| representation (Section 3). In responses to safe requests, validator | within a precondition (Section 13.1) to make a conditional request | |||
| fields describe the selected representation chosen by the origin | (Section 13). Validator fields convey a current validator for the | |||
| server while handling the response. Note that, depending on the | selected representation (Section 3.2). | |||
| status code semantics, the selected representation for a given | ||||
| response is not necessarily the same as the representation enclosed | In responses to safe requests, validator fields describe the selected | |||
| as response payload. | representation chosen by the origin server while handling the | |||
| response. Note that, depending on the method and status code | ||||
| semantics, the selected representation for a given response is not | ||||
| necessarily the same as the representation enclosed as response | ||||
| content. | ||||
| In a successful response to a state-changing request, validator | In a successful response to a state-changing request, validator | |||
| fields describe the new representation that has replaced the prior | fields describe the new representation that has replaced the prior | |||
| selected representation as a result of processing the request. | selected representation as a result of processing the request. | |||
| For example, an ETag header field in a 201 (Created) response | For example, an ETag field in a 201 (Created) response communicates | |||
| communicates the entity-tag of the newly created resource's | the entity-tag of the newly created resource's representation, so | |||
| representation, so that it can be used in later conditional requests | that the entity-tag can be used as a validator in later conditional | |||
| to prevent the "lost update" problem [RFC7232]. | requests to prevent the "lost update" problem. | |||
| This specification defines two forms of metadata that are commonly | This specification defines two forms of metadata that are commonly | |||
| used to observe resource state and test for preconditions: | used to observe resource state and test for preconditions: | |||
| modification dates (Section 2.2) and opaque entity tags | modification dates (Section 8.8.2) and opaque entity tags | |||
| (Section 2.3). Additional metadata that reflects resource state has | (Section 8.8.3). Additional metadata that reflects resource state | |||
| been defined by various extensions of HTTP, such as Web Distributed | has been defined by various extensions of HTTP, such as Web | |||
| Authoring and Versioning (WebDAV, [RFC4918]), that are beyond the | Distributed Authoring and Versioning [WEBDAV], that are beyond the | |||
| scope of this specification. A resource metadata value is referred | scope of this specification. | |||
| to as a "validator" when it is used within a precondition. | ||||
| 8.8.1. Weak versus Strong | 8.8.1. Weak versus Strong | |||
| Validators come in two flavors: strong or weak. Weak validators are | Validators come in two flavors: strong or weak. Weak validators are | |||
| easy to generate but are far less useful for comparisons. Strong | easy to generate but are far less useful for comparisons. Strong | |||
| validators are ideal for comparisons but can be very difficult (and | validators are ideal for comparisons but can be very difficult (and | |||
| occasionally impossible) to generate efficiently. Rather than impose | occasionally impossible) to generate efficiently. Rather than impose | |||
| that all forms of resource adhere to the same strength of validator, | that all forms of resource adhere to the same strength of validator, | |||
| HTTP exposes the type of validator in use and imposes restrictions on | HTTP exposes the type of validator in use and imposes restrictions on | |||
| when weak validators can be used as preconditions. | when weak validators can be used as preconditions. | |||
| A "strong validator" is representation metadata that changes value | A _strong validator_ is representation metadata that changes value | |||
| whenever a change occurs to the representation data that would be | whenever a change occurs to the representation data that would be | |||
| observable in the payload body of a 200 (OK) response to GET. | observable in the content of a 200 (OK) response to GET. | |||
| A strong validator might change for reasons other than a change to | A strong validator might change for reasons other than a change to | |||
| the representation data, such as when a semantically significant part | the representation data, such as when a semantically significant part | |||
| of the representation metadata is changed (e.g., Content-Type), but | 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 | 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 | value when it is necessary to invalidate the stored responses held by | |||
| remote caches and authoring tools. | remote caches and authoring tools. | |||
| Cache entries might persist for arbitrarily long periods, regardless | Cache entries might persist for arbitrarily long periods, regardless | |||
| of expiration times. Thus, a cache might attempt to validate an | of expiration times. Thus, a cache might attempt to validate an | |||
| skipping to change at line 2854 ¶ | skipping to change at page 75, line 32 ¶ | |||
| accessible to GET. A collision-resistant hash function applied to | accessible to GET. A collision-resistant hash function applied to | |||
| the representation data is also sufficient if the data is available | the representation data is also sufficient if the data is available | |||
| prior to the response header fields being sent and the digest does | prior to the response header fields being sent and the digest does | |||
| not need to be recalculated every time a validation request is | not need to be recalculated every time a validation request is | |||
| received. However, if a resource has distinct representations that | received. However, if a resource has distinct representations that | |||
| differ only in their metadata, such as might occur with content | differ only in their metadata, such as might occur with content | |||
| negotiation over media types that happen to share the same data | negotiation over media types that happen to share the same data | |||
| format, then the origin server needs to incorporate additional | format, then the origin server needs to incorporate additional | |||
| information in the validator to distinguish those representations. | information in the validator to distinguish those representations. | |||
| In contrast, a "weak validator" is representation metadata that might | In contrast, a _weak validator_ is representation metadata that might | |||
| not change for every change to the representation data. This | not change for every change to the representation data. This | |||
| weakness might be due to limitations in how the value is calculated, | weakness might be due to limitations in how the value is calculated | |||
| such as clock resolution, an inability to ensure uniqueness for all | (e.g., clock resolution), an inability to ensure uniqueness for all | |||
| possible representations of the resource, or a desire of the resource | possible representations of the resource, or a desire of the resource | |||
| owner to group representations by some self-determined set of | owner to group representations by some self-determined set of | |||
| equivalency rather than unique sequences of data. An origin server | equivalency rather than unique sequences of data. | |||
| SHOULD change a weak entity-tag whenever it considers prior | ||||
| representations to be unacceptable as a substitute for the current | An origin server SHOULD change a weak entity-tag whenever it | |||
| representation. In other words, a weak entity-tag ought to change | considers prior representations to be unacceptable as a substitute | |||
| whenever the origin server wants caches to invalidate old responses. | 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 | For example, the representation of a weather report that changes in | |||
| content every second, based on dynamic measurements, might be grouped | content every second, based on dynamic measurements, might be grouped | |||
| into sets of equivalent representations (from the origin server's | into sets of equivalent representations (from the origin server's | |||
| perspective) with the same weak validator in order to allow cached | perspective) with the same weak validator in order to allow cached | |||
| representations to be valid for a reasonable period of time (perhaps | representations to be valid for a reasonable period of time (perhaps | |||
| adjusted dynamically based on server load or weather quality). | adjusted dynamically based on server load or weather quality). | |||
| Likewise, a representation's modification time, if defined with only | Likewise, a representation's modification time, if defined with only | |||
| one-second resolution, might be a weak validator if it is possible | one-second resolution, might be a weak validator if it is possible | |||
| for the representation to be modified twice during a single second | for the representation to be modified twice during a single second | |||
| and retrieved between those modifications. | and retrieved between those modifications. | |||
| Likewise, a validator is weak if it is shared by two or more | 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 of a given resource at the same time, unless those | |||
| representations have identical representation data. For example, if | representations have identical representation data. For example, if | |||
| the origin server sends the same validator for a representation with | the origin server sends the same validator for a representation with | |||
| a gzip content coding applied as it does for a representation with no | a gzip content coding applied as it does for a representation with no | |||
| skipping to change at line 2905 ¶ | skipping to change at page 76, line 38 ¶ | |||
| The "Last-Modified" header field in a response provides a timestamp | The "Last-Modified" header field in a response provides a timestamp | |||
| indicating the date and time at which the origin server believes the | indicating the date and time at which the origin server believes the | |||
| selected representation was last modified, as determined at the | selected representation was last modified, as determined at the | |||
| conclusion of handling the request. | conclusion of handling the request. | |||
| Last-Modified = HTTP-date | Last-Modified = HTTP-date | |||
| An example of its use is | An example of its use is | |||
| Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT | Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT | |||
| 8.8.2.1. Generation | 8.8.2.1. Generation | |||
| An origin server SHOULD send Last-Modified for any selected | An origin server SHOULD send Last-Modified for any selected | |||
| representation for which a last modification date can be reasonably | representation for which a last modification date can be reasonably | |||
| and consistently determined, since its use in conditional requests | and consistently determined, since its use in conditional requests | |||
| and evaluating cache freshness ([RFC7234]) results in a substantial | and evaluating cache freshness ([CACHING]) can substantially reduce | |||
| reduction of HTTP traffic on the Internet and can be a significant | unnecessary transfers and significantly improve service availability | |||
| factor in improving service scalability and reliability. | and scalability. | |||
| A representation is typically the sum of many parts behind the | A representation is typically the sum of many parts behind the | |||
| resource interface. The last-modified time would usually be the most | resource interface. The last-modified time would usually be the most | |||
| recent time that any of those parts were changed. How that value is | recent time that any of those parts were changed. How that value is | |||
| determined for any given resource is an implementation detail beyond | determined for any given resource is an implementation detail beyond | |||
| the scope of this specification. What matters to HTTP is how | the scope of this specification. | |||
| 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 | An origin server SHOULD obtain the Last-Modified value of the | |||
| representation as close as possible to the time that it generates 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 | Date field value for its response. This allows a recipient to make | |||
| an accurate assessment of the representation's modification time, | an accurate assessment of the representation's modification time, | |||
| especially if the representation changes near the time that the | especially if the representation changes near the time that the | |||
| response is generated. | response is generated. | |||
| An origin server with a clock MUST NOT send a Last-Modified date that | An origin server with a clock (as defined in Section 5.6.7) MUST NOT | |||
| is later than the server's time of message origination (Date). If | generate a Last-Modified date that is later than the server's time of | |||
| the last modification time is derived from implementation-specific | message origination (Date, Section 6.6.1). If the last modification | |||
| metadata that evaluates to some time in the future, according to the | time is derived from implementation-specific metadata that evaluates | |||
| origin server's clock, then the origin server MUST replace that value | to some time in the future, according to the origin server's clock, | |||
| with the message origination date. This prevents a future | then the origin server MUST replace that value with the message | |||
| modification date from having an adverse impact on cache validation. | 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 | An origin server without a clock MUST NOT generate a Last-Modified | |||
| to a response unless these values were associated with the resource | date for a response unless that date value was assigned to the | |||
| by some other system or user with a reliable clock. | resource by some other system (presumably one with a clock). | |||
| 8.8.2.2. Comparison | 8.8.2.2. Comparison | |||
| A Last-Modified time, when used as a validator in a request, is | 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, | implicitly weak unless it is possible to deduce that it is strong, | |||
| using the following rules: | using the following rules: | |||
| o The validator is being compared by an origin server to the actual | * The validator is being compared by an origin server to the actual | |||
| current validator for the representation and, | current validator for the representation and, | |||
| o That origin server reliably knows that the associated | * That origin server reliably knows that the associated | |||
| representation did not change twice during the second covered by | representation did not change twice during the second covered by | |||
| the presented validator. | the presented validator; | |||
| or | or | |||
| o The validator is about to be used by a client in an | * The validator is about to be used by a client in an | |||
| If-Modified-Since, If-Unmodified-Since, or If-Range header field, | If-Modified-Since, If-Unmodified-Since, or If-Range header field, | |||
| because the client has a cache entry for the associated | because the client has a cache entry for the associated | |||
| representation, and | representation, and | |||
| o That cache entry includes a Date value, which gives the time when | * That cache entry includes a Date value which is at least one | |||
| the origin server sent the original response, and | second after the Last-Modified value and the client has reason to | |||
| believe that they were generated by the same clock or that there | ||||
| o The presented Last-Modified time is at least 60 seconds before the | is enough difference between the Last-Modified and Date values to | |||
| Date value. | make clock synchronization issues unlikely; | |||
| or | or | |||
| o The validator is being compared by an intermediate cache to the | * The validator is being compared by an intermediate cache to the | |||
| validator stored in its cache entry for the representation, and | validator stored in its cache entry for the representation, and | |||
| o That cache entry includes a Date value, which gives the time when | * That cache entry includes a Date value which is at least one | |||
| the origin server sent the original response, and | second after the Last-Modified value and the cache has reason to | |||
| believe that they were generated by the same clock or that there | ||||
| o The presented Last-Modified time is at least 60 seconds before the | is enough difference between the Last-Modified and Date values to | |||
| Date value. | make clock synchronization issues unlikely. | |||
| This method relies on the fact that if two different responses were | 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 | 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 | same Last-Modified time, then at least one of those responses would | |||
| have a Date value equal to its Last-Modified time. The arbitrary | have a Date value equal to its Last-Modified time. | |||
| 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. | ||||
| 8.8.3. ETag | 8.8.3. ETag | |||
| The "ETag" header field in a response provides the current entity-tag | The "ETag" field in a response provides the current entity-tag for | |||
| for the selected representation, as determined at the conclusion of | the selected representation, as determined at the conclusion of | |||
| handling the request. An entity-tag is an opaque validator for | handling the request. An entity-tag is an opaque validator for | |||
| differentiating between multiple representations of the same | differentiating between multiple representations of the same | |||
| resource, regardless of whether those multiple representations are | resource, regardless of whether those multiple representations are | |||
| due to resource state changes over time, content negotiation | due to resource state changes over time, content negotiation | |||
| resulting in multiple representations being valid at the same time, | resulting in multiple representations being valid at the same time, | |||
| or both. An entity-tag consists of an opaque quoted string, possibly | or both. An entity-tag consists of an opaque quoted string, possibly | |||
| prefixed by a weakness indicator. | prefixed by a weakness indicator. | |||
| ETag = entity-tag | ETag = entity-tag | |||
| entity-tag = [ weak ] opaque-tag | entity-tag = [ weak ] opaque-tag | |||
| weak = %x57.2F ; "W/", case-sensitive | weak = %s"W/" | |||
| opaque-tag = DQUOTE *etagc DQUOTE | opaque-tag = DQUOTE *etagc DQUOTE | |||
| etagc = %x21 / %x23-7E / obs-text | etagc = %x21 / %x23-7E / obs-text | |||
| ; VCHAR except double quotes, plus obs-text | ; VCHAR except double quotes, plus obs-text | |||
| Note: Previously, opaque-tag was defined to be a quoted-string | | *Note:* Previously, opaque-tag was defined to be a quoted- | |||
| ([RFC2616], Section 3.11); thus, some recipients might perform | | string ([RFC2616], Section 3.11); thus, some recipients might | |||
| backslash unescaping. Servers therefore ought to avoid backslash | | perform backslash unescaping. Servers therefore ought to avoid | |||
| characters in entity tags. | | backslash characters in entity tags. | |||
| An entity-tag can be more reliable for validation than a modification | An entity-tag can be more reliable for validation than a modification | |||
| date in situations where it is inconvenient to store modification | date in situations where it is inconvenient to store modification | |||
| dates, where the one-second resolution of HTTP date values is not | dates, where the one-second resolution of HTTP date values is not | |||
| sufficient, or where modification dates are not consistently | sufficient, or where modification dates are not consistently | |||
| maintained. | maintained. | |||
| Examples: | Examples: | |||
| ETag: "xyzzy" | ETag: "xyzzy" | |||
| ETag: W/"xyzzy" | ETag: W/"xyzzy" | |||
| ETag: "" | ETag: "" | |||
| An entity-tag can be either a weak or strong validator, with strong | 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 | being the default. If an origin server provides an entity-tag for a | |||
| representation and the generation of that entity-tag does not satisfy | representation and the generation of that entity-tag does not satisfy | |||
| all of the characteristics of a strong validator (Section 2.1), then | all of the characteristics of a strong validator (Section 8.8.1), | |||
| the origin server MUST mark the entity-tag as weak by prefixing its | then the origin server MUST mark the entity-tag as weak by prefixing | |||
| opaque value with "W/" (case-sensitive). | its opaque value with "W/" (case-sensitive). | |||
| A sender MAY send the Etag field in a trailer section (see | ||||
| Section 6.5). 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 content. | ||||
| 8.8.3.1. Generation | 8.8.3.1. Generation | |||
| The principle behind entity-tags is that only the service author | The principle behind entity-tags is that only the service author | |||
| knows the implementation of a resource well enough to select the most | knows the implementation of a resource well enough to select the most | |||
| accurate and efficient validation mechanism for that resource, and | accurate and efficient validation mechanism for that resource, and | |||
| that any such mechanism can be mapped to a simple sequence of octets | 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 | 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. | the client to be aware of how each entity-tag is constructed. | |||
| skipping to change at line 3055 ¶ | skipping to change at page 79, line 49 ¶ | |||
| applied to all changes might use an internal revision number, perhaps | applied to all changes might use an internal revision number, perhaps | |||
| combined with a variance identifier for content negotiation, to | combined with a variance identifier for content negotiation, to | |||
| accurately differentiate between representations. Other | accurately differentiate between representations. Other | |||
| implementations might use a collision-resistant hash of | implementations might use a collision-resistant hash of | |||
| representation content, a combination of various file attributes, or | representation content, a combination of various file attributes, or | |||
| a modification timestamp that has sub-second resolution. | a modification timestamp that has sub-second resolution. | |||
| An origin server SHOULD send an ETag for any selected representation | An origin server SHOULD send an ETag for any selected representation | |||
| for which detection of changes can be reasonably and consistently | for which detection of changes can be reasonably and consistently | |||
| determined, since the entity-tag's use in conditional requests and | determined, since the entity-tag's use in conditional requests and | |||
| evaluating cache freshness ([RFC7234]) can result in a substantial | evaluating cache freshness ([CACHING]) can substantially reduce | |||
| reduction of HTTP network traffic and can be a significant factor in | unnecessary transfers and significantly improve service availability, | |||
| improving service scalability and reliability. | scalability, and reliability. | |||
| 8.8.3.2. Comparison | 8.8.3.2. Comparison | |||
| There are two entity-tag comparison functions, depending on whether | There are two entity-tag comparison functions, depending on whether | |||
| or not the comparison context allows the use of weak validators: | or not the comparison context allows the use of weak validators: | |||
| o Strong comparison: two entity-tags are equivalent if both are not | _Strong comparison_: two entity-tags are equivalent if both are not | |||
| weak and their opaque-tags match character-by-character. | weak and their opaque-tags match character-by-character. | |||
| o Weak comparison: two entity-tags are equivalent if their | _Weak comparison_: two entity-tags are equivalent if their opaque- | |||
| opaque-tags match character-by-character, regardless of either or | tags match character-by-character, regardless of either or both | |||
| both being tagged as "weak". | being tagged as "weak". | |||
| The example below shows the results for a set of entity-tag pairs and | The example below shows the results for a set of entity-tag pairs and | |||
| both the weak and strong comparison function results: | both the weak and strong comparison function results: | |||
| +--------+--------+-------------------+-----------------+ | +========+========+===================+=================+ | |||
| | ETag 1 | ETag 2 | Strong Comparison | Weak Comparison | | | ETag 1 | ETag 2 | Strong Comparison | Weak Comparison | | |||
| +--------+--------+-------------------+-----------------+ | +========+========+===================+=================+ | |||
| | W/"1" | W/"1" | no match | match | | | W/"1" | W/"1" | no match | match | | |||
| +--------+--------+-------------------+-----------------+ | ||||
| | W/"1" | W/"2" | no match | no match | | | W/"1" | W/"2" | no match | no match | | |||
| +--------+--------+-------------------+-----------------+ | ||||
| | W/"1" | "1" | no match | match | | | W/"1" | "1" | no match | match | | |||
| +--------+--------+-------------------+-----------------+ | ||||
| | "1" | "1" | match | match | | | "1" | "1" | match | match | | |||
| +--------+--------+-------------------+-----------------+ | +--------+--------+-------------------+-----------------+ | |||
| Table 3 | ||||
| 8.8.3.3. Example: Entity-Tags Varying on Content-Negotiated Resources | 8.8.3.3. Example: Entity-Tags Varying on Content-Negotiated Resources | |||
| Consider a resource that is subject to content negotiation (Section | Consider a resource that is subject to content negotiation | |||
| 3.4 of [RFC7231]), and where the representations sent in response to | (Section 12), and where the representations sent in response to a GET | |||
| a GET request vary based on the Accept-Encoding request header field | request vary based on the Accept-Encoding request header field | |||
| (Section 5.3.4 of [RFC7231]): | (Section 12.5.3): | |||
| >> Request: | >> Request: | |||
| GET /index HTTP/1.1 | GET /index HTTP/1.1 | |||
| Host: www.example.com | Host: www.example.com | |||
| Accept-Encoding: gzip | Accept-Encoding: gzip | |||
| In this case, the response might or might not use the gzip content | In this case, the response might or might not use the gzip content | |||
| coding. If it does not, the response might look like: | coding. If it does not, the response might look like: | |||
| >> Response: | >> Response: | |||
| HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
| Date: Fri, 26 Mar 2010 00:05:00 GMT | Date: Fri, 26 Mar 2010 00:05:00 GMT | |||
| ETag: "123-a" | ETag: "123-a" | |||
| Content-Length: 70 | Content-Length: 70 | |||
| Vary: Accept-Encoding | Vary: Accept-Encoding | |||
| Content-Type: text/plain | Content-Type: text/plain | |||
| Hello World! | Hello World! | |||
| Hello World! | Hello World! | |||
| Hello World! | Hello World! | |||
| Hello World! | Hello World! | |||
| Hello World! | Hello World! | |||
| An alternative representation that does use gzip content coding would | An alternative representation that does use gzip content coding would | |||
| be: | be: | |||
| >> Response: | >> Response: | |||
| HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
| Date: Fri, 26 Mar 2010 00:05:00 GMT | Date: Fri, 26 Mar 2010 00:05:00 GMT | |||
| ETag: "123-b" | ETag: "123-b" | |||
| Content-Length: 43 | Content-Length: 43 | |||
| Vary: Accept-Encoding | Vary: Accept-Encoding | |||
| Content-Type: text/plain | Content-Type: text/plain | |||
| Content-Encoding: gzip | Content-Encoding: gzip | |||
| ...binary data... | ...binary data... | |||
| Note: Content codings are a property of the representation data, | | *Note:* Content codings are a property of the representation | |||
| so a strong entity-tag for a content-encoded representation has to | | data, so a strong entity-tag for a content-encoded | |||
| be distinct from the entity tag of an unencoded representation to | | representation has to be distinct from the entity tag of an | |||
| prevent potential conflicts during cache updates and range | | unencoded representation to prevent potential conflicts during | |||
| requests. In contrast, transfer codings (Section 4 of [RFC7230]) | | cache updates and range requests. In contrast, transfer | |||
| apply only during message transfer and do not result in distinct | | codings (Section 7 of [HTTP/1.1]) apply only during message | |||
| entity-tags. | | transfer and do not result in distinct entity-tags. | |||
| 9. Methods | 9. Methods | |||
| 9.1. Overview | 9.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 5) | 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 13.1) to | |||
| (Section 5.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 ([RFC7232]). | target resource. | |||
| HTTP was originally designed to be usable as an interface to | HTTP is designed to be usable as an interface to distributed object | |||
| distributed object systems. The request method was envisioned as | systems. The request method invokes an action to be applied to a | |||
| applying semantics to a target resource in much the same way as | target resource in much the same way that a remote method invocation | |||
| invoking a defined method on an identified object would apply | can be sent to an identified object. | |||
| semantics. | ||||
| method = token | method = token | |||
| 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 | |||
| gateway to object-based systems with case-sensitive method names. | gateway to object-based systems with case-sensitive method names. By | |||
| By convention, standardized methods are defined in all-uppercase | convention, standardized methods are defined in all-uppercase US- | |||
| US-ASCII letters. | ASCII letters. | |||
| Unlike distributed objects, the standardized request methods in HTTP | Unlike distributed objects, the standardized request methods in HTTP | |||
| are not resource-specific, since uniform interfaces provide for | are not resource-specific, since uniform interfaces provide for | |||
| better visibility and reuse in network-based systems [REST]. Once | better visibility and reuse in network-based systems [REST]. Once | |||
| defined, a standardized method ought to have the same semantics when | defined, a standardized method ought to have the same semantics when | |||
| applied to any resource, though each resource determines for itself | applied to any resource, though each resource determines for itself | |||
| whether those semantics are implemented or allowed. | whether those semantics are implemented or allowed. | |||
| This specification defines a number of standardized methods that are | This specification defines a number of standardized methods that are | |||
| commonly used in HTTP, as outlined by the following table. | commonly used in HTTP, as outlined by the following table. | |||
| +---------+-------------------------------------------------+-------+ | +=========+============================================+=======+ | |||
| | Method | Description | Sec. | | | Method | Description | Ref. | | |||
| +---------+-------------------------------------------------+-------+ | +=========+============================================+=======+ | |||
| | GET | Transfer a current representation of the target | 4.3.1 | | | GET | Transfer a current representation of the | 9.3.1 | | |||
| | | resource. | | | | | target resource. | | | |||
| | HEAD | Same as GET, but only transfer the status line | 4.3.2 | | +---------+--------------------------------------------+-------+ | |||
| | | and header section. | | | | HEAD | Same as GET, but do not transfer the | 9.3.2 | | |||
| | POST | Perform resource-specific processing on the | 4.3.3 | | | | response content. | | | |||
| | | request payload. | | | +---------+--------------------------------------------+-------+ | |||
| | PUT | Replace all current representations of the | 4.3.4 | | | POST | Perform resource-specific processing on | 9.3.3 | | |||
| | | target resource with the request payload. | | | | | the request content. | | | |||
| | DELETE | Remove all current representations of the | 4.3.5 | | +---------+--------------------------------------------+-------+ | |||
| | | target resource. | | | | PUT | Replace all current representations of the | 9.3.4 | | |||
| | CONNECT | Establish a tunnel to the server identified by | 4.3.6 | | | | target resource with the request content. | | | |||
| | | the target resource. | | | +---------+--------------------------------------------+-------+ | |||
| | OPTIONS | Describe the communication options for the | 4.3.7 | | | DELETE | Remove all current representations of the | 9.3.5 | | |||
| | | target resource. | | | | | target resource. | | | |||
| | TRACE | Perform a message loop-back test along the path | 4.3.8 | | +---------+--------------------------------------------+-------+ | |||
| | | to the target resource. | | | | CONNECT | Establish a tunnel to the server | 9.3.6 | | |||
| +---------+-------------------------------------------------+-------+ | | | identified by the target resource. | | | |||
| +---------+--------------------------------------------+-------+ | ||||
| | OPTIONS | Describe the communication options for the | 9.3.7 | | ||||
| | | target resource. | | | ||||
| +---------+--------------------------------------------+-------+ | ||||
| | TRACE | Perform a message loop-back test along the | 9.3.8 | | ||||
| | | path to the target resource. | | | ||||
| +---------+--------------------------------------------+-------+ | ||||
| Table 4 | ||||
| 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 7.4.1). However, the set of allowed | Allow header field (Section 10.2.1). However, the set of allowed | |||
| methods can change dynamically. When a request method is received | methods can change dynamically. An origin server that receives a | |||
| that is unrecognized or not implemented by an origin server, the | request method that is unrecognized or not implemented SHOULD respond | |||
| origin server SHOULD respond with the 501 (Not Implemented) status | with the 501 (Not Implemented) status code. An origin server that | |||
| code. When a request method is received that is known by an origin | receives a request method that is recognized and implemented, but not | |||
| server but not allowed for the target resource, the origin server | allowed for the target resource, SHOULD respond with the 405 (Method | |||
| SHOULD respond with the 405 (Method Not Allowed) status code. | Not Allowed) status code. | |||
| Additional methods, outside the scope of this specification, have | Additional methods, outside the scope of this specification, have | |||
| been standardized for use in HTTP. All such methods ought to be | been specified for use in HTTP. All such methods ought to be | |||
| registered within the "Hypertext Transfer Protocol (HTTP) Method | registered within the "Hypertext Transfer Protocol (HTTP) Method | |||
| Registry" maintained by IANA, as defined in Section 8.1. | Registry", as described in Section 16.1. | |||
| 9.2. Common Method Properties | 9.2. Common Method Properties | |||
| 9.2.1. Safe Methods | 9.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 | |||
| from including behavior that is potentially harmful, that is not | from including behavior that is potentially harmful, that is not | |||
| entirely read-only, or that causes side effects while invoking a safe | entirely read-only, or that causes side effects while invoking a safe | |||
| method. What is important, however, is that the client did not | method. What is important, however, is that the client did not | |||
| request that additional behavior and cannot be held accountable for | request that additional behavior and cannot be held accountable for | |||
| it. For example, most servers append request information to access | it. For example, most servers append request information to access | |||
| log files at the completion of every response, regardless of the | log files at the completion of every response, regardless of the | |||
| method, and that is considered safe even though the log storage might | method, and that is considered safe even though the log storage might | |||
| become full and crash the server. Likewise, a safe request initiated | become full and cause the server to fail. Likewise, a safe request | |||
| by selecting an advertisement on the Web will often have the side | initiated by selecting an advertisement on the Web will often have | |||
| effect of charging an advertising account. | the side effect of charging an advertising account. | |||
| Of the request methods defined by this specification, the GET, HEAD, | Of the request methods defined by this specification, the GET, HEAD, | |||
| OPTIONS, and TRACE methods are defined to be safe. | OPTIONS, and TRACE methods are defined to be safe. | |||
| The purpose of distinguishing between safe and unsafe methods is to | The purpose of distinguishing between safe and unsafe methods is to | |||
| allow automated retrieval processes (spiders) and cache performance | allow automated retrieval processes (spiders) and cache performance | |||
| optimization (pre-fetching) to work without fear of causing harm. In | optimization (pre-fetching) to work without fear of causing harm. In | |||
| addition, it allows a user agent to apply appropriate constraints on | addition, it allows a user agent to apply appropriate constraints on | |||
| the automated use of unsafe methods when processing potentially | the automated use of unsafe methods when processing potentially | |||
| untrusted content. | untrusted content. | |||
| A user agent SHOULD distinguish between safe and unsafe methods when | A user agent SHOULD distinguish between safe and unsafe methods when | |||
| presenting potential actions to a user, such that the user can be | presenting potential actions to a user, such that the user can be | |||
| made aware of an unsafe action before it is requested. | made aware of an unsafe action before it is requested. | |||
| When a resource is constructed such that parameters within the | When a resource is constructed such that parameters within the target | |||
| effective request URI have the effect of selecting an action, it is | URI have the effect of selecting an action, it is the resource | |||
| the resource owner's responsibility to ensure that the action is | owner's responsibility to ensure that the action is consistent with | |||
| consistent with the request method semantics. For example, it is | the request method semantics. For example, it is common for Web- | |||
| common for Web-based content editing software to use actions within | based content editing software to use actions within query | |||
| query parameters, such as "page?do=delete". If the purpose of such a | parameters, such as "page?do=delete". If the purpose of such a | |||
| resource is to perform an unsafe action, then the resource owner MUST | resource is to perform an unsafe action, then the resource owner MUST | |||
| disable or disallow that action when it is accessed using a safe | disable or disallow that action when it is accessed using a safe | |||
| request method. Failure to do so will result in unfortunate side | request method. Failure to do so will result in unfortunate side | |||
| effects when automated processes perform a GET on every URI reference | effects when automated processes perform a GET on every URI reference | |||
| for the sake of link maintenance, pre-fetching, building a search | for the sake of link maintenance, pre-fetching, building a search | |||
| index, etc. | index, etc. | |||
| 9.2.2. Idempotent Methods | 9.2.2. Idempotent Methods | |||
| A request method is considered "idempotent" if the intended effect on | A request method is considered _idempotent_ if the intended effect on | |||
| the server of multiple identical requests with that method is the | the server of multiple identical requests with that method is the | |||
| same as the effect for a single such request. Of the request methods | same as the effect for a single such request. Of the request methods | |||
| defined by this specification, PUT, DELETE, and safe request methods | defined by this specification, PUT, DELETE, and safe request methods | |||
| are idempotent. | are idempotent. | |||
| Like the definition of safe, the idempotent property only applies to | Like the definition of safe, the idempotent property only applies to | |||
| what has been requested by the user; a server is free to log each | what has been requested by the user; a server is free to log each | |||
| request separately, retain a revision control history, or implement | request separately, retain a revision control history, or implement | |||
| other non-idempotent side effects for each idempotent request. | other non-idempotent side effects for each idempotent request. | |||
| Idempotent methods are distinguished because the request can be | Idempotent methods are distinguished because the request can be | |||
| repeated automatically if a communication failure occurs before the | repeated automatically if a communication failure occurs before the | |||
| client is able to read the server's response. For example, if a | client is able to read the server's response. For example, if a | |||
| client sends a PUT request and the underlying connection is closed | client sends a PUT request and the underlying connection is closed | |||
| before any response is received, then the client can establish a new | before any response is received, then the client can establish a new | |||
| connection and retry the idempotent request. It knows that repeating | connection and retry the idempotent request. It knows that repeating | |||
| the request will have the same intended effect, even if the original | the request will have the same intended effect, even if the original | |||
| request succeeded, though the response might differ. | request succeeded, though the response might differ. | |||
| A user agent MUST NOT automatically retry a request with a non- | A client SHOULD NOT automatically retry a request with a non- | |||
| idempotent method unless it has some means to know that the request | idempotent method unless it has some means to know that the request | |||
| semantics are actually idempotent, regardless of the method, or some | semantics are actually idempotent, regardless of the method, or some | |||
| means to detect that the original request was never applied. | means to detect that the original request was never applied. | |||
| For example, a user agent that knows (through design or | For example, a user agent can repeat a POST request automatically if | |||
| configuration) that a POST request to a given resource is safe can | it knows (through design or configuration) that the request is safe | |||
| repeat that request automatically. Likewise, a user agent designed | for that resource. Likewise, a user agent designed specifically to | |||
| specifically to operate on a version control repository might be able | operate on a version control repository might be able to recover from | |||
| to recover from partial failure conditions by checking the target | partial failure conditions by checking the target resource | |||
| resource revision(s) after a failed connection, reverting or fixing | revision(s) after a failed connection, reverting or fixing any | |||
| any changes that were partially applied, and then automatically | changes that were partially applied, and then automatically retrying | |||
| retrying the requests that failed. | the requests that failed. | |||
| Some clients take a riskier approach and attempt to guess when an | ||||
| automatic retry is possible. For example, a client might | ||||
| automatically retry a POST request if the underlying transport | ||||
| connection closed before any part of a response is received, | ||||
| particularly if an idle persistent connection was used. | ||||
| A proxy MUST NOT automatically retry non-idempotent requests. A | A proxy MUST NOT automatically retry non-idempotent requests. A | |||
| client SHOULD NOT automatically retry a failed automatic retry. | client SHOULD NOT automatically retry a failed automatic retry. | |||
| 9.2.3. Methods and Caching | 9.2.3. Methods and Caching | |||
| Request methods can be defined as "cacheable" to indicate that | For a cache to store and use a response, the associated method needs | |||
| responses to them are allowed to be stored for future reuse; for | to explicitly allow caching, and detail under what conditions a | |||
| specific requirements see [RFC7234]. In general, safe methods that | response can be used to satisfy subsequent requests; a method | |||
| do not depend on a current or authoritative response are defined as | definition which does not do so cannot be cached. For additional | |||
| cacheable; this specification defines GET, HEAD, and POST as | requirements see [CACHING]. | |||
| cacheable, although the overwhelming majority of cache | ||||
| implementations only support GET and HEAD. | This specification defines caching semantics for GET, HEAD, and POST, | |||
| although the overwhelming majority of cache implementations only | ||||
| support GET and HEAD. | ||||
| 9.3. Method Definitions | 9.3. Method Definitions | |||
| 9.3.1. GET | 9.3.1. GET | |||
| The GET method requests transfer of a current selected representation | The GET method requests transfer of a current selected representation | |||
| for the target resource. GET is the primary mechanism of information | for the target resource. A successful response reflects the quality | |||
| retrieval and the focus of almost all performance optimizations. | of "sameness" identified by the target URI (Section 1.2.2 of [URI]). | |||
| Hence, when people speak of retrieving some identifiable information | Hence, retrieving identifiable information via HTTP is usually | |||
| via HTTP, they are generally referring to making a GET request. | performed by making a GET request on an identifier associated with | |||
| the potential for providing that information in a 200 (OK) response. | ||||
| GET is the primary mechanism of information retrieval and the focus | ||||
| of almost all performance optimizations. Applications that produce a | ||||
| URI for each important resource can benefit from those optimizations | ||||
| while enabling their reuse by other applications, creating a network | ||||
| effect that promotes further 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 9.1 for related security considerations). However, there are | Section 17.3 for related security considerations). However, there | |||
| 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 resource identifier corresponds to an implementation and how | |||
| how each implementation manages to select and send a current | that implementation manages to select and send a current | |||
| representation of the target resource in a response to GET. | representation of the target resource. | |||
| 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 | |||
| ([RFC7233]). | (Section 14.2). | |||
| A payload within a GET request message has no defined semantics; | Although request message framing is independent of the method used, | |||
| sending a payload body on a GET request might cause some existing | content received in a GET request has no generally defined semantics, | |||
| implementations to reject the request. | cannot alter the meaning or target of the request, and might lead | |||
| some implementations to reject the request and close the connection | ||||
| because of its potential as a request smuggling attack (Section 11.2 | ||||
| of [HTTP/1.1]). A client SHOULD NOT generate content in a GET | ||||
| request unless it is made directly to an origin server that has | ||||
| previously indicated, in or out of band, that such a request has a | ||||
| purpose and will be adequately supported. An origin server SHOULD | ||||
| NOT rely on private agreements to receive content, since participants | ||||
| in HTTP communication are often unaware of intermediaries along the | ||||
| request chain. | ||||
| 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 [RFC7234]). | by the Cache-Control header field (Section 5.2 of [CACHING]). | |||
| When information retrieval is performed with a mechanism that | ||||
| constructs a target URI from user-provided information, such as the | ||||
| query fields of a form using GET, potentially sensitive data might be | ||||
| provided that would not be appropriate for disclosure within a URI | ||||
| (see Section 17.9). In some cases, the data can be filtered or | ||||
| transformed such that it would not reveal such information. In | ||||
| others, particularly when there is no benefit from caching a | ||||
| response, using the POST method (Section 9.3.3) instead of GET can | ||||
| transmit such information in the request content rather than within | ||||
| the target URI. | ||||
| 9.3.2. HEAD | 9.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 content in the response. HEAD is used to obtain metadata about | |||
| the end of the header section). | the selected representation without transferring its representation | |||
| This method can be used for obtaining metadata about | data, often for the sake of testing hypertext links or finding recent | |||
| the selected representation without transferring the representation | modifications. | |||
| data and is often used for testing hypertext links | ||||
| for validity, accessibility, and recent modification. | ||||
| The server SHOULD send the same header fields in response to a HEAD | The server SHOULD send the same header fields in response to a HEAD | |||
| request as it would have sent if the request had been a GET, except | request as it would have sent if the request method had been GET. | |||
| that the payload header fields (Section 3.3) MAY be omitted. | However, a server MAY omit header fields for which a value is | |||
| determined only while generating the content. For example, some | ||||
| servers buffer a dynamic response to GET until a minimum amount of | ||||
| data is generated so that they can more efficiently delimit small | ||||
| responses or make late decisions with regard to content selection. | ||||
| Such a response to GET might contain Content-Length and Vary fields, | ||||
| for example, that are not generated within a HEAD response. These | ||||
| minor inconsistencies are considered preferable to generating and | ||||
| discarding the content for a HEAD request, since HEAD is usually | ||||
| requested for the sake of efficiency. | ||||
| A payload within a HEAD request message has no defined semantics; | Although request message framing is independent of the method used, | |||
| sending a payload body on a HEAD request might cause some existing | content received in a HEAD request has no generally defined | |||
| implementations to reject the request. | semantics, cannot alter the meaning or target of the request, and | |||
| might lead some implementations to reject the request and close the | ||||
| connection because of its potential as a request smuggling attack | ||||
| (Section 11.2 of [HTTP/1.1]). A client SHOULD NOT generate content | ||||
| in a HEAD request unless it is made directly to an origin server that | ||||
| has previously indicated, in or out of band, that such a request has | ||||
| a purpose and will be adequately supported. An origin server SHOULD | ||||
| NOT rely on private agreements to receive content, since participants | ||||
| in HTTP communication are often unaware of intermediaries along the | ||||
| request chain. | ||||
| 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 | |||
| Cache-Control header field (Section 5.2 of [RFC7234]). A HEAD | Cache-Control header field (Section 5.2 of [CACHING]). A HEAD | |||
| response might also have an effect on previously cached responses to | response might also affect previously cached responses to GET; see | |||
| GET; see Section 4.3.5 of [RFC7234]. | Section 4.3.5 of [CACHING]. | |||
| 9.3.3. POST | 9.3.3. POST | |||
| The POST method requests that the target resource process the | The POST method requests that the target resource process the | |||
| representation enclosed in the request according to the resource's | representation enclosed in the request according to the resource's | |||
| own specific semantics. For example, POST is used for the following | own specific semantics. For example, POST is used for the following | |||
| functions (among others): | functions (among others): | |||
| o Providing a block of data, such as the fields entered into an HTML | * Providing a block of data, such as the fields entered into an HTML | |||
| form, to a data-handling process; | form, to a data-handling process; | |||
| o Posting a message to a bulletin board, newsgroup, mailing list, | * Posting a message to a bulletin board, newsgroup, mailing list, | |||
| blog, or similar group of articles; | blog, or similar group of articles; | |||
| o Creating a new resource that has yet to be identified by the | * Creating a new resource that has yet to be identified by the | |||
| origin server; and | origin server; and | |||
| o Appending data to a resource's existing representation(s). | * Appending data to a resource's existing representation(s). | |||
| An origin server indicates response semantics by choosing an | An origin server indicates response semantics by choosing an | |||
| 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 might 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 7.1.2) and a representation that describes the status of the | (Section 10.2.2) and a representation that describes the status of | |||
| request while referring to the new resource(s). | the 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 [RFC7234]). | explicit freshness information (see Section 4.2.1 of [CACHING]) and a | |||
| However, POST caching is not widely implemented. For cases where an | ||||
| origin server wishes the client to be able to cache the result of a | ||||
| POST in a way that can be reused by a later GET, the origin server | ||||
| MAY send a 200 (OK) response containing the result 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 | |||
| effective request URI (Section 3.1.4.2). | target URI (Section 8.7). A cached POST response can be reused to | |||
| 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 | ||||
| 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 | |||
| shared caching, though at the cost of an extra request if the user | shared caching, though at the cost of an extra request if the user | |||
| agent does not already have the representation cached. | agent does not already have the representation cached. | |||
| 9.3.4. PUT | 9.3.4. PUT | |||
| The PUT method requests that the state of the target resource be | The PUT method requests that the state of the target resource be | |||
| created or replaced with the state defined by the representation | created or replaced with the state defined by the representation | |||
| enclosed in the request message payload. A successful PUT of a given | enclosed in the request message content. A successful PUT of a given | |||
| representation would suggest that a subsequent GET on that same | representation would suggest that a subsequent GET on that same | |||
| target resource will result in an equivalent representation being | target resource will result in an equivalent representation being | |||
| sent in a 200 (OK) response. However, there is no guarantee that | sent in a 200 (OK) response. However, there is no guarantee that | |||
| such a state change will be observable, since the target resource | such a state change will be observable, since the target resource | |||
| might be acted upon by other user agents in parallel, or might be | might be acted upon by other user agents in parallel, or might be | |||
| subject to dynamic processing by the origin server, before any | subject to dynamic processing by the origin server, before any | |||
| subsequent GET is received. A successful response only implies that | subsequent GET is received. A successful response only implies that | |||
| the user agent's intent was achieved at the time of its processing by | the user agent's intent was achieved at the time of its processing by | |||
| the origin server. | the origin server. | |||
| If the target resource does not have a current representation and the | If the target resource does not have a current representation and the | |||
| PUT successfully creates one, then the origin server MUST inform the | PUT successfully creates one, then the origin server MUST inform the | |||
| user agent by sending a 201 (Created) response. If the target | user agent by sending a 201 (Created) response. If the target | |||
| resource does have a current representation and that representation | resource does have a current representation and that representation | |||
| is successfully modified in accordance with the state of the enclosed | is successfully modified in accordance with the state of the enclosed | |||
| representation, then the origin server MUST send either a 200 (OK) or | representation, then the origin server MUST send either a 200 (OK) or | |||
| a 204 (No Content) response to indicate successful completion of the | a 204 (No Content) response to indicate successful completion of the | |||
| request. | request. | |||
| An origin server SHOULD verify that the PUT representation is | An origin server SHOULD verify that the PUT representation is | |||
| consistent with any constraints the server has for the target | consistent with its configured constraints for the target resource. | |||
| resource that cannot or will not be changed by the PUT. This is | For example, if an origin server determines a resource's | |||
| particularly important when the origin server uses internal | representation metadata based on the URI, then the origin server | |||
| configuration information related to the URI in order to set the | needs to ensure that the content received in a successful PUT request | |||
| values for representation metadata on GET responses. When a PUT | is consistent with that metadata. When a PUT representation is | |||
| representation is inconsistent with the target resource, the origin | inconsistent with the target resource, the origin server SHOULD | |||
| server SHOULD either make them consistent, by transforming the | either make them consistent, by transforming the representation or | |||
| representation or changing the resource configuration, or respond | changing the resource configuration, or respond with an appropriate | |||
| with an appropriate error message containing sufficient information | error message containing sufficient information to explain why the | |||
| to explain why the representation is unsuitable. The 409 (Conflict) | representation is unsuitable. The 409 (Conflict) or 415 (Unsupported | |||
| or 415 (Unsupported Media Type) status codes are suggested, with the | Media Type) status codes are suggested, with the latter being | |||
| latter being specific to constraints on Content-Type values. | specific to constraints on Content-Type values. | |||
| For example, if the target resource is configured to always have a | For example, if the target resource is configured to always have a | |||
| Content-Type of "text/html" and the representation being PUT has a | Content-Type of "text/html" and the representation being PUT has a | |||
| Content-Type of "image/jpeg", the origin server ought to do one of: | Content-Type of "image/jpeg", the origin server ought to do one of: | |||
| a. reconfigure the target resource to reflect the new media type; | a. reconfigure the target resource to reflect the new media type; | |||
| b. transform the PUT representation to a format consistent with that | b. transform the PUT representation to a format consistent with that | |||
| of the resource before saving it as the new resource state; or, | of the resource before saving it as the new resource state; or, | |||
| skipping to change at line 3489 ¶ | skipping to change at page 91, line 5 ¶ | |||
| origin server beyond what can be expressed by the intent of the user | origin server beyond what can be expressed by the intent of the user | |||
| 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 SHOULD ignore unrecognized header fields received in | This extends to how header and trailer fields are stored; while | |||
| a PUT request (i.e., do not save them as part of the resource state). | common header fields like Content-Type will typically be stored and | |||
| returned upon subsequent GET requests, header and trailer field | ||||
| handling is specific to the resource that received the request. As a | ||||
| result, an origin server SHOULD ignore unrecognized header and | ||||
| trailer fields received in a PUT request (i.e., not save them as part | ||||
| of the resource state). | ||||
| An origin server MUST NOT send a validator header field | An origin server MUST NOT send a validator field (Section 8.8), such | |||
| (Section 7.2), such as an ETag or Last-Modified field, in a | as an ETag or Last-Modified field, in a successful response to PUT | |||
| successful response to PUT unless the request's representation data | unless the request's representation data was saved without any | |||
| was saved without any transformation applied to the body (i.e., the | transformation applied to the content (i.e., the resource's new | |||
| resource's new representation data is identical to the representation | representation data is identical to the content received in the PUT | |||
| data received in the PUT request) and the validator field value | request) and the validator field value reflects the new | |||
| reflects the new representation. This requirement allows a user | representation. This requirement allows a user agent to know when | |||
| agent to know when the representation body it has in memory remains | the representation it sent (and retains in memory) is the result of | |||
| current as a result of the PUT, thus not in need of being retrieved | the PUT, and thus doesn't need to be retrieved again from the origin | |||
| again from the origin server, and that the new validator(s) received | server. The new validator(s) received in the response can be used | |||
| in the response can be used for future conditional requests in order | for future conditional requests in order to prevent accidental | |||
| to prevent accidental overwrites (Section 5.2). | overwrites (Section 13.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 line 3535 ¶ | skipping to change at page 92, line 15 ¶ | |||
| A PUT request applied to the target resource can have side effects on | A PUT request applied to the target resource can have side effects on | |||
| other resources. For example, an article might have a URI for | other resources. For example, an article might have a URI for | |||
| 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 | Some origin servers support use of the Content-Range header field | |||
| a 400 (Bad Request) response to a PUT request that contains a | (Section 14.4) as a request modifier to perform a partial PUT, as | |||
| Content-Range header field (Section 4.2 of [RFC7233]), since the | described in Section 14.5. | |||
| payload is likely to be partial content that has been mistakenly PUT | ||||
| as a full representation. | ||||
| 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 effective request URI, those stored responses will be | for the target URI, those stored responses will be invalidated (see | |||
| invalidated (see Section 4.4 of [RFC7234]). | Section 4.4 of [CACHING]). | |||
| 9.3.5. DELETE | 9.3.5. DELETE | |||
| The DELETE method requests that the origin server remove the | The DELETE method requests that the origin server remove the | |||
| association between the target resource and its current | association between the target resource and its current | |||
| functionality. In effect, this method is similar to the rm command | functionality. In effect, this method is similar to the "rm" command | |||
| in UNIX: it expresses a deletion operation on the URI mapping of the | in UNIX: it expresses a deletion operation on the URI mapping of the | |||
| origin server rather than an expectation that the previously | origin server rather than an expectation that the previously | |||
| associated information be deleted. | associated information be deleted. | |||
| If the target resource has one or more current representations, they | If the target resource has one or more current representations, they | |||
| might or might not be destroyed by the origin server, and the | might or might not be destroyed by the origin server, and the | |||
| associated storage might or might not be reclaimed, depending | associated storage might or might not be reclaimed, depending | |||
| entirely on the nature of the resource and its implementation by the | entirely on the nature of the resource and its implementation by the | |||
| origin server (which are beyond the scope of this specification). | origin server (which are beyond the scope of this specification). | |||
| Likewise, other implementation aspects of a resource might need to be | Likewise, other implementation aspects of a resource might need to be | |||
| deactivated or archived as a result of a DELETE, such as database or | deactivated or archived as a result of a DELETE, such as database or | |||
| gateway connections. In general, it is assumed that the origin | gateway connections. In general, it is assumed that the origin | |||
| server will only allow DELETE on resources for which it has a | server will only allow DELETE on resources for which it has a | |||
| prescribed mechanism for accomplishing the deletion. | prescribed mechanism for accomplishing the deletion. | |||
| Relatively few resources allow the DELETE method -- its primary use | Relatively few resources allow the DELETE method - its primary use is | |||
| is for remote authoring environments, where the user has some | for remote authoring environments, where the user has some direction | |||
| direction regarding its effect. For example, a resource that was | regarding its effect. For example, a resource that was previously | |||
| previously created using a PUT request, or identified via the | created using a PUT request, or identified via the Location header | |||
| Location header field after a 201 (Created) response to a POST | field after a 201 (Created) response to a POST request, might allow a | |||
| request, might allow a corresponding DELETE request to undo those | corresponding DELETE request to undo those actions. Similarly, | |||
| actions. Similarly, custom user agent implementations that implement | custom user agent implementations that implement an authoring | |||
| an authoring function, such as revision control clients using HTTP | function, such as revision control clients using HTTP for remote | |||
| for remote operations, might use DELETE based on an assumption that | operations, might use DELETE based on an assumption that the server's | |||
| the server's URI space has been crafted to correspond to a version | URI space has been crafted to correspond to a version repository. | |||
| repository. | ||||
| If a DELETE method is successfully applied, the origin server SHOULD | If a DELETE method is successfully applied, the origin server SHOULD | |||
| send | send | |||
| a 202 (Accepted) status code if the action will likely succeed but | * a 202 (Accepted) status code if the action will likely succeed but | |||
| has not yet been enacted, | has not yet been enacted, | |||
| a 204 (No Content) status code if the action has been enacted and | * a 204 (No Content) status code if the action has been enacted and | |||
| no further information is to be supplied, or | no further information is to be supplied, or | |||
| a 200 (OK) status code if the action has been enacted and the | * a 200 (OK) status code if the action has been enacted and the | |||
| response message includes a representation describing the status. | response message includes a representation describing the status. | |||
| A payload within a DELETE request message has no defined semantics; | Although request message framing is independent of the method used, | |||
| sending a payload body on a DELETE request might cause some existing | content received in a DELETE request has no generally defined | |||
| implementations to reject the request. | semantics, cannot alter the meaning or target of the request, and | |||
| might lead some implementations to reject the request and close the | ||||
| connection because of its potential as a request smuggling attack | ||||
| (Section 11.2 of [HTTP/1.1]). A client SHOULD NOT generate content | ||||
| in a DELETE request unless it is made directly to an origin server | ||||
| that has previously indicated, in or out of band, that such a request | ||||
| has a purpose and will be adequately supported. An origin server | ||||
| SHOULD NOT rely on private agreements to receive content, since | ||||
| participants in HTTP communication are often unaware of | ||||
| intermediaries along the request chain. | ||||
| Responses to the DELETE method are not cacheable. If a DELETE | Responses to the DELETE method are not cacheable. If a successful | |||
| request passes through a cache that has one or more stored responses | DELETE request passes through a cache that has one or more stored | |||
| for the effective request URI, those stored responses will be | responses for the target URI, those stored responses will be | |||
| invalidated (see Section 4.4 of [RFC7234]). | invalidated (see Section 4.4 of [CACHING]). | |||
| 9.3.6. CONNECT | 9.3.6. CONNECT | |||
| The CONNECT method requests that the recipient establish a tunnel to | The CONNECT method requests that the recipient establish a tunnel to | |||
| the destination origin server identified by the request-target and, | the destination origin server identified by the request target and, | |||
| if successful, thereafter restrict its behavior to blind forwarding | if successful, thereafter restrict its behavior to blind forwarding | |||
| of packets, in both directions, until the tunnel is closed. Tunnels | of data, in both directions, until the tunnel is closed. Tunnels are | |||
| are commonly used to create an end-to-end virtual connection, through | commonly used to create an end-to-end virtual connection, through one | |||
| one or more proxies, which can then be secured using TLS (Transport | or more proxies, which can then be secured using TLS (Transport Layer | |||
| Layer Security, [RFC5246]). | Security, [TLS13]). | |||
| CONNECT is intended only for use in requests to a proxy. An origin | CONNECT uses a special form of request target, unique to this method, | |||
| server that receives a CONNECT request for itself MAY respond with a | consisting of only the host and port number of the tunnel | |||
| 2xx (Successful) status code to indicate that a connection is | destination, separated by a colon. There is no default port; a | |||
| established. However, most origin servers do not implement CONNECT. | client MUST send the port number even if the CONNECT request is based | |||
| on a URI reference that contains an authority component with an | ||||
| elided port (Section 4.1). For example, | ||||
| A client sending a CONNECT request MUST send the authority form of | CONNECT server.example.com:80 HTTP/1.1 | |||
| request-target (Section 5.3 of [RFC7230]); i.e., the request-target | Host: server.example.com | |||
| consists of only the host name and port number of the tunnel | ||||
| destination, separated by a colon. For example, | ||||
| CONNECT server.example.com:80 HTTP/1.1 | A server MUST reject a CONNECT request that targets an empty or | |||
| Host: server.example.com:80 | invalid port number, typically by responding with a 400 (Bad Request) | |||
| status code. | ||||
| The recipient proxy can establish a tunnel either by directly | Because CONNECT changes the request/response nature of an HTTP | |||
| connecting to the request-target or, if configured to use another | connection, specific HTTP versions might have different ways of | |||
| mapping its semantics into the protocol's wire format. | ||||
| CONNECT is intended for use in requests to a proxy. The recipient | ||||
| can establish a tunnel either by directly connecting to the server | ||||
| identified by the request target or, if configured to use another | ||||
| proxy, by forwarding the CONNECT request to the next inbound proxy. | proxy, by forwarding the CONNECT request to the next inbound proxy. | |||
| An origin server MAY accept a CONNECT request, but most origin | ||||
| servers do not implement CONNECT. | ||||
| Any 2xx (Successful) response indicates that the sender (and all | Any 2xx (Successful) response indicates that the sender (and all | |||
| inbound proxies) will switch to tunnel mode immediately after the | inbound proxies) will switch to tunnel mode immediately after the | |||
| blank line that concludes the successful response's header section; | response header section; data received after that header section is | |||
| data received after that blank line is from the server identified by | from the server identified by the request target. Any response other | |||
| the request-target. Any response other than a successful response | than a successful response indicates that the tunnel has not yet been | |||
| indicates that the tunnel has not yet been formed and that the | formed. | |||
| connection remains governed by HTTP. | ||||
| A tunnel is closed when a tunnel intermediary detects that either | A tunnel is closed when a tunnel intermediary detects that either | |||
| side has closed its connection: the intermediary MUST attempt to send | side has closed its connection: the intermediary MUST attempt to send | |||
| any outstanding data that came from the closed side to the other | any outstanding data that came from the closed side to the other | |||
| side, close both connections, and then discard any remaining data | side, close both connections, and then discard any remaining data | |||
| left undelivered. | left undelivered. | |||
| Proxy authentication might be used to establish the authority to | Proxy authentication might be used to establish the authority to | |||
| create a tunnel. For example, | create a tunnel. For example, | |||
| CONNECT server.example.com:80 HTTP/1.1 | CONNECT server.example.com:443 HTTP/1.1 | |||
| Host: server.example.com:80 | Host: server.example.com:443 | |||
| Proxy-Authorization: basic aGVsbG86d29ybGQ= | Proxy-Authorization: basic aGVsbG86d29ybGQ= | |||
| There are significant risks in establishing a tunnel to arbitrary | There are significant risks in establishing a tunnel to arbitrary | |||
| servers, particularly when the destination is a well-known or | servers, particularly when the destination is a well-known or | |||
| reserved TCP port that is not intended for Web traffic. For example, | reserved TCP port that is not intended for Web traffic. For example, | |||
| a CONNECT to a request-target of "example.com:25" would suggest that | a CONNECT to "example.com:25" would suggest that the proxy connect to | |||
| the proxy connect to the reserved port for SMTP traffic; if allowed, | the reserved port for SMTP traffic; if allowed, that could trick the | |||
| that could trick the proxy into relaying spam email. Proxies that | proxy into relaying spam email. Proxies that support CONNECT SHOULD | |||
| support CONNECT SHOULD restrict its use to a limited set of known | restrict its use to a limited set of known ports or a configurable | |||
| ports or a configurable whitelist of safe request targets. | list of safe request targets. | |||
| A server MUST NOT send any Transfer-Encoding or Content-Length header | A server MUST NOT send any Transfer-Encoding or Content-Length header | |||
| fields in a 2xx (Successful) response to CONNECT. A client MUST | fields in a 2xx (Successful) response to CONNECT. A client MUST | |||
| ignore any Content-Length or Transfer-Encoding header fields received | ignore any Content-Length or Transfer-Encoding header fields received | |||
| in a successful response to CONNECT. | in a successful response to CONNECT. | |||
| A payload within a CONNECT request message has no defined semantics; | A CONNECT request message does not have content. The interpretation | |||
| sending a payload body on a CONNECT request might cause some existing | of data sent after the header section of the CONNECT request message | |||
| implementations to reject the request. | is specific to the version of HTTP in use. | |||
| Responses to the CONNECT method are not cacheable. | Responses to the CONNECT method are not cacheable. | |||
| 9.3.7. OPTIONS | 9.3.7. OPTIONS | |||
| The OPTIONS method requests information about the communication | The OPTIONS method requests information about the communication | |||
| options available for the target resource, at either the origin | options available for the target resource, at either the origin | |||
| server or an intervening intermediary. This method allows a client | server or an intervening intermediary. This method allows a client | |||
| to determine the options and/or requirements associated with a | to determine the options and/or requirements associated with a | |||
| resource, or the capabilities of a server, without implying a | resource, or the capabilities of a server, without implying a | |||
| resource action. | resource action. | |||
| An OPTIONS request with an asterisk ("*") as the request-target | An OPTIONS request with an asterisk ("*") as the request target | |||
| (Section 5.3 of [RFC7230]) applies to the server in general rather | (Section 7.1) applies to the server in general rather than to a | |||
| than to a specific resource. Since a server's communication options | specific resource. Since a server's communication options typically | |||
| typically depend on the resource, the "*" request is only useful as a | depend on the resource, the "*" request is only useful as a "ping" or | |||
| "ping" or "no-op" type of method; it does nothing beyond allowing the | "no-op" type of method; it does nothing beyond allowing the client to | |||
| client to test the capabilities of the server. For example, this can | test the capabilities of the server. For example, this can be used | |||
| be used to test a proxy for HTTP/1.1 conformance (or lack thereof). | to test a proxy for HTTP/1.1 conformance (or lack thereof). | |||
| If the request-target is not an asterisk, the OPTIONS request applies | If the request target is not an asterisk, the OPTIONS request applies | |||
| to the options that are available when communicating with the target | to the options that are available when communicating with the target | |||
| resource. | resource. | |||
| A server generating a successful response to OPTIONS SHOULD send any | A server generating a successful response to OPTIONS SHOULD send any | |||
| header fields that might indicate optional features implemented by | header that might indicate optional features implemented by the | |||
| the server and applicable to the target resource (e.g., Allow), | server and applicable to the target resource (e.g., Allow), including | |||
| including potential extensions not defined by this specification. | potential extensions not defined by this specification. The response | |||
| The response payload, if any, might also describe the communication | content, if any, might also describe the communication options in a | |||
| options in a machine or human-readable representation. A standard | machine or human-readable representation. A standard format for such | |||
| format for such a representation is not defined by this | a representation is not defined by this specification, but might be | |||
| specification, but might be defined by future extensions to HTTP. A | defined by future extensions to HTTP. | |||
| server MUST generate a Content-Length field with a value of "0" if no | ||||
| payload body is to be sent in the response. | ||||
| 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 5.1.2). A proxy MUST NOT generate a Max-Forwards header | Section 7.6.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 content MUST | |||
| MUST send a valid Content-Type header field describing the | send a valid Content-Type header field describing the representation | |||
| representation media type. Although this specification does not | media type. Note that this specification does not define any use for | |||
| define any use for such a payload, future extensions to HTTP might | such content. | |||
| use the OPTIONS body to make more detailed queries about the target | ||||
| resource. | ||||
| Responses to the OPTIONS method are not cacheable. | Responses to the OPTIONS method are not cacheable. | |||
| 9.3.8. TRACE | 9.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 content of a 200 (OK) response. The | |||
| Content-Type of "message/http" (Section 8.3.1 of [RFC7230]). The | "message/http" (Section 10.1 of [HTTP/1.1]) format is one way to do | |||
| final recipient is either the origin server or the first server to | so. The final recipient is either the origin server or the first | |||
| receive a Max-Forwards value of zero (0) in the request | server to receive a Max-Forwards value of zero (0) in the request | |||
| (Section 5.1.2). | (Section 7.6.2). | |||
| A client MUST NOT generate header fields in a TRACE request | A client MUST NOT generate fields in a TRACE request containing | |||
| containing sensitive data that might be disclosed by the response. | sensitive data that might be disclosed by the response. For example, | |||
| For example, it would be foolish for a user agent to send stored user | it would be foolish for a user agent to send stored user credentials | |||
| credentials [RFC7235] or cookies [RFC6265] in a TRACE request. The | (Section 11) or cookies [COOKIE] in a TRACE request. The final | |||
| final recipient of the request SHOULD exclude any request header | recipient of the request SHOULD exclude any request fields that are | |||
| fields that are likely to contain sensitive data when that recipient | likely to contain sensitive data when that recipient generates the | |||
| generates the response body. | response content. | |||
| 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 5.7.1 of | information. The value of the Via header field (Section 7.6.3) is of | |||
| [RFC7230]) is of particular interest, since it acts as a trace of the | particular interest, since it acts as a trace of the request chain. | |||
| request chain. Use of the Max-Forwards header field allows the | Use of the Max-Forwards header field allows the client to limit the | |||
| client to limit the length of the request chain, which is useful for | length of the request chain, which is useful for testing a chain of | |||
| 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 content in a TRACE request. | |||
| Responses to the TRACE method are not cacheable. | Responses to the TRACE method are not cacheable. | |||
| 10. Message Context | 10. Message Context | |||
| 10.1. Request Context Fields | 10.1. Request Context Fields | |||
| A client sends request header fields to provide more information | The request header fields below provide additional information about | |||
| about the request context, make the request conditional based on the | the request context, including information about the user, user | |||
| target resource state, suggest preferred formats for the response, | ||||
| supply authentication credentials, or modify the expected request | ||||
| processing. These fields act as request modifiers, similar to the | ||||
| parameters on a programming language method invocation. | ||||
| Controls are request header fields that direct specific handling of | ||||
| the request. | ||||
| The following request header fields provide additional information | ||||
| about the request context, including information about the user, user | ||||
| agent, and resource behind the request. | agent, and resource behind the request. | |||
| 10.1.1. Expect | 10.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. The only such expectation | order to properly handle this request. | |||
| defined by this specification is 100-continue. | ||||
| Expect = "100-continue" | Expect = #expectation | |||
| expectation = token [ "=" ( token / quoted-string ) parameters ] | ||||
| The Expect field-value is case-insensitive. | The Expect field value is case-insensitive. | |||
| [new] | The only expectation defined by this specification is "100-continue" | |||
| (with no defined parameters). | ||||
| A server that receives an Expect field-value other than 100-continue | A server that receives an Expect field value containing a member | |||
| MAY respond with a 417 (Expectation Failed) status code to indicate | other than 100-continue MAY respond with a 417 (Expectation Failed) | |||
| that the unexpected expectation cannot be met. | status code to indicate that the unexpected expectation cannot be | |||
| met. | ||||
| A 100-continue expectation informs recipients that the client is | A _100-continue_ expectation informs recipients that the client is | |||
| about to send a (presumably large) message body in this request and | about to send (presumably large) content in this request and wishes | |||
| wishes to receive a 100 (Continue) interim response if the | to receive a 100 (Continue) interim response if the method, target | |||
| request-line and header fields are not sufficient to cause an | URI, and header fields are not sufficient to cause an immediate | |||
| immediate success, redirect, or error response. This allows the | success, redirect, or error response. This allows the client to wait | |||
| client to wait for an indication that it is worthwhile to send the | for an indication that it is worthwhile to send the content before | |||
| message body before actually doing so, which can improve efficiency | actually doing so, which can improve efficiency when the data is huge | |||
| when the message body is huge or when the client anticipates that an | or when the client anticipates that an error is likely (e.g., when | |||
| error is likely (e.g., when sending a state-changing method, for the | sending a state-changing method, for the first time, without | |||
| first time, without previously verified authentication credentials). | previously verified authentication credentials). | |||
| For example, a request that begins with | For example, a request that begins with | |||
| PUT /somewhere/fun HTTP/1.1 | ||||
| PUT /somewhere/fun HTTP/1.1 | Host: origin.example.com | |||
| Host: origin.example.com | Content-Type: video/h264 | |||
| Content-Type: video/h264 | Content-Length: 1234567890987 | |||
| Content-Length: 1234567890987 | Expect: 100-continue | |||
| Expect: 100-continue | ||||
| allows the origin server to immediately respond with an error | allows the origin server to immediately respond with an error | |||
| message, such as 401 (Unauthorized) or 405 (Method Not Allowed), | message, such as 401 (Unauthorized) or 405 (Method Not Allowed), | |||
| before the client starts filling the pipes with an unnecessary data | before the client starts filling the pipes with an unnecessary data | |||
| transfer. | transfer. | |||
| Requirements for clients: | Requirements for clients: | |||
| o A client MUST NOT generate a 100-continue expectation in a request | * A client MUST NOT generate a 100-continue expectation in a request | |||
| that does not include a message body. | that does not include content. | |||
| o A client that will wait for a 100 (Continue) response before | * A client that will wait for a 100 (Continue) response before | |||
| sending the request message body MUST send an Expect header field | sending the request content MUST send an Expect header field | |||
| containing a 100-continue expectation. | containing a 100-continue expectation. | |||
| o A client that sends a 100-continue expectation is not required to | * A client that sends a 100-continue expectation is not required to | |||
| wait for any specific length of time; such a client MAY proceed to | wait for any specific length of time; such a client MAY proceed to | |||
| send the message body even if it has not yet received a response. | send the content even if it has not yet received a response. | |||
| Furthermore, since 100 (Continue) responses cannot be sent through | Furthermore, since 100 (Continue) responses cannot be sent through | |||
| an HTTP/1.0 intermediary, such a client SHOULD NOT wait for an | an HTTP/1.0 intermediary, such a client SHOULD NOT wait for an | |||
| indefinite period before sending the message body. | indefinite period before sending the content. | |||
| o A client that receives a 417 (Expectation Failed) status code in | * A client that receives a 417 (Expectation Failed) status code in | |||
| response to a request containing a 100-continue expectation SHOULD | response to a request containing a 100-continue expectation SHOULD | |||
| repeat that request without a 100-continue expectation, since the | repeat that request without a 100-continue expectation, since the | |||
| 417 response merely indicates that the response chain does not | 417 response merely indicates that the response chain does not | |||
| support expectations (e.g., it passes through an HTTP/1.0 server). | support expectations (e.g., it passes through an HTTP/1.0 server). | |||
| Requirements for servers: | Requirements for servers: | |||
| o A server that receives a 100-continue expectation in an HTTP/1.0 | * A server that receives a 100-continue expectation in an HTTP/1.0 | |||
| request MUST ignore that expectation. | request MUST ignore that expectation. | |||
| o A server MAY omit sending a 100 (Continue) response if it has | * A server MAY omit sending a 100 (Continue) response if it has | |||
| already received some or all of the message body for the | already received some or all of the content for the corresponding | |||
| corresponding request, or if the framing indicates that there is | request, or if the framing indicates that there is no content. | |||
| no message body. | ||||
| o A server that sends a 100 (Continue) response MUST ultimately send | * A server that sends a 100 (Continue) response MUST ultimately send | |||
| a final status code, once the message body is received and | a final status code, once it receives and processes the request | |||
| processed, unless the connection is closed prematurely. | content, unless the connection is closed prematurely. | |||
| o A server that responds with a final status code before reading the | * A server that responds with a final status code before reading the | |||
| entire message body SHOULD indicate in that response whether it | entire request content SHOULD indicate whether it intends to close | |||
| intends to close the connection or continue reading and discarding | the connection (e.g., see Section 9.6 of [HTTP/1.1]) or continue | |||
| the request message (see Section 6.6 of [RFC7230]). | reading the request content. | |||
| An origin server MUST, upon receiving an HTTP/1.1 (or later) | An origin server MUST, upon receiving an HTTP/1.1 (or later) request | |||
| request-line and a complete header section that | that has a method, target URI, and complete header section that | |||
| contains a 100-continue expectation and indicates a request message | contains a 100-continue expectation and an indication that request | |||
| body will follow, either send an immediate response with a final | content will follow, either send an immediate response with a final | |||
| status code, if that status can be determined by examining just the | status code, if that status can be determined by examining just the | |||
| request-line and header fields, or send an immediate 100 | method, target URI, and header fields, or send an immediate 100 | |||
| (Continue) response to encourage the client to send the request's | (Continue) response to encourage the client to send the request | |||
| message body. The origin server MUST NOT wait for the message body | content. The origin server MUST NOT wait for the content before | |||
| before sending the 100 (Continue) response. | sending the 100 (Continue) response. | |||
| A proxy MUST, upon receiving an HTTP/1.1 (or later) request-line and | A proxy MUST, upon receiving an HTTP/1.1 (or later) request that has | |||
| a complete header section that contains a 100-continue expectation and | a method, target URI, and complete header section that contains a | |||
| indicates a request message body will follow, | 100-continue expectation and indicates a request content will follow, | |||
| either send an immediate response with a final status code, if that | either send an immediate response with a final status code, if that | |||
| status can be determined by examining just the request-line and header | status can be determined by examining just the method, target URI, | |||
| fields, or begin forwarding the request toward the origin | and header fields, or begin forwarding the request toward the origin | |||
| server by sending a corresponding request-line and header section to | server by sending a corresponding request-line and header section to | |||
| the next inbound server. If the proxy believes (from configuration | the next inbound server. If the proxy believes (from configuration | |||
| or past interaction) that the next inbound server only supports | or past interaction) that the next inbound server only supports | |||
| HTTP/1.0, the proxy MAY generate an immediate 100 (Continue) response | HTTP/1.0, the proxy MAY generate an immediate 100 (Continue) response | |||
| to encourage the client to begin sending the message body. | to encourage the client to begin sending the content. | |||
| Note: The Expect header field was added after the original | ||||
| publication of HTTP/1.1 [RFC2068] as both the means to request an | ||||
| interim 100 (Continue) response and the general mechanism for | ||||
| indicating must-understand extensions. However, the extension | ||||
| mechanism has not been used by clients and the must-understand | ||||
| requirements have not been implemented by many servers, rendering | ||||
| the extension mechanism useless. This specification has removed | ||||
| the extension mechanism in order to simplify the definition and | ||||
| processing of 100-continue. | ||||
| 10.1.2. From | 10.1.2. From | |||
| The "From" header field contains an Internet email address for a | The "From" header field contains an Internet email address for a | |||
| human user who controls the requesting user agent. The address ought | human user who controls the requesting user agent. The address ought | |||
| to be machine-usable, as defined by "mailbox" in Section 3.4 of | to be machine-usable, as defined by "mailbox" in Section 3.4 of | |||
| [RFC5322]: | [RFC5322]: | |||
| From = mailbox | From = mailbox | |||
| mailbox = <mailbox, see [RFC5322], Section 3.4> | mailbox = <mailbox, see [RFC5322], Section 3.4> | |||
| An example is: | An example is: | |||
| From: webmaster@example.org | From: webmaster@example.org | |||
| The From header field is rarely sent by non-robotic user agents. A | The From header field is rarely sent by non-robotic user agents. A | |||
| user agent SHOULD NOT send a From header field without explicit | user agent SHOULD NOT send a From header field without explicit | |||
| configuration by the user, since that might conflict with the user's | configuration by the user, since that might conflict with the user's | |||
| privacy interests or their site's security policy. | privacy interests or their site's security policy. | |||
| A robotic user agent SHOULD send a valid From header field so that | A robotic user agent SHOULD send a valid From header field so that | |||
| the person responsible for running the robot can be contacted if | the person responsible for running the robot can be contacted if | |||
| problems occur on servers, such as if the robot is sending excessive, | problems occur on servers, such as if the robot is sending excessive, | |||
| unwanted, or invalid requests. | unwanted, or invalid requests. | |||
| A server SHOULD NOT use the From header field for access control or | A server SHOULD NOT use the From header field for access control or | |||
| authentication, since most recipients will assume that the field | authentication, since its value is expected to be visible to anyone | |||
| value is public information. | receiving or observing the request and is often recorded within | |||
| logfiles and error reports without any expectation of privacy. | ||||
| 10.1.3. Referer | 10.1.3. Referer | |||
| The "Referer" [sic] header field allows the user agent to specify a | The "Referer" [sic] header field allows the user agent to specify a | |||
| URI reference for the resource from which the target URI was obtained | URI reference for the resource from which the target URI was obtained | |||
| (i.e., the "referrer", though the field name is misspelled). A user | (i.e., the "referrer", though the field name is misspelled). A user | |||
| agent MUST NOT include the fragment and userinfo components of the | agent MUST NOT include the fragment and userinfo components of the | |||
| URI reference [RFC3986], if any, when generating the Referer field | URI reference [URI], if any, when generating the Referer field value. | |||
| value. | ||||
| Referer = absolute-URI / partial-URI | Referer = absolute-URI / partial-URI | |||
| 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 ([URI], Section 5). | ||||
| The Referer header field allows servers to generate back-links to | The Referer header field allows servers to generate back-links to | |||
| other resources for simple analytics, logging, optimized caching, | other resources for simple analytics, logging, optimized caching, | |||
| etc. It also allows obsolete or mistyped links to be found for | etc. It also allows obsolete or mistyped links to be found for | |||
| maintenance. Some servers use the Referer header field as a means of | maintenance. Some servers use the Referer header field as a means of | |||
| denying links from other sites (so-called "deep linking") or | denying links from other sites (so-called "deep linking") or | |||
| restricting cross-site request forgery (CSRF), but not all requests | restricting cross-site request forgery (CSRF), but not all requests | |||
| contain it. | contain it. | |||
| Example: | Example: | |||
| Referer: http://www.example.org/hypertext/Overview.html | Referer: http://www.example.org/hypertext/Overview.html | |||
| If the target URI was obtained from a source that does not have its | If the target URI was obtained from a source that does not have its | |||
| own URI (e.g., input from the user keyboard, or an entry within the | own URI (e.g., input from the user keyboard, or an entry within the | |||
| user's bookmarks/favorites), the user agent MUST either exclude the | user's bookmarks/favorites), the user agent MUST either exclude the | |||
| Referer field or send it with a value of "about:blank". | Referer header field or send it with a value of "about:blank". | |||
| The Referer field has the potential to reveal information about the | The Referer header field value need not convey the full URI of the | |||
| request context or browsing history of the user, which is a privacy | referring resource; a user agent MAY truncate parts other than the | |||
| concern if the referring resource's identifier reveals personal | referring origin. | |||
| information (such as an account name) or a resource that is supposed | ||||
| to be confidential (such as behind a firewall or internal to a | The Referer header field has the potential to reveal information | |||
| secured service). Most general-purpose user agents do not send the | about the request context or browsing history of the user, which is a | |||
| privacy 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 | 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 | "data" URI. A user agent SHOULD NOT send a Referer header field if | |||
| unsecured HTTP request if the referring page was received with a | the referring resource was accessed with a secure protocol and the | |||
| secure protocol. See Section 9.4 for additional security | request target has an origin differing from that of the referring | |||
| resource, unless the referring resource explicitly allows Referer to | ||||
| be sent. A user agent MUST NOT send a Referer header field in an | ||||
| unsecured HTTP request if the referring resource was accessed with a | ||||
| secure protocol. See Section 17.9 for additional security | ||||
| considerations. | considerations. | |||
| Some intermediaries have been known to indiscriminately remove | Some intermediaries have been known to indiscriminately remove | |||
| Referer header fields from outgoing requests. This has the | Referer header fields from outgoing requests. This has the | |||
| unfortunate side effect of interfering with protection against CSRF | unfortunate side effect of interfering with protection against CSRF | |||
| attacks, which can be far more harmful to their users. | attacks, which can be far more harmful to their users. | |||
| Intermediaries and user agent extensions that wish to limit | Intermediaries and user agent extensions that wish to limit | |||
| information disclosure in Referer ought to restrict their changes to | information disclosure in Referer ought to restrict their changes to | |||
| specific edits, such as replacing internal domain names with | specific edits, such as replacing internal domain names with | |||
| pseudonyms or truncating the query and/or path components. An | pseudonyms or truncating the query and/or path components. An | |||
| intermediary SHOULD NOT modify or delete the Referer header field | intermediary SHOULD NOT modify or delete the Referer header field | |||
| when the field value shares the same scheme and host as the request | when the field value shares the same scheme and host as the target | |||
| target. | URI. | |||
| 10.1.4. TE | 10.1.4. TE | |||
| The "TE" header field in a request indicates what transfer codings, | The "TE" header field describes capabilities of the client with | |||
| besides chunked, the client is willing to accept in response, and | regard to transfer encodings and trailer sections. | |||
| whether or not the client is willing to accept trailer fields in a | ||||
| chunked transfer coding. | ||||
| [new] | A TE field with a "trailers" member sent in a request indicates that | |||
| the client will not discard trailer fields, as described in | ||||
| Section 6.5. | ||||
| The TE field-value consists of a comma-separated list of transfer | TE is also used within HTTP/1.1 to advise servers about what transfer | |||
| coding names, each allowing for optional parameters (as described in | codings the client is able to accept in a response. As of | |||
| Section 4), and/or the keyword "trailers". A client MUST NOT send | publication, only HTTP/1.1 uses transfer codings (see Section 7 of | |||
| the chunked transfer coding name in TE; chunked is always acceptable | [HTTP/1.1]). | |||
| for HTTP/1.1 recipients. | ||||
| TE = #t-codings | The TE field value is a list of members, with each member (aside from | |||
| t-codings = "trailers" / ( transfer-coding [ t-ranking ] ) | "trailers") consisting of a transfer coding name token with an | |||
| t-ranking = OWS ";" OWS "q=" rank | optional weight indicating the client's relative preference for that | |||
| rank = ( "0" [ "." 0*3DIGIT ] ) | transfer coding (Section 12.4.2) and optional parameters for that | |||
| / ( "1" [ "." 0*3("0") ] ) | transfer coding. | |||
| 10.1.6. User-Agent | TE = #t-codings | |||
| t-codings = "trailers" / ( transfer-coding [ weight ] ) | ||||
| transfer-coding = token *( OWS ";" OWS transfer-parameter ) | ||||
| transfer-parameter = token BWS "=" BWS ( token / quoted-string ) | ||||
| A sender of TE MUST also send a "TE" connection option within the | ||||
| Connection header field (Section 7.6.1) to inform intermediaries not | ||||
| to forward this field. | ||||
| 10.1.5. User-Agent | ||||
| The "User-Agent" header field contains information about the user | The "User-Agent" header field contains information about the user | |||
| agent originating the request, which is often used by servers to help | agent originating the request, which is often used by servers to help | |||
| identify the scope of reported interoperability problems, to work | identify the scope of reported interoperability problems, to work | |||
| around or tailor responses to avoid particular user agent | around or tailor responses to avoid particular user agent | |||
| limitations, and for analytics regarding browser or operating system | limitations, and for analytics regarding browser or operating system | |||
| use. A user agent SHOULD send a User-Agent field in each request | use. A user agent SHOULD send a User-Agent header field in each | |||
| unless specifically configured not to do so. | request unless specifically configured not to do so. | |||
| User-Agent = product *( RWS ( product / comment ) ) | User-Agent = product *( RWS ( product / comment ) ) | |||
| The User-Agent field-value consists of one or more product | The User-Agent field value consists of one or more product | |||
| identifiers, each followed by zero or more comments (Section 3.2 of | identifiers, each followed by zero or more comments (Section 5.6.5), | |||
| [RFC7230]), which together identify the user agent software and its | which together identify the user agent software and its significant | |||
| significant subproducts. By convention, the product identifiers are | subproducts. By convention, the product identifiers are listed in | |||
| listed in decreasing order of their significance for identifying the | decreasing order of their significance for identifying the user agent | |||
| user agent software. Each product identifier consists of a name and | software. Each product identifier consists of a name and optional | |||
| optional version. | version. | |||
| product = token ["/" product-version] | product = token ["/" product-version] | |||
| product-version = token | product-version = token | |||
| A sender SHOULD limit generated product identifiers to what is | A sender SHOULD limit generated product identifiers to what is | |||
| necessary to identify the product; a sender MUST NOT generate | necessary to identify the product; a sender MUST NOT generate | |||
| advertising or other nonessential information within the product | advertising or other nonessential information within the product | |||
| identifier. A sender SHOULD NOT generate information in | identifier. A sender SHOULD NOT generate information in | |||
| product-version that is not a version identifier (i.e., successive | product-version that is not a version identifier (i.e., successive | |||
| versions of the same product name ought to differ only in the | versions of the same product name ought to differ only in the | |||
| product-version portion of the product identifier). | product-version portion of the product identifier). | |||
| Example: | Example: | |||
| User-Agent: CERN-LineMode/2.15 libwww/2.17b3 | User-Agent: CERN-LineMode/2.15 libwww/2.17b3 | |||
| A user agent SHOULD NOT generate a User-Agent header field containing | ||||
| A user agent SHOULD NOT generate a User-Agent field containing | ||||
| needlessly fine-grained detail and SHOULD limit the addition of | needlessly fine-grained detail and SHOULD limit the addition of | |||
| subproducts by third parties. Overly long and detailed User-Agent | subproducts by third parties. Overly long and detailed User-Agent | |||
| field values increase request latency and the risk of a user being | field values increase request latency and the risk of a user being | |||
| identified against their wishes ("fingerprinting"). | identified against their wishes ("fingerprinting"). | |||
| Likewise, implementations are encouraged not to use the product | Likewise, implementations are encouraged not to use the product | |||
| tokens of other implementations in order to declare compatibility | tokens of other implementations in order to declare compatibility | |||
| with them, as this circumvents the purpose of the field. If a user | with them, as this circumvents the purpose of the field. If a user | |||
| agent masquerades as a different user agent, recipients can assume | agent masquerades as a different user agent, recipients can assume | |||
| that the user intentionally desires to see responses tailored for | that the user intentionally desires to see responses tailored for | |||
| that identified user agent, even if they might not work as well for | that identified user agent, even if they might not work as well for | |||
| the actual user agent being used. | the actual user agent being used. | |||
| 10.2. Response Context | 10.2. Response Context Fields | |||
| Response header fields can supply control data that supplements the | ||||
| status code, directs caching, or instructs the client where to go | ||||
| next. | ||||
| The response header fields allow the server to pass additional | ||||
| information about the response beyond what is placed in the | ||||
| status-line. 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. | ||||
| The remaining response header fields provide more information about | The response header fields below provide additional information about | |||
| the target resource for potential use in later requests. | the response, beyond what is implied by the status code, including | |||
| information about the server, about the target resource, or about | ||||
| related resources. | ||||
| 10.2.1. Allow | 10.2.1. Allow | |||
| The "Allow" header field lists the set of methods advertised as | The "Allow" header field lists the set of methods advertised as | |||
| supported by the target resource. The purpose of this field is | supported by the target resource. The purpose of this field is | |||
| strictly to inform the recipient of valid request methods associated | strictly to inform the recipient of valid request methods associated | |||
| with the resource. | with the resource. | |||
| Allow = #method | Allow = #method | |||
| Example of use: | Example of use: | |||
| Allow: GET, HEAD, PUT | Allow: GET, HEAD, PUT | |||
| The actual set of allowed methods is defined by the origin server at | 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 | 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 | header field in a 405 (Method Not Allowed) response and MAY do so in | |||
| other response. An empty Allow field value indicates that the | any other response. An empty Allow field value indicates that the | |||
| resource allows no methods, which might occur in a 405 response if | resource allows no methods, which might occur in a 405 response if | |||
| the resource has been temporarily disabled by configuration. | the resource has been temporarily disabled by configuration. | |||
| A proxy MUST NOT modify the Allow header field -- it does not need to | A proxy MUST NOT modify the Allow header field - it does not need to | |||
| understand all of the indicated methods in order to handle them | understand all of the indicated methods in order to handle them | |||
| according to the generic message handling rules. | according to the generic message handling rules. | |||
| 10.2.3. Location | 10.2.2. Location | |||
| The "Location" header field is used in some responses to refer to a | The "Location" header field is used in some responses to refer to a | |||
| specific resource in relation to the response. The type of | specific resource in relation to the response. The type of | |||
| relationship is defined by the combination of request method and | relationship is defined by the combination of request method and | |||
| status code semantics. | status code semantics. | |||
| Location = URI-reference | Location = URI-reference | |||
| The field value consists of a single URI-reference. When it has the | The field value consists of a single URI-reference. When it has the | |||
| form of a relative reference ([RFC3986], Section 4.2), the final | form of a relative reference ([URI], Section 4.2), the final value is | |||
| value is computed by resolving it against the effective request URI | computed by resolving it against the target URI ([URI], Section 5). | |||
| ([RFC3986], Section 5). | ||||
| For 201 (Created) responses, the Location value refers to the primary | For 201 (Created) responses, the Location value refers to the primary | |||
| resource created by the request. For 3xx (Redirection) responses, | resource created by the request. For 3xx (Redirection) responses, | |||
| the Location value refers to the preferred target resource for | the Location value refers to the preferred target resource for | |||
| automatically redirecting the request. | automatically redirecting the request. | |||
| If the Location value provided in a 3xx (Redirection) response does | If the Location value provided in a 3xx (Redirection) response does | |||
| not have a fragment component, a user agent MUST process the | not have a fragment component, a user agent MUST process the | |||
| redirection as if the value inherits the fragment component of the | redirection as if the value inherits the fragment component of the | |||
| URI reference used to generate the request target (i.e., the | URI reference used to generate the target URI (i.e., the redirection | |||
| redirection inherits the original reference's fragment, if any). | inherits the original reference's fragment, if any). | |||
| For example, a GET request generated for the URI reference | For example, a GET request generated for the URI reference | |||
| "http://www.example.org/~tim" might result in a 303 (See Other) | "http://www.example.org/~tim" might result in a 303 (See Other) | |||
| response containing the header field: | response containing the header field: | |||
| Location: /People.html#tim | Location: /People.html#tim | |||
| which suggests that the user agent redirect to | which suggests that the user agent redirect to | |||
| "http://www.example.org/People.html#tim" | "http://www.example.org/People.html#tim" | |||
| Likewise, a GET request generated for the URI reference | Likewise, a GET request generated for the URI reference | |||
| "http://www.example.org/index.html#larry" might result in a 301 | "http://www.example.org/index.html#larry" might result in a 301 | |||
| (Moved Permanently) response containing the header field: | (Moved Permanently) response containing the header field: | |||
| Location: http://www.example.net/index.html | Location: http://www.example.net/index.html | |||
| which suggests that the user agent redirect to | which suggests that the user agent redirect to | |||
| "http://www.example.net/index.html#larry", preserving the original | "http://www.example.net/index.html#larry", preserving the original | |||
| fragment identifier. | fragment identifier. | |||
| There are circumstances in which a fragment identifier in a Location | There are circumstances in which a fragment identifier in a Location | |||
| value would not be appropriate. For example, the Location header | value would not be appropriate. For example, the Location header | |||
| field in a 201 (Created) response is supposed to provide a URI that | field in a 201 (Created) response is supposed to provide a URI that | |||
| is specific to the created resource. | is specific to the created resource. | |||
| Note: Some recipients attempt to recover from Location fields that | | *Note:* Some recipients attempt to recover from Location header | |||
| are not valid URI references. This specification does not mandate | | fields that are not valid URI references. This specification | |||
| or define such processing, but does allow it for the sake of | | does not mandate or define such processing, but does allow it | |||
| robustness. | | 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 lines, a recipient | ||||
| | along the path might combine those field lines 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 3.1.4.2) differs | | *Note:* The Content-Location header field (Section 8.7) differs | |||
| from Location in that the Content-Location refers to the most | | from Location in that the Content-Location refers to the most | |||
| specific resource corresponding to the enclosed representation. | | specific resource corresponding to the enclosed representation. | |||
| It is therefore possible for a response to contain both the | | It is therefore possible for a response to contain both the | |||
| Location and Content-Location header fields. | | Location and Content-Location header fields. | |||
| 10.2.4. Retry-After | 10.2.3. Retry-After | |||
| Servers send the "Retry-After" header field to indicate how long the | Servers send the "Retry-After" header field to indicate how long the | |||
| user agent ought to wait before making a follow-up request. When | user agent ought to wait before making a follow-up request. When | |||
| sent with a 503 (Service Unavailable) response, Retry-After indicates | sent with a 503 (Service Unavailable) response, Retry-After indicates | |||
| how long the service is expected to be unavailable to the client. | how long the service is expected to be unavailable to the client. | |||
| When sent with any 3xx (Redirection) response, Retry-After indicates | When sent with any 3xx (Redirection) response, Retry-After indicates | |||
| the minimum time that the user agent is asked to wait before issuing | the minimum time that the user agent is asked to wait before issuing | |||
| the redirected request. | the redirected request. | |||
| The value of this field can be either an HTTP-date or a number of | The Retry-After field value can be either an HTTP-date or a number of | |||
| seconds to delay after the response is received. | seconds to delay after receiving the response. | |||
| Retry-After = HTTP-date / delay-seconds | Retry-After = HTTP-date / delay-seconds | |||
| A delay-seconds value is a non-negative decimal integer, representing | A delay-seconds value is a non-negative decimal integer, representing | |||
| time in seconds. | time in seconds. | |||
| delay-seconds = 1*DIGIT | delay-seconds = 1*DIGIT | |||
| Two examples of its use are | Two examples of its use are | |||
| Retry-After: Fri, 31 Dec 1999 23:59:59 GMT | Retry-After: Fri, 31 Dec 1999 23:59:59 GMT | |||
| Retry-After: 120 | Retry-After: 120 | |||
| In the latter example, the delay is 2 minutes. | In the latter example, the delay is 2 minutes. | |||
| 10.2.5. Server | 10.2.4. Server | |||
| The "Server" header field contains information about the software | The "Server" header field contains information about the software | |||
| used by the origin server to handle the request, which is often used | used by the origin server to handle the request, which is often used | |||
| by clients to help identify the scope of reported interoperability | by clients to help identify the scope of reported interoperability | |||
| problems, to work around or tailor requests to avoid particular | problems, to work around or tailor requests to avoid particular | |||
| server limitations, and for analytics regarding server or operating | server limitations, and for analytics regarding server or operating | |||
| system use. An origin server MAY generate a Server field in its | system use. An origin server MAY generate a Server header field in | |||
| responses. | its responses. | |||
| Server = product *( RWS ( product / comment ) ) | Server = product *( RWS ( product / comment ) ) | |||
| The Server field-value consists of one or more product identifiers, | The Server header field value consists of one or more product | |||
| each followed by zero or more comments (Section 3.2 of [RFC7230]), | identifiers, each followed by zero or more comments (Section 5.6.5), | |||
| which together identify the origin server software and its | which together identify the origin server software and its | |||
| significant subproducts. By convention, the product identifiers are | significant subproducts. By convention, the product identifiers are | |||
| listed in decreasing order of their significance for identifying the | listed in decreasing order of their significance for identifying the | |||
| origin server software. Each product identifier consists of a name | origin server software. Each product identifier consists of a name | |||
| and optional version, as defined in Section 5.5.3. | and optional version, as defined in Section 10.1.5. | |||
| Example: | Example: | |||
| Server: CERN/3.0 libwww/2.17 | Server: CERN/3.0 libwww/2.17 | |||
| An origin server SHOULD NOT generate a Server field containing | An origin server SHOULD NOT generate a Server header field containing | |||
| needlessly fine-grained detail and SHOULD limit the addition of | needlessly fine-grained detail and SHOULD limit the addition of | |||
| subproducts by third parties. Overly long and detailed Server field | subproducts by third parties. Overly long and detailed Server field | |||
| values increase response latency and potentially reveal internal | values increase response latency and potentially reveal internal | |||
| implementation details that might make it (slightly) easier for | implementation details that might make it (slightly) easier for | |||
| attackers to find and exploit known security holes. | attackers to find and exploit known security holes. | |||
| 11. HTTP Authentication | 11. HTTP Authentication | |||
| HTTP provides a simple challenge-response authentication framework | ||||
| that can be used by a server to challenge a client request and by a | ||||
| client to provide authentication information. | ||||
| Two header fields are used for carrying authentication credentials, | ||||
| as defined in [RFC7235]. | ||||
| This document defines HTTP/1.1 authentication in terms of the | ||||
| architecture defined in "Hypertext Transfer Protocol (HTTP/1.1): | ||||
| Message Syntax and Routing" [RFC7230], including the general | ||||
| framework previously described in "HTTP Authentication: Basic and | ||||
| Digest Access Authentication" [RFC2617] and the related fields and | ||||
| status codes previously defined in "Hypertext Transfer Protocol -- | ||||
| HTTP/1.1" [RFC2616]. | ||||
| 11.1. Authentication Scheme | 11.1. Authentication Scheme | |||
| HTTP provides a general framework for access control and | HTTP provides a general framework for access control and | |||
| authentication, via an extensible set of challenge-response | authentication, via an extensible set of challenge-response | |||
| authentication schemes, which can be used by a server to challenge a | authentication schemes, which can be used by a server to challenge a | |||
| client request and by a client to provide authentication information. | client request and by a client to provide authentication information. | |||
| It uses a case-insensitive token as a means to identify the authentication | It uses a case-insensitive token to identify the authentication | |||
| scheme, | scheme | |||
| auth-scheme = token | auth-scheme = token | |||
| The IANA Authentication Scheme Registry (Section 5.1) lists | Aside from the general framework, this document does not specify any | |||
| registered authentication schemes and their corresponding | authentication schemes. New and existing authentication schemes are | |||
| specifications, including the "basic" and "digest" authentication | specified independently and ought to be registered within the | |||
| schemes previously defined by RFC 2617. | "Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry". | |||
| For example, the "basic" and "digest" authentication schemes are | ||||
| defined by RFC 7617 and RFC 7616, respectively. | ||||
| 11.2. Authentication Parameters | 11.2. Authentication Parameters | |||
| followed by additional information | The authentication scheme is followed by additional information | |||
| necessary for achieving authentication via that scheme. | necessary for achieving authentication via that scheme as either a | |||
| The latter can be either a | ||||
| comma-separated list of parameters or a single sequence of characters | comma-separated list of parameters or a single sequence of characters | |||
| capable of holding base64-encoded information. | capable of holding base64-encoded information. | |||
| token68 = 1*( ALPHA / DIGIT / | token68 = 1*( ALPHA / DIGIT / | |||
| "-" / "." / "_" / "~" / "+" / "/" ) *"=" | "-" / "." / "_" / "~" / "+" / "/" ) *"=" | |||
| The token68 syntax allows the 66 unreserved URI characters | The token68 syntax allows the 66 unreserved URI characters ([URI]), | |||
| ([RFC3986]), plus a few others, so that it can hold a base64, | plus a few others, so that it can hold a base64, base64url (URL and | |||
| base64url (URL and filename safe alphabet), base32, or base16 (hex) | filename safe alphabet), base32, or base16 (hex) encoding, with or | |||
| encoding, with or without padding, but excluding whitespace | without padding, but excluding whitespace ([RFC4648]). | |||
| ([RFC4648]). | ||||
| Authentication parameters are name=value pairs, where the name token | Authentication parameters are name=value pairs, where the name token | |||
| is matched case-insensitively, and each parameter name MUST only | is matched case-insensitively and each parameter name MUST only occur | |||
| occur once per challenge. | once per challenge. | |||
| auth-param = token BWS "=" BWS ( token / quoted-string ) | auth-param = token BWS "=" BWS ( token / quoted-string ) | |||
| Parameter values can be expressed either as "token" or as "quoted- | Parameter values can be expressed either as "token" or as "quoted- | |||
| string" (Section 3.2.6 of [RFC7230]). | string" (Section 5.6). Authentication scheme definitions need to | |||
| Authentication scheme definitions need to allow both notations, both | accept both notations, both for senders and recipients, to allow | |||
| for senders and recipients. This allows | recipients to use generic parsing components regardless of the | |||
| recipients to use generic parsing components, independent of the | authentication scheme. | |||
| authentication scheme in use. | ||||
| For backwards compatibility, authentication scheme definitions can | For backwards compatibility, authentication scheme definitions can | |||
| restrict the format for senders to one of the two variants. This can | restrict the format for senders to one of the two variants. This can | |||
| be important when it is known that deployed implementations will fail | be important when it is known that deployed implementations will fail | |||
| when encountering one of the two formats. | when encountering one of the two formats. | |||
| 11.3. Challenge and Response | 11.3. Challenge and Response | |||
| A 401 (Unauthorized) response message is used by an origin server to | A 401 (Unauthorized) response message is used by an origin server to | |||
| challenge the authorization of a user agent, including a | challenge the authorization of a user agent, including a | |||
| WWW-Authenticate header field containing at least one challenge | WWW-Authenticate header field containing at least one challenge | |||
| applicable to the requested resource. | applicable to the requested resource. | |||
| A 407 (Proxy Authentication Required) response message is used by a | A 407 (Proxy Authentication Required) response message is used by a | |||
| proxy to challenge the authorization of a client, including a | proxy to challenge the authorization of a client, including a | |||
| Proxy-Authenticate header field containing at least one challenge | Proxy-Authenticate header field containing at least one challenge | |||
| applicable to the proxy for the requested resource. | applicable to the proxy for the requested resource. | |||
| challenge = auth-scheme [ 1*SP ( token68 / #auth-param ) ] | challenge = auth-scheme [ 1*SP ( token68 / #auth-param ) ] | |||
| Note: Many clients fail to parse a challenge that contains an | | *Note:* Many clients fail to parse a challenge that contains an | |||
| unknown scheme. A workaround for this problem is to list well- | | unknown scheme. A workaround for this problem is to list well- | |||
| supported schemes (such as "basic") first. | | supported schemes (such as "basic") first. | |||
| A user agent that wishes to authenticate itself with an origin server | A user agent that wishes to authenticate itself with an origin server | |||
| -- usually, but not necessarily, after receiving a 401 (Unauthorized) | - usually, but not necessarily, after receiving a 401 (Unauthorized) | |||
| -- can do so by including an Authorization header field with the | - can do so by including an Authorization header field with the | |||
| request. | request. | |||
| A client that wishes to authenticate itself with a proxy -- usually, | A client that wishes to authenticate itself with a proxy - usually, | |||
| but not necessarily, after receiving a 407 (Proxy Authentication | but not necessarily, after receiving a 407 (Proxy Authentication | |||
| Required) -- can do so by including a Proxy-Authorization header | Required) - can do so by including a Proxy-Authorization header field | |||
| field with the request. | with the request. | |||
| 11.4. Credentials | 11.4. Credentials | |||
| Both the Authorization field value and the Proxy-Authorization field | Both the Authorization field value and the Proxy-Authorization field | |||
| value contain the client's credentials for the realm of the resource | value contain the client's credentials for the realm of the resource | |||
| being requested, based upon a challenge received in a response | being requested, based upon a challenge received in a response | |||
| (possibly at some point in the past). When creating their values, | (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 | 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, | considers to be the most secure auth-scheme that it understands, | |||
| obtaining credentials from the user as appropriate. Transmission of | obtaining credentials from the user as appropriate. Transmission of | |||
| credentials within header field values implies significant security | credentials within header field values implies significant security | |||
| considerations regarding the confidentiality of the underlying | considerations regarding the confidentiality of the underlying | |||
| connection, as described in Section 6.1. | connection, as described in Section 17.16.1. | |||
| credentials = auth-scheme [ 1*SP ( token68 / #auth-param ) ] | credentials = auth-scheme [ 1*SP ( token68 / #auth-param ) ] | |||
| Upon receipt of a request for a protected resource that omits | Upon receipt of a request for a protected resource that omits | |||
| credentials, contains invalid credentials (e.g., a bad password) or | credentials, contains invalid credentials (e.g., a bad password) or | |||
| partial credentials (e.g., when the authentication scheme requires | partial credentials (e.g., when the authentication scheme requires | |||
| more than one round trip), an origin server SHOULD send a 401 | more than one round trip), an origin server SHOULD send a 401 | |||
| (Unauthorized) response that contains a WWW-Authenticate header field | (Unauthorized) response that contains a WWW-Authenticate header field | |||
| with at least one (possibly new) challenge applicable to the | with at least one (possibly new) challenge applicable to the | |||
| requested resource. | requested resource. | |||
| Likewise, upon receipt of a request that omits proxy credentials or | Likewise, upon receipt of a request that omits proxy credentials or | |||
| contains invalid or partial proxy credentials, a proxy that requires | contains invalid or partial proxy credentials, a proxy that requires | |||
| authentication SHOULD generate a 407 (Proxy Authentication Required) | authentication SHOULD generate a 407 (Proxy Authentication Required) | |||
| response that contains a Proxy-Authenticate header field with at | response that contains a Proxy-Authenticate header field with at | |||
| least one (possibly new) challenge applicable to the proxy. | least one (possibly new) challenge applicable to the proxy. | |||
| A server that receives valid credentials that are not adequate to | A server that receives valid credentials that are not adequate to | |||
| gain access ought to respond with the 403 (Forbidden) status code | gain access ought to respond with the 403 (Forbidden) status code | |||
| (Section 6.5.3 of [RFC7231]). | (Section 15.5.4). | |||
| HTTP does not restrict applications to this simple challenge-response | HTTP does not restrict applications to this simple challenge-response | |||
| framework for access authentication. Additional mechanisms can be | framework for access authentication. Additional mechanisms can be | |||
| used, such as authentication at the transport level or via message | used, such as authentication at the transport level or via message | |||
| encapsulation, and with additional header fields specifying | encapsulation, and with additional header fields specifying | |||
| authentication information. However, such additional mechanisms are | authentication information. However, such additional mechanisms are | |||
| not defined by this specification. | not defined by this specification. | |||
| Note that various custom mechanisms for user authentication use the | Note that various custom mechanisms for user authentication use the | |||
| Cookie header field for this purpose, as defined in [RFC6265]. | Set-Cookie and Cookie header fields, defined in [COOKIE], for passing | |||
| tokens related to authentication. | ||||
| 11.5. Establishing a Protection Space (Realm) | 11.5. Establishing a Protection Space (Realm) | |||
| The "realm" authentication parameter is reserved for use by | The _realm_ authentication parameter is reserved for use by | |||
| authentication schemes that wish to indicate a scope of protection. | authentication schemes that wish to indicate a scope of protection. | |||
| A protection space is defined by the canonical root URI (the scheme | A _protection space_ is defined by the origin (see Section 4.3.1) of | |||
| and authority components of the effective request URI; see Section | the server being accessed, in combination with the realm value if | |||
| 5.5 of [RFC7230]) of the server being accessed, in combination with | present. These realms allow the protected resources on a server to | |||
| the realm value if present. These realms allow the protected | be partitioned into a set of protection spaces, each with its own | |||
| resources on a server to be partitioned into a set of protection | authentication scheme and/or authorization database. The realm value | |||
| spaces, each with its own authentication scheme and/or authorization | is a string, generally assigned by the origin server, that can have | |||
| database. The realm value is a string, generally assigned by the | additional semantics specific to the authentication scheme. Note | |||
| origin server, that can have additional semantics specific to the | that a response can have multiple challenges with the same auth- | |||
| authentication scheme. Note that a response can have multiple | scheme but with different realms. | |||
| challenges with the same auth-scheme but with different realms. | ||||
| The protection space determines the domain over which credentials can | The protection space determines the domain over which credentials can | |||
| be automatically applied. If a prior request has been authorized, | be automatically applied. If a prior request has been authorized, | |||
| the user agent MAY reuse the same credentials for all other requests | the user agent MAY reuse the same credentials for all other requests | |||
| within that protection space for a period of time determined by the | within that protection space for a period of time determined by the | |||
| authentication scheme, parameters, and/or user preferences (such as a | authentication scheme, parameters, and/or user preferences (such as a | |||
| configurable inactivity timeout). Unless specifically allowed by the | configurable inactivity timeout). | |||
| authentication scheme, a single protection space cannot extend | ||||
| outside the scope of its server. | The extent of a protection space, and therefore the requests to which | |||
| credentials might be automatically applied, is not necessarily known | ||||
| to clients without additional information. An authentication scheme | ||||
| might define parameters that describe the extent of a protection | ||||
| space. 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 | For historical reasons, a sender MUST only generate the quoted-string | |||
| syntax. Recipients might have to support both token and | syntax. Recipients might have to support both token and quoted- | |||
| quoted-string syntax for maximum interoperability with existing | string syntax for maximum interoperability with existing clients that | |||
| clients that have been accepting both notations for a long time. | have been accepting both notations for a long time. | |||
| 11.6. Authenticating Users to Origin Servers | 11.6. Authenticating Users to Origin Servers | |||
| Authentication challenges indicate what mechanisms are available for | ||||
| the client to provide authentication credentials in future requests. | ||||
| This specification defines the "Authentication-Info" and "Proxy- | ||||
| Authentication-Info" response header fields for use in HTTP | ||||
| authentication schemes ([RFC7235]) that need to return information | ||||
| once the client's authentication credentials have been accepted. | ||||
| This section defines the syntax and semantics of header fields | ||||
| related to the HTTP authentication framework. | ||||
| 11.6.1. WWW-Authenticate | 11.6.1. WWW-Authenticate | |||
| The "WWW-Authenticate" header field indicates the authentication | The "WWW-Authenticate" response header field indicates the | |||
| scheme(s) and parameters applicable to the target resource. | authentication scheme(s) and parameters applicable to the target | |||
| resource. | ||||
| WWW-Authenticate = 1#challenge | WWW-Authenticate = #challenge | |||
| A server generating a 401 (Unauthorized) response MUST send a | A server generating a 401 (Unauthorized) response MUST send a WWW- | |||
| WWW-Authenticate header field containing at least one challenge. A | Authenticate header field containing at least one challenge. A | |||
| server MAY generate a WWW-Authenticate header field in other response | server MAY generate a WWW-Authenticate header field in other response | |||
| messages to indicate that supplying credentials (or different | messages to indicate that supplying credentials (or different | |||
| credentials) might affect the response. | credentials) might affect the response. | |||
| A proxy forwarding a response MUST NOT modify any WWW-Authenticate | A proxy forwarding a response MUST NOT modify any WWW-Authenticate | |||
| fields in that response. | header fields in that response. | |||
| User agents are advised to take special care in parsing the field | User agents are advised to take special care in parsing the field | |||
| value, as it might contain more than one challenge, and each | value, as it might contain more than one challenge, and each | |||
| challenge can contain a comma-separated list of authentication | challenge can contain a comma-separated list of authentication | |||
| parameters. Furthermore, the header field itself can occur multiple | parameters. Furthermore, the header field itself can occur multiple | |||
| times. | times. | |||
| For instance: | For instance: | |||
| WWW-Authenticate: Newauth realm="apps", type=1, | WWW-Authenticate: Basic realm="simple", Newauth realm="apps", | |||
| title="Login to \"apps\"", Basic realm="simple" | type=1, title="Login to \"apps\"" | |||
| This header field contains two challenges; one for the "Newauth" | This header field contains two challenges; one for the "Basic" scheme | |||
| scheme with a realm value of "apps", and two additional parameters | with a realm value of "simple", and another for the "Newauth" scheme | |||
| "type" and "title", and another one for the "Basic" scheme with a | with a realm value of "apps", and two additional parameters "type" | |||
| realm value of "simple". | and "title". | |||
| [new] | 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 | | *Note:* The challenge grammar production uses the list syntax | |||
| well. Therefore, a sequence of comma, whitespace, and comma can | | as well. Therefore, a sequence of comma, whitespace, and comma | |||
| be considered either as applying to the preceding challenge, or to | | can be considered either as applying to the preceding | |||
| be an empty entry in the list of challenges. In practice, this | | challenge, or to be an empty entry in the list of challenges. | |||
| ambiguity does not affect the semantics of the header field value | | In practice, this ambiguity does not affect the semantics of | |||
| and thus is harmless. | | the header field value and thus is harmless. | |||
| 11.6.2. Authorization | 11.6.2. Authorization | |||
| The "Authorization" header field allows a user agent to authenticate | The "Authorization" header field allows a user agent to authenticate | |||
| itself with an origin server -- usually, but not necessarily, after | itself with an origin server - usually, but not necessarily, after | |||
| receiving a 401 (Unauthorized) response. Its value consists of | receiving a 401 (Unauthorized) response. Its value consists of | |||
| credentials containing the authentication information of the user | credentials containing the authentication information of the user | |||
| agent for the realm of the resource being requested. | agent for the realm of the resource being requested. | |||
| Authorization = credentials | Authorization = credentials | |||
| If a request is authenticated and a realm specified, the same | If a request is authenticated and a realm specified, the same | |||
| credentials are presumed to be valid for all other requests within | credentials are presumed to be valid for all other requests within | |||
| this realm (assuming that the authentication scheme itself does not | this realm (assuming that the authentication scheme itself does not | |||
| require otherwise, such as credentials that vary according to a | require otherwise, such as credentials that vary according to a | |||
| challenge value or using synchronized clocks). | challenge value or using synchronized clocks). | |||
| A proxy forwarding a request MUST NOT modify any Authorization fields | A proxy forwarding a request MUST NOT modify any Authorization header | |||
| in that request. See Section 3.2 of [RFC7234] for details of and | fields in that request. See Section 3.5 of [CACHING] for details of | |||
| requirements pertaining to handling of the Authorization field by | and requirements pertaining to handling of the Authorization header | |||
| HTTP caches. | field by HTTP caches. | |||
| 11.6.3. Authentication-Info | 11.6.3. Authentication-Info | |||
| HTTP authentication schemes can use the Authentication-Info response | HTTP authentication schemes can use the Authentication-Info response | |||
| header field to communicate information after the client's | field to communicate information after the client's authentication | |||
| authentication credentials have been accepted. This information can | credentials have been accepted. This information can include a | |||
| include a finalization message from the server (e.g., it can contain | finalization message from the server (e.g., it can contain the server | |||
| the server authentication). | authentication). | |||
| The field value is a list of parameters (name/value pairs), using the | The field value is a list of parameters (name/value pairs), using the | |||
| "auth-param" syntax defined in Section 2.1 of [RFC7235]. This | "auth-param" syntax defined in Section 11.3. This specification only | |||
| specification only describes the generic format; authentication | describes the generic format; authentication schemes using | |||
| schemes using Authentication-Info will define the individual | Authentication-Info will define the individual parameters. The | |||
| parameters. The "Digest" Authentication Scheme, for instance, | "Digest" Authentication Scheme, for instance, defines multiple | |||
| defines multiple parameters in Section 3.5 of [RFC7616]. | parameters in Section 3.5 of [RFC7616]. | |||
| Authentication-Info = #auth-param | Authentication-Info = #auth-param | |||
| The Authentication-Info header field can be used in any HTTP | The Authentication-Info field can be used in any HTTP response, | |||
| response, independently of request method and status code. Its | independently of request method and status code. Its semantics are | |||
| semantics are defined by the authentication scheme indicated by the | defined by the authentication scheme indicated by the Authorization | |||
| Authorization header field ([RFC7235], Section 4.2) of the | header field (Section 11.6.2) of the corresponding request. | |||
| corresponding request. | ||||
| A proxy forwarding a response is not allowed to modify the field | A proxy forwarding a response is not allowed to modify the field | |||
| value in any way. | value in any way. | |||
| Authentication-Info can be used inside trailers ([RFC7230], | Authentication-Info can be sent as a trailer field (Section 6.5) when | |||
| Section 4.1.2) when the authentication scheme explicitly allows this. | the authentication scheme explicitly allows this. | |||
| 11.7. Authenticating Clients to Proxies | 11.7. Authenticating Clients to Proxies | |||
| 11.7.1. Proxy-Authenticate | 11.7.1. Proxy-Authenticate | |||
| The "Proxy-Authenticate" header field consists of at least one | The "Proxy-Authenticate" header field consists of at least one | |||
| challenge that indicates the authentication scheme(s) and parameters | challenge that indicates the authentication scheme(s) and parameters | |||
| applicable to the proxy for this effective request URI (Section 5.5 | applicable to the proxy for this request. A proxy MUST send at least | |||
| of [RFC7230]). A proxy MUST send at least one Proxy-Authenticate | one Proxy-Authenticate header field in each 407 (Proxy Authentication | |||
| header field in each 407 (Proxy Authentication Required) response | Required) response that it generates. | |||
| that it generates. | ||||
| Proxy-Authenticate = 1#challenge | Proxy-Authenticate = #challenge | |||
| Unlike WWW-Authenticate, the Proxy-Authenticate header field applies | Unlike WWW-Authenticate, the Proxy-Authenticate header field applies | |||
| only to the next outbound client on the response chain. This is | 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 | because only the client that chose a given proxy is likely to have | |||
| the credentials necessary for authentication. However, when multiple | the credentials necessary for authentication. However, when multiple | |||
| proxies are used within the same administrative domain, such as | proxies are used within the same administrative domain, such as | |||
| office and regional caching proxies within a large corporate network, | office and regional caching proxies within a large corporate network, | |||
| it is common for credentials to be generated by the user agent and | it is common for credentials to be generated by the user agent and | |||
| passed through the hierarchy until consumed. Hence, in such a | passed through the hierarchy until consumed. Hence, in such a | |||
| configuration, it will appear as if Proxy-Authenticate is being | configuration, it will appear as if Proxy-Authenticate is being | |||
| forwarded because each proxy will send the same challenge set. | forwarded because each proxy will send the same challenge set. | |||
| Note that the parsing considerations for WWW-Authenticate apply to | Note that the parsing considerations for WWW-Authenticate apply to | |||
| this header field as well; see Section 4.1 for details. | this header field as well; see Section 11.6.1 for details. | |||
| 11.7.2. Proxy-Authorization | 11.7.2. Proxy-Authorization | |||
| The "Proxy-Authorization" header field allows the client to identify | The "Proxy-Authorization" header field allows the client to identify | |||
| itself (or its user) to a proxy that requires authentication. Its | itself (or its user) to a proxy that requires authentication. Its | |||
| value consists of credentials containing the authentication | value consists of credentials containing the authentication | |||
| information of the client for the proxy and/or realm of the resource | information of the client for the proxy and/or realm of the resource | |||
| being requested. | being requested. | |||
| Proxy-Authorization = credentials | Proxy-Authorization = credentials | |||
| Unlike Authorization, the Proxy-Authorization header field applies | Unlike Authorization, the Proxy-Authorization header field applies | |||
| only to the next inbound proxy that demanded authentication using the | only to the next inbound proxy that demanded authentication using the | |||
| Proxy-Authenticate field. When multiple proxies are used in a chain, | Proxy-Authenticate header field. When multiple proxies are used in a | |||
| the Proxy-Authorization header field is consumed by the first inbound | chain, the Proxy-Authorization header field is consumed by the first | |||
| proxy that was expecting to receive credentials. A proxy MAY relay | inbound proxy that was expecting to receive credentials. A proxy MAY | |||
| the credentials from the client request to the next proxy if that is | relay the credentials from the client request to the next proxy if | |||
| the mechanism by which the proxies cooperatively authenticate a given | that is the mechanism by which the proxies cooperatively authenticate | |||
| request. | a given request. | |||
| 11.7.3. Proxy-Authentication-Info | 11.7.3. Proxy-Authentication-Info | |||
| The Proxy-Authentication-Info response header field is equivalent to | The Proxy-Authentication-Info response header field is equivalent to | |||
| Authentication-Info, except that it applies to proxy authentication | Authentication-Info, except that it applies to proxy authentication | |||
| ([RFC7235], Section 2) and its semantics are defined by the | (Section 11.3) and its semantics are defined by the authentication | |||
| authentication scheme indicated by the Proxy-Authorization header | scheme indicated by the Proxy-Authorization header field | |||
| field ([RFC7235], Section 4.4) of the corresponding request: | (Section 11.7.2) of the corresponding request: | |||
| Proxy-Authentication-Info = #auth-param | Proxy-Authentication-Info = #auth-param | |||
| However, unlike Authentication-Info, the Proxy-Authentication-Info | However, unlike Authentication-Info, the Proxy-Authentication-Info | |||
| header field applies only to the next outbound client on the response | 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 | chain. This is because only the client that chose a given proxy is | |||
| likely to have the credentials necessary for authentication. | likely to have the credentials necessary for authentication. | |||
| However, when multiple proxies are used within the same | However, when multiple proxies are used within the same | |||
| administrative domain, such as office and regional caching proxies | administrative domain, such as office and regional caching proxies | |||
| within a large corporate network, it is common for credentials to be | within a large corporate network, it is common for credentials to be | |||
| generated by the user agent and passed through the hierarchy until | generated by the user agent and passed through the hierarchy until | |||
| consumed. Hence, in such a configuration, it will appear as if | consumed. Hence, in such a configuration, it will appear as if | |||
| Proxy-Authentication-Info is being forwarded because each proxy will | Proxy-Authentication-Info is being forwarded because each proxy will | |||
| send the same field value. | send the same field value. | |||
| Proxy-Authentication-Info can be sent as a trailer field | ||||
| (Section 6.5) when the authentication scheme explicitly allows this. | ||||
| 12. Content Negotiation | 12. Content Negotiation | |||
| When responses convey payload information, whether indicating a | When responses convey content, whether indicating a success or an | |||
| success or an error, the origin server often has different ways of | error, the origin server often has different ways of representing | |||
| representing that information; for example, in different formats, | that information; for example, in different formats, languages, or | |||
| languages, or encodings. Likewise, different users or user agents | encodings. Likewise, different users or user agents might have | |||
| might have differing capabilities, characteristics, or preferences | differing capabilities, characteristics, or preferences that could | |||
| that could influence which representation, among those available, | influence which representation, among those available, would be best | |||
| would be best to deliver. For this reason, HTTP provides mechanisms | to deliver. For this reason, HTTP provides mechanisms for content | |||
| for content negotiation. | negotiation. | |||
| This specification defines two patterns of content negotiation that | This specification defines three patterns of content negotiation that | |||
| can be made visible within the protocol: "proactive", where the | can be made visible within the protocol: "proactive" negotiation, | |||
| server selects the representation based upon the user agent's stated | where the server selects the representation based upon the user | |||
| preferences, and "reactive" negotiation, where the server provides a | agent's stated preferences, "reactive" negotiation, where the server | |||
| list of representations for the user agent to choose from. | provides a list of representations for the user agent to choose from, | |||
| and "request content" 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", | Other patterns of content negotiation include "conditional content", | |||
| where the representation consists of multiple parts that are | where the representation consists of multiple parts that are | |||
| selectively rendered based on user agent parameters, "active | selectively rendered based on user agent parameters, "active | |||
| content", where the representation contains a script that makes | content", where the representation contains a script that makes | |||
| additional (more specific) requests based on the user agent | additional (more specific) requests based on the user agent | |||
| characteristics, and "Transparent Content Negotiation" ([RFC2295]), | characteristics, and "Transparent Content Negotiation" ([RFC2295]), | |||
| where content selection is performed by an intermediary. These | where content selection is performed by an intermediary. These | |||
| patterns are not mutually exclusive, and each has trade-offs in | patterns are not mutually exclusive, and each has trade-offs in | |||
| applicability and practicality. | applicability and practicality. | |||
| Note that, in all cases, HTTP is not aware of the resource semantics. | Note that, in all cases, HTTP is not aware of the resource semantics. | |||
| The consistency with which an origin server responds to requests, | The consistency with which an origin server responds to requests, | |||
| over time and over the varying dimensions of content negotiation, and | over time and over the varying dimensions of content negotiation, and | |||
| thus the "sameness" of a resource's observed representations over | thus the "sameness" of a resource's observed representations over | |||
| time, is determined entirely by whatever entity or algorithm selects | time, is determined entirely by whatever entity or algorithm selects | |||
| or generates those responses. HTTP pays no attention to the man | or generates those responses. | |||
| behind the curtain. | ||||
| 12.1. Proactive Negotiation | 12.1. Proactive Negotiation | |||
| When content negotiation preferences are sent by the user agent in a | When content negotiation preferences are sent by the user agent in a | |||
| request to encourage an algorithm located at the server to select the | request to encourage an algorithm located at the server to select the | |||
| preferred representation, it is called proactive negotiation (a.k.a., | preferred representation, it is called _proactive negotiation_ | |||
| server-driven negotiation). Selection is based on the available | (a.k.a., _server-driven negotiation_). Selection is based on the | |||
| representations for a response (the dimensions over which it might | available representations for a response (the dimensions over which | |||
| vary, such as language, content-coding, etc.) compared to various | it might vary, such as language, content coding, etc.) compared to | |||
| information supplied in the request, including both the explicit | various information supplied in the request, including both the | |||
| negotiation fields of Section 5.3 and implicit characteristics, such | explicit negotiation header fields below and implicit | |||
| as the client's network address or parts of the User-Agent field. | characteristics, such as the client's network address or parts of the | |||
| User-Agent field. | ||||
| Proactive negotiation is advantageous when the algorithm for | Proactive negotiation is advantageous when the algorithm for | |||
| selecting from among the available representations is difficult to | selecting from among the available representations is difficult to | |||
| describe to a user agent, or when the server desires to send its | 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 | "best guess" to the user agent along with the first response (when | |||
| to avoid the round trip delay of a subsequent request if the "best | that "best guess" is good enough for the user, this avoids the round | |||
| guess" is good enough for the user). In order to improve the | trip delay of a subsequent request). In order to improve the | |||
| server's guess, a user agent MAY send request header fields that | server's guess, a user agent MAY send request header fields that | |||
| describe its preferences. | describe its preferences. | |||
| Proactive negotiation has serious disadvantages: | Proactive negotiation has serious disadvantages: | |||
| o It is impossible for the server to accurately determine what might | * It is impossible for the server to accurately determine what might | |||
| be "best" for any given user, since that would require complete | be "best" for any given user, since that would require complete | |||
| knowledge of both the capabilities of the user agent and the | 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 | intended use for the response (e.g., does the user want to view it | |||
| on screen or print it on paper?); | on screen or print it on paper?); | |||
| o Having the user agent describe its capabilities in every request | * Having the user agent describe its capabilities in every request | |||
| can be both very inefficient (given that only a small percentage | can be both very inefficient (given that only a small percentage | |||
| of responses have multiple representations) and a potential risk | of responses have multiple representations) and a potential risk | |||
| to the user's privacy; | to the user's privacy; | |||
| o It complicates the implementation of an origin server and the | * It complicates the implementation of an origin server and the | |||
| algorithms for generating responses to a request; and, | algorithms for generating responses to a request; and, | |||
| o It limits the reusability of responses for shared caching. | * It limits the reusability of responses for shared caching. | |||
| A user agent cannot rely on proactive negotiation preferences being | A user agent cannot rely on proactive negotiation preferences being | |||
| consistently honored, since the origin server might not implement | consistently honored, since the origin server might not implement | |||
| proactive negotiation for the requested resource or might decide that | proactive negotiation for the requested resource or might decide that | |||
| sending a response that doesn't conform to the user agent's | sending a response that doesn't conform to the user agent's | |||
| preferences is better than sending a 406 (Not Acceptable) response. | preferences is better than sending a 406 (Not Acceptable) response. | |||
| A Vary header field (Section 7.1.4) is often sent in a response | A Vary header field (Section 12.5.5) is often sent in a response | |||
| subject to proactive negotiation to indicate what parts of the | subject to proactive negotiation to indicate what parts of the | |||
| request information were used in the selection algorithm. | request information were used in the selection algorithm. | |||
| The following request header fields are sent by a user agent to | The request header fields Accept, Accept-Charset, Accept-Encoding, | |||
| engage in proactive negotiation of the response content, as defined | and Accept-Language are defined below for a user agent to engage in | |||
| in Section 3.4.1. The preferences sent in these fields apply to any | proactive negotiation of the response content. The preferences sent | |||
| content in the response, including representations of the target | in these fields apply to any content in the response, including | |||
| resource, representations of error or processing status, and | representations of the target resource, representations of error or | |||
| potentially even the miscellaneous text strings that might appear | processing status, and potentially even the miscellaneous text | |||
| within the protocol. | strings that might appear within the protocol. | |||
| 12.2. Reactive Negotiation | 12.2. Reactive Negotiation | |||
| With reactive negotiation (a.k.a., agent-driven negotiation), | With _reactive negotiation_ (a.k.a., _agent-driven negotiation_), | |||
| selection of the best response representation (regardless of the | selection of content (regardless of the status code) is performed by | |||
| status code) is performed by the user agent after receiving an | the user agent after receiving an initial response. The mechanism | |||
| initial response from the origin server that contains a list of | for reactive negotiation might be as simple as a list of references | |||
| resources for alternative representations. If the user agent is not | to alternative representations. | |||
| 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 | If the user agent is not satisfied by the initial response content, | |||
| general, not representations of the resource. The alternative | it can perform a GET request on one or more of the alternative | |||
| representations are only considered representations of the target | resources to obtain a different representation. Selection of such | |||
| resource if the response in which those alternatives are provided has | alternatives might be performed automatically (by the user agent) or | |||
| the semantics of being a representation of the target resource (e.g., | manually (e.g., by the user selecting from a hypertext menu). | |||
| 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 | A server might choose not to send an initial representation, other | |||
| than the list of alternatives, and thereby indicate that reactive | than the list of alternatives, and thereby indicate that reactive | |||
| negotiation by the user agent is preferred. For example, the | negotiation by the user agent is preferred. For example, the | |||
| alternatives listed in responses with the 300 (Multiple Choices) and | alternatives listed in responses with the 300 (Multiple Choices) and | |||
| 406 (Not Acceptable) status codes include information about the | 406 (Not Acceptable) status codes include information about available | |||
| available representations so that the user or user agent can react by | representations so that the user or user agent can react by making a | |||
| making a selection. | selection. | |||
| Reactive negotiation is advantageous when the response would vary | Reactive negotiation is advantageous when the response would vary | |||
| over commonly used dimensions (such as type, language, or encoding), | over commonly used dimensions (such as type, language, or encoding), | |||
| when the origin server is unable to determine a user agent's | when the origin server is unable to determine a user agent's | |||
| capabilities from examining the request, and generally when public | capabilities from examining the request, and generally when public | |||
| caches are used to distribute server load and reduce network usage. | caches are used to distribute server load and reduce network usage. | |||
| Reactive negotiation suffers from the disadvantages of transmitting a | Reactive negotiation suffers from the disadvantages of transmitting a | |||
| list of alternatives to the user agent, which degrades user-perceived | list of alternatives to the user agent, which degrades user-perceived | |||
| latency if transmitted in the header section, and needing a second | latency if transmitted in the header section, and needing a second | |||
| request to obtain an alternate representation. Furthermore, this | request to obtain an alternate representation. Furthermore, this | |||
| specification does not define a mechanism for supporting automatic | specification does not define a mechanism for supporting automatic | |||
| selection, though it does not prevent such a mechanism from being | selection, though it does not prevent such a mechanism from being | |||
| developed as an extension. | developed as an extension. | |||
| 12.3. Request Content Negotiation | 12.3. Request Content Negotiation | |||
| [new] | When content negotiation preferences are sent in a server's response, | |||
| the listed preferences are called _request content negotiation_ | ||||
| because they intend to influence selection of an appropriate content | ||||
| for subsequent requests to that resource. For example, the Accept | ||||
| (Section 12.5.1) and Accept-Encoding (Section 12.5.3) header fields | ||||
| can be sent in a response to indicate preferred media types and | ||||
| content codings for subsequent requests to that resource. | ||||
| 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.4. Content Negotiation Field Features | 12.4. Content Negotiation Field Features | |||
| 12.4.1. Absence | 12.4.1. Absence | |||
| A request without any Accept header field implies that the user agent | For each of the content negotiation fields, a request that does not | |||
| will accept any media type in response. | contain the field implies that the sender has no preference on that | |||
| dimension of negotiation. | ||||
| If the header field is present in a request and | If a content negotiation header field is present in a request and | |||
| none of the available representations for the response have a media | none of the available representations for the response can be | |||
| type that is listed as acceptable, the origin server can either | considered acceptable according to it, the origin server can either | |||
| honor the header field by sending a 406 (Not Acceptable) response or | honor the header field by sending a 406 (Not Acceptable) response or | |||
| disregard the header field by treating the response as if it is not | disregard the header field by treating the response as if it is not | |||
| subject to content negotiation. | subject to content negotiation for that request header field. This | |||
| does not imply, however, that the client will be able to use the | ||||
| representation. | ||||
| | *Note:* A user agent sending these header fields makes it | ||||
| | easier for a server to identify an individual by virtue of the | ||||
| | user agent's request characteristics (Section 17.13). | ||||
| 12.4.2. Quality Values | 12.4.2. Quality Values | |||
| Many of the request header fields for proactive negotiation use a | The content negotiation fields defined by this specification use a | |||
| common parameter, named "q" (case-insensitive), to assign a relative | common parameter, named "q" (case-insensitive), to assign a relative | |||
| "weight" to the preference for that associated kind of content. This | "weight" to the preference for that associated kind of content. This | |||
| weight is referred to as a "quality value" (or "qvalue") because the | weight is referred to as a "quality value" (or "qvalue") because the | |||
| same parameter name is often used within server configurations to | same parameter name is often used within server configurations to | |||
| assign a weight to the relative quality of the various | assign a weight to the relative quality of the various | |||
| representations that can be selected for a resource. | representations that can be selected for a resource. | |||
| The weight is normalized to a real number in the range 0 through 1, | 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 | 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, | value of 0 means "not acceptable". If no "q" parameter is present, | |||
| skipping to change at line 4709 ¶ | skipping to change at page 117, line 38 ¶ | |||
| weight = OWS ";" OWS "q=" qvalue | weight = OWS ";" OWS "q=" qvalue | |||
| qvalue = ( "0" [ "." 0*3DIGIT ] ) | qvalue = ( "0" [ "." 0*3DIGIT ] ) | |||
| / ( "1" [ "." 0*3("0") ] ) | / ( "1" [ "." 0*3("0") ] ) | |||
| A sender of qvalue MUST NOT generate more than three digits after the | A sender of qvalue MUST NOT generate more than three digits after the | |||
| decimal point. User configuration of these values ought to be | decimal point. User configuration of these values ought to be | |||
| limited in the same fashion. | limited in the same fashion. | |||
| 12.4.3. Wildcard Values | 12.4.3. Wildcard Values | |||
| [new] | Most of these header fields, where indicated, define a wildcard value | |||
| ("*") to select unspecified values. If no wildcard is present, | ||||
| values that are not explicitly mentioned in the field are considered | ||||
| unacceptable. Within Vary, the wildcard value means that the | ||||
| variance is unlimited. | ||||
| | *Note:* In practice, using wildcards in content negotiation has | ||||
| | limited practical value, because it is seldom useful to say, | ||||
| | for example, "I prefer image/* more or less than (some other | ||||
| | specific value)". Clients can explicitly request a 406 (Not | ||||
| | Acceptable) 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 response, since the server is | ||||
| | allowed to ignore their preference. | ||||
| 12.5. Content Negotiation Fields | 12.5. Content Negotiation Fields | |||
| 12.5.1. Accept | 12.5.1. Accept | |||
| The "Accept" header field can be used by user agents to specify | The "Accept" header field can be used by user agents to specify their | |||
| response media types that are acceptable. Accept header fields can | preferences regarding response media types. For example, Accept | |||
| be used to indicate that the request is specifically limited to a | header fields can be used to indicate that the request is | |||
| small set of desired types, as in the case of a request for an | specifically limited to a small set of desired types, as in the case | |||
| in-line image. | of a request for an in-line image. | |||
| [new] | When sent by a server in a response, Accept provides information | |||
| about what content types are preferred in the content of a subsequent | ||||
| request to the same resource. | ||||
| Accept = #( media-range [ accept-params ] ) | Accept = #( media-range [ weight ] ) | |||
| media-range = ( "*/*" | media-range = ( "*/*" | |||
| / ( type "/" "*" ) | / ( type "/" "*" ) | |||
| / ( type "/" subtype ) | / ( type "/" subtype ) | |||
| ) *( OWS ";" OWS parameter ) | ) parameters | |||
| accept-params = weight *( accept-ext ) | ||||
| 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 optional applicable media type | |||
| type parameters (e.g., charset), an optional "q" parameter for | parameters (e.g., charset), followed by an optional "q" parameter for | |||
| indicating a relative weight (Section 5.3.1), | indicating a relative weight (Section 12.4.2). | |||
| and then zero or more | Previous specifications allowed additional extension parameters to | |||
| extension parameters. The "q" parameter is necessary if any | appear after the weight parameter. The accept extension grammar | |||
| extensions (accept-ext) are present, since it acts as a separator | (accept-params, accept-ext) has been removed because it had a | |||
| between the two parameter sets. | complicated definition, was not being used in practice, and is more | |||
| easily deployed through new header fields. Senders using weights | ||||
| SHOULD send "q" last (after all media-range parameters). Recipients | ||||
| SHOULD process any parameter named "q" as weight, regardless of | ||||
| parameter ordering. | ||||
| Note: Use of the "q" parameter name to separate media type | | *Note:* Use of the "q" parameter name to control content | |||
| parameters from Accept extension parameters is due to historical | | negotiation is due to historical practice. Although this | |||
| practice. Although this prevents any media type parameter named | | prevents any media type parameter named "q" from being used | |||
| "q" from being used with a media range, such an event is believed | | with a media range, such an event is believed to be unlikely | |||
| to be unlikely given the lack of any "q" parameters in the IANA | | given the lack of any "q" parameters in the IANA media type | |||
| media type registry and the rare usage of any media type | | registry and the rare usage of any media type parameters in | |||
| parameters in Accept. Future media types are discouraged from | | Accept. Future media types are discouraged from registering | |||
| registering any parameter named "q". | | any parameter named "q". | |||
| The example | The example | |||
| Accept: audio/*; q=0.2, audio/basic | Accept: audio/*; q=0.2, audio/basic | |||
| is interpreted as "I prefer audio/basic, but send me any audio type | is interpreted as "I prefer audio/basic, but send me any audio type | |||
| if it is the best available after an 80% markdown in quality". | if it is the best available after an 80% markdown in quality". | |||
| A more elaborate example is | A more elaborate example is | |||
| Accept: text/plain; q=0.5, text/html, | Accept: text/plain; q=0.5, text/html, | |||
| text/x-dvi; q=0.8, text/x-c | text/x-dvi; q=0.8, text/x-c | |||
| Verbally, this would be interpreted as "text/html and text/x-c are | Verbally, this would be interpreted as "text/html and text/x-c are | |||
| the equally preferred media types, but if they do not exist, then | the equally preferred media types, but if they do not exist, then | |||
| send the text/x-dvi representation, and if that does not exist, send | send the text/x-dvi representation, and if that does not exist, send | |||
| the text/plain representation". | the text/plain representation". | |||
| Media ranges can be overridden by more specific media ranges or | Media ranges can be overridden by more specific media ranges or | |||
| specific media types. If more than one media range applies to a | specific media types. If more than one media range applies to a | |||
| given type, the most specific reference has precedence. For example, | given type, the most specific reference has precedence. For example, | |||
| Accept: text/*, text/plain, text/plain;format=flowed, */* | Accept: text/*, text/plain, text/plain;format=flowed, */* | |||
| 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/html;q=0.7, text/html;level=1, | Accept: text/*;q=0.3, text/plain;q=0.7, text/plain;format=flowed, | |||
| text/html;level=2;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/html;level=1 | 1 | | | text/plain;format=flowed | 1 | | |||
| | text/html | 0.7 | | +--------------------------+---------------+ | |||
| | text/plain | 0.3 | | | text/plain | 0.7 | | |||
| | image/jpeg | 0.5 | | +--------------------------+---------------+ | |||
| | text/html;level=2 | 0.4 | | | text/html | 0.3 | | |||
| | text/html;level=3 | 0.7 | | +--------------------------+---------------+ | |||
| +-------------------+---------------+ | | image/jpeg | 0.5 | | |||
| +--------------------------+---------------+ | ||||
| | text/plain;format=fixed | 0.4 | | ||||
| +--------------------------+---------------+ | ||||
| | text/html;level=3 | 0.7 | | ||||
| +--------------------------+---------------+ | ||||
| Note: A user agent might be provided with a default set of quality | Table 5 | |||
| values for certain media ranges. However, unless the user agent is a | ||||
| closed system that cannot interact with other rendering agents, this | | *Note:* A user agent might be provided with a default set of | |||
| default set ought to be configurable by the user. | | quality values for certain media ranges. However, unless the | |||
| | user agent is a closed system that cannot interact with other | ||||
| | rendering agents, this default set ought to be configurable by | ||||
| | the user. | ||||
| 12.5.2. Accept-Charset | 12.5.2. 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 what charsets are acceptable in textual response content. | indicate its preferences for charsets in textual response content. | |||
| This field allows user agents capable of understanding more | For example, this field allows user agents capable of understanding | |||
| comprehensive or special-purpose charsets to signal that capability | more comprehensive or special-purpose charsets to signal that | |||
| to an origin server that is capable of representing information in | capability to an origin server that is capable of representing | |||
| those charsets. | information in those charsets. | |||
| Accept-Charset = 1#( ( charset / "*" ) [ weight ] ) | Accept-Charset = #( ( token / "*" ) [ weight ] ) | |||
| Charset names are defined in Section 3.1.1.2. A user agent MAY | Charset names are defined in Section 8.3.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 5.3.1. | relative preference for that charset, as defined in Section 12.4.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, | ||||
| matches every charset that is not mentioned elsewhere in the | ||||
| Accept-Charset field. If no "*" is present in an Accept-Charset | ||||
| field, then any charsets not explicitly mentioned in the field are | ||||
| considered "not acceptable" to the client. | ||||
| A request without any Accept-Charset header field implies that the | The special value "*", if present in the Accept-Charset header field, | |||
| user agent will accept any charset in response. Most general-purpose | matches every charset that is not mentioned elsewhere in the field. | |||
| user agents do not send Accept-Charset, unless specifically | ||||
| configured to do so, because a detailed list of supported charsets | ||||
| makes it easier for a server to identify an individual by virtue of | ||||
| the user agent's request characteristics (Section 9.7). | ||||
| If an Accept-Charset header field is present in a request and none of | | *Note:* Accept-Charset is deprecated because UTF-8 has become | |||
| the available representations for the response has a charset that is | | nearly ubiquitous and sending a detailed list of user-preferred | |||
| listed as acceptable, the origin server can either honor the header | | charsets wastes bandwidth, increases latency, and makes passive | |||
| field, by sending a 406 (Not Acceptable) response, or disregard the | | fingerprinting far too easy (Section 17.13). Most general- | |||
| header field by treating the resource as if it is not subject to | | purpose user agents do not send Accept-Charset, unless | |||
| content negotiation. | | specifically configured to do so. | |||
| 12.5.3. Accept-Encoding | 12.5.3. Accept-Encoding | |||
| The "Accept-Encoding" header field can be used by user agents to | The "Accept-Encoding" header field can be used to indicate | |||
| indicate what response content-codings (Section 3.1.2.1) are | preferences regarding the use of content codings (Section 8.4.1). | |||
| acceptable in the response. | ||||
| [new] | When sent by a user agent in a request, Accept-Encoding indicates the | |||
| content codings acceptable in a response. | ||||
| [new] | When sent by a server in a response, Accept-Encoding provides | |||
| information about what content codings are preferred in the content | ||||
| 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 (weight) | |||
| representing the preference for that encoding, as defined in | representing the preference for that encoding, as defined in | |||
| Section 5.3.1. The asterisk "*" symbol in an Accept-Encoding field | Section 12.4.2. The asterisk "*" symbol in an Accept-Encoding field | |||
| matches any available content-coding not explicitly listed in the | matches any available content coding not explicitly listed in the | |||
| header field. | field. | |||
| For example, | ||||
| Accept-Encoding: compress, gzip | Examples: | |||
| Accept-Encoding: | ||||
| Accept-Encoding: * | ||||
| Accept-Encoding: compress;q=0.5, gzip;q=1.0 | ||||
| Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0 | ||||
| A request without an Accept-Encoding header field implies that the | Accept-Encoding: compress, gzip | |||
| user agent has no preferences regarding content-codings. Although | Accept-Encoding: | |||
| this allows the server to use any content-coding in a response, it | Accept-Encoding: * | |||
| does not imply that the user agent will be able to correctly process | Accept-Encoding: compress;q=0.5, gzip;q=1.0 | |||
| all encodings. | 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 | |||
| acceptable using these rules: | acceptable using these rules: | |||
| 1. If no Accept-Encoding field is in the request, any content-coding | 1. If no Accept-Encoding header field is in the request, any content | |||
| is considered acceptable by the user agent. | coding 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 | acceptable by default unless specifically excluded by the Accept- | |||
| Accept-Encoding field stating either "identity;q=0" or "*;q=0" | Encoding header field stating either "identity;q=0" or "*;q=0" | |||
| without a more specific entry for "identity". | without a more specific entry for "identity". | |||
| 3. If the representation's content-coding is one of the | 3. If the representation's content coding is one of the content | |||
| content-codings listed in the Accept-Encoding field, 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 5.3.1, a qvalue of 0 means "not acceptable".) | defined in Section 12.4.2, a qvalue of 0 means "not acceptable".) | |||
| 4. If multiple content-codings are acceptable, then the acceptable | A representation could be encoded with multiple content codings. | |||
| content-coding with the highest non-zero qvalue is preferred. | However, most content codings are alternative ways to accomplish the | |||
| same purpose (e.g., data compression). When selecting between | ||||
| multiple content codings that have the same purpose, the acceptable | ||||
| content coding with the highest non-zero qvalue is preferred. | ||||
| An Accept-Encoding header field with a combined field-value that is | An Accept-Encoding header field with a field value that is empty | |||
| 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. | |||
| [new] | ||||
| [new] | When the Accept-Encoding header field is present in a response, it | |||
| indicates what content codings the resource was willing to accept in | ||||
| the associated request. The field value is evaluated the same way as | ||||
| in a request. | ||||
| [new] | Note that this information is specific to the associated request; the | |||
| set of supported encodings might be different for other resources on | ||||
| the same server and could change over time or depend on other aspects | ||||
| of the request (such as the request method). | ||||
| [new] | Servers that fail a request due to an unsupported content coding | |||
| ought to respond with a 415 (Unsupported Media Type) status and | ||||
| include an Accept-Encoding header field in that response, allowing | ||||
| clients to distinguish between issues related to content codings and | ||||
| media types. In order to avoid confusion with issues related to | ||||
| media types, servers that fail a request with a 415 status for | ||||
| reasons unrelated to content codings MUST NOT include the Accept- | ||||
| Encoding header field. | ||||
| Note: Most HTTP/1.0 applications do not recognize or obey qvalues | The most common use of Accept-Encoding is in responses with a 415 | |||
| associated with content-codings. This means that qvalues might | (Unsupported Media Type) status code, in response to optimistic use | |||
| not work and are not permitted with x-gzip or x-compress. | of a content coding by clients. However, the header field can also | |||
| be used to indicate to clients that content codings are supported, to | ||||
| optimize future interactions. For example, a resource might include | ||||
| it in a 2xx (Successful) response when the request content was big | ||||
| enough to justify use of a compression coding but the client failed | ||||
| do so. | ||||
| 12.5.4. Accept-Language | 12.5.4. 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 3.1.3.1. | response. Language tags are defined in Section 8.5.1. | |||
| Accept-Language = 1#( 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 5.3.1. For example, | specified by that range, as defined in Section 12.4.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". | |||
| A request without any Accept-Language header field implies that the | ||||
| user agent will accept any language in response. If the header field | ||||
| is present in a request and none of the available representations for | ||||
| the response have a matching language tag, the origin server can | ||||
| either disregard the header field by treating the response as if it | ||||
| is not subject to content negotiation or honor the header field by | ||||
| sending a 406 (Not Acceptable) response. However, the latter is not | ||||
| encouraged, as doing so can prevent users from accessing content that | ||||
| they might be able to use (with translation software, for example). | ||||
| 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 | |||
| maximize interoperability, many user agents assign each language tag | maximize interoperability, many user agents assign each language tag | |||
| a unique quality value while also listing them in order of decreasing | a unique quality value while also listing them in order of decreasing | |||
| quality. Additional discussion of language priority lists can be | quality. Additional discussion of language priority lists can be | |||
| 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 9.7). | preferences of the user in every request (Section 17.13). | |||
| 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 | does not provide such control to the user MUST NOT send an Accept- | |||
| Accept-Language header field. | Language header field. | |||
| Note: User agents ought to provide guidance to users when setting | | *Note:* User agents ought to provide guidance to users when | |||
| a preference, since users are rarely familiar with the details of | | setting a preference, since users are rarely familiar with the | |||
| language matching as described above. For example, users might | | details of language matching as described above. For example, | |||
| assume that on selecting "en-gb", they will be served any kind of | | users might assume that on selecting "en-gb", they will be | |||
| English document if British English is not available. A user | | served any kind of English document if British English is not | |||
| agent might suggest, in such a case, to add "en" to the list for | | available. A user agent might suggest, in such a case, to add | |||
| better matching behavior. | | "en" to the list for better matching behavior. | |||
| 12.5.5. Vary | 12.5.5. Vary | |||
| The "Vary" header field in a response describes what parts of a | The "Vary" header field in a response describes what parts of a | |||
| request message, aside from the method, Host header field, and | request message, aside from the method and target URI, might have | |||
| request target, might influence the origin server's process for | influenced the origin server's process for selecting the content of | |||
| selecting and representing this response. The value consists of | this response. | |||
| either a single asterisk ("*") or a list of header field names | ||||
| (case-insensitive). | ||||
| Vary = "*" / 1#field-name | Vary = #( "*" / field-name ) | |||
| A Vary field value consisting of a comma-separated list of names | A Vary field value is either the wildcard member "*" or a list of | |||
| indicates that the named request header fields, known as the | request field names, known as the selecting header fields, that might | |||
| selecting header fields, might have a role in selecting the | have had a role in selecting the representation for this response. | |||
| representation. The potential selecting header fields are not | Potential selecting header fields are not limited to fields defined | |||
| limited to those defined by this specification. | by this specification. | |||
| A Vary field value of "*" signals that anything about the request | A list containing the member "*" signals that other aspects of the | |||
| might play a role in selecting the response representation, possibly | request might have played a role in selecting the response | |||
| including elements outside the message syntax (e.g., the client's | representation, possibly including aspects outside the message syntax | |||
| network address). A recipient will not be able to determine whether | (e.g., the client's network address). A recipient will not be able | |||
| this response is appropriate for a later request without forwarding | to determine whether this response is appropriate for a later request | |||
| the request to the origin server. A proxy MUST NOT generate a Vary | without forwarding the request to the origin server. A proxy MUST | |||
| field with a "*" value. | NOT generate "*" in a Vary field value. | |||
| For example, a response that contains | For example, a response that contains | |||
| Vary: accept-encoding, accept-language | Vary: accept-encoding, accept-language | |||
| indicates that the origin server might have used the request's | indicates that the origin server might have used the request's | |||
| Accept-Encoding and Accept-Language fields (or lack thereof) as | Accept-Encoding and Accept-Language header fields (or lack thereof) | |||
| determining factors while choosing the content for this response. | as determining factors while choosing the content for this response. | |||
| An origin server might send Vary with a list of fields for two | A Vary field containing a list of field names has two purposes: | |||
| purposes: | ||||
| 1. To inform cache recipients that they MUST NOT use this response | 1. To inform cache recipients that they MUST NOT use this response | |||
| to satisfy a later request unless the later request has the same | to satisfy a later request unless the later request has the same | |||
| values for the listed fields as the original request (Section 4.1 | values for the listed header fields as the original request | |||
| of [RFC7234]). In other words, Vary expands the cache key | (Section 4.1 of [CACHING]) or reuse of the response has been | |||
| required to match a new request to the stored cache entry. | validated by the origin server. 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 | 2. To inform user agent recipients that this response was subject to | |||
| content negotiation (Section 5.3) and that a different | content negotiation (Section 12) and a different representation | |||
| representation might be sent in a subsequent request if | might be sent in a subsequent request if other values are | |||
| additional parameters are provided in the listed header fields | provided in the listed header fields (proactive negotiation). | |||
| (proactive negotiation). | ||||
| An origin server SHOULD send a Vary header field when its algorithm | An origin server SHOULD generate a Vary header field on a cacheable | |||
| for selecting a representation varies based on aspects of the request | response when it wishes that response to be selectively reused for | |||
| message other than the method and request target, unless the variance | subsequent requests. Generally, that is the case when the response | |||
| cannot be crossed or the origin server has been deliberately | content has been tailored to better fit the preferences expressed by | |||
| configured to prevent cache transparency. For example, there is no | those selecting header fields, such as when an origin server has | |||
| need to send the Authorization field name in Vary because reuse | selected the response's language based on the request's | |||
| across users is constrained by the field definition (Section 4.2 of | Accept-Language header field. | |||
| [RFC7235]). Likewise, an origin server might use Cache-Control | ||||
| directives (Section 5.2 of [RFC7234]) to supplant Vary if it | Vary might be elided when an origin server considers variance in | |||
| considers the variance less significant than the performance cost of | content selection to be less significant than Vary's performance | |||
| Vary's impact on caching. | impact on caching, particularly when reuse is already limited by | |||
| Cache-Control response directives (Section 5.2 of [CACHING]). | ||||
| There is no need to send the Authorization field name in Vary because | ||||
| reuse of that response for a different user is prohibited by the | ||||
| field definition (Section 11.6.2). Likewise, if the response content | ||||
| has been selected or influenced by network region but the origin | ||||
| server wants the cached response to be reused even if recipients move | ||||
| from one region to another, then there is no need for the origin | ||||
| server to indicate such variance in Vary. | ||||
| 13. Conditional Requests | 13. Conditional Requests | |||
| Conditional requests are HTTP requests [RFC7231] that include one or | A conditional request is an HTTP request with one or more request | |||
| more header fields indicating a precondition to be tested before | header fields that indicate a precondition to be tested before | |||
| applying the method semantics to the target resource. Section 5 | applying the request method to the target resource. Section 13.2 | |||
| defines when the preconditions are applied. Section 6 defines the | defines when to evaluate preconditions and their order of precedence | |||
| order of evaluation when more than one precondition is present. | when more than one precondition is present. | |||
| Conditional GET requests are the most efficient mechanism for HTTP | Conditional GET requests are the most efficient mechanism for HTTP | |||
| cache updates [RFC7234]. Conditionals can also be applied to | cache updates [CACHING]. Conditionals can also be applied to state- | |||
| state-changing methods, such as PUT and DELETE, to prevent the "lost | changing methods, such as PUT and DELETE, to prevent the "lost | |||
| update" problem: one client accidentally overwriting the work of | update" problem: one client accidentally overwriting the work of | |||
| another client that has been acting in parallel. | another client that has been acting in parallel. | |||
| 13.1. Preconditions | 13.1. Preconditions | |||
| Conditional request preconditions are based on the state of the | Preconditions are usually defined with respect to a state of the | |||
| target resource as a whole (its current value set) or the state as | target resource as a whole (its current value set) or the state as | |||
| observed in a previously obtained representation (one value in that | observed in a previously obtained representation (one value in that | |||
| set). A resource might have multiple current representations, each | set). If a resource has multiple current representations, each with | |||
| with its own observable state. The conditional request mechanisms | its own observable state, a precondition will assume that the mapping | |||
| assume that the mapping of requests to a "selected representation" | of each request to a selected representation (Section 3.2) is | |||
| (Section 3 of [RFC7231]) will be consistent over time if the server | consistent over time. Regardless, if the mapping is inconsistent or | |||
| intends to take advantage of conditionals. Regardless, if the | the server is unable to select an appropriate representation, then no | |||
| mapping is inconsistent and the server is unable to select the | harm will result when the precondition evaluates to false. | |||
| appropriate representation, then no harm will result when the | ||||
| precondition evaluates to false. | ||||
| The HTTP conditional request header fields [RFC7232] allow a client | Each precondition defined below consists of a comparison between a | |||
| to place a precondition on the state of the target resource, so that | set of validators obtained from prior representations of the target | |||
| the action corresponding to the method semantics will not be applied | resource to the current state of validators for the selected | |||
| if the precondition evaluates to false. Each precondition defined by | representation (Section 8.8). Hence, these preconditions evaluate | |||
| this specification consists of a comparison between a set of | whether the state of the target resource has changed since a given | |||
| validators obtained from prior representations of the target resource | state known by the client. The effect of such an evaluation depends | |||
| to the current state of validators for the selected representation | on the method semantics and choice of conditional, as defined in | |||
| (Section 7.2). Hence, these preconditions evaluate whether the state | Section 13.2. | |||
| 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 5 of | ||||
| [RFC7232]. | ||||
| The conditional request preconditions defined by this specification | Other preconditions, defined by other specifications as extension | |||
| (Section 3) are evaluated when applicable to the recipient | fields, might place conditions on all recipients, on the state of the | |||
| (Section 5) according to their order of precedence (Section 6). | target resource in general, or on a group of resources. For | |||
| instance, the "If" header field in WebDAV can make a request | ||||
| conditional on various aspects of multiple resources, such as locks, | ||||
| if the recipient understands and implements that field ([WEBDAV], | ||||
| Section 10.4). | ||||
| This section defines the syntax and semantics of HTTP/1.1 header | Extensibility of preconditions is only possible when the precondition | |||
| fields for applying preconditions on requests. | can be safely ignored if unknown (like If-Modified-Since), when | |||
| deployment can be assumed for a given use case, or when | ||||
| implementation is signaled by some other property of the target | ||||
| resource. This encourages a focus on mutually agreed deployment of | ||||
| common standards. | ||||
| 13.1.1. If-Match | 13.1.1. If-Match | |||
| The "If-Match" header field makes the request method conditional on | The "If-Match" header field makes the request method conditional on | |||
| the recipient origin server either having at least one current | the recipient origin server either having at least one current | |||
| representation of the target resource, when the field-value is "*", | representation of the target resource, when the field value is "*", | |||
| or having a current representation of the target resource that has an | or having a current representation of the target resource that has an | |||
| entity-tag matching a member of the list of entity-tags provided in | entity-tag matching a member of the list of entity-tags provided in | |||
| the field-value. | the field value. | |||
| An origin server MUST use the strong comparison function when | An origin server MUST use the strong comparison function when | |||
| comparing entity-tags for If-Match (Section 2.3.2), since the client | comparing entity-tags for If-Match (Section 8.8.3.2), since the | |||
| intends this precondition to prevent the method from being applied if | client intends this precondition to prevent the method from being | |||
| there have been any changes to the representation data. | applied if there have been any changes to the representation data. | |||
| If-Match = "*" / 1#entity-tag | If-Match = "*" / #entity-tag | |||
| Examples: | Examples: | |||
| If-Match: "xyzzy" | If-Match: "xyzzy" | |||
| If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz" | If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz" | |||
| If-Match: * | If-Match: * | |||
| If-Match is most often used with state-changing methods (e.g., POST, | If-Match is most often used with state-changing methods (e.g., POST, | |||
| PUT, DELETE) to prevent accidental overwrites when multiple user | PUT, DELETE) to prevent accidental overwrites when multiple user | |||
| agents might be acting in parallel on the same resource (i.e., to | agents might be acting in parallel on the same resource (i.e., to | |||
| prevent the "lost update" problem). It can also be used with safe | prevent the "lost update" problem). In general, it can be used with | |||
| methods to abort a request if the selected representation does not | any method that involves the selection or modification of a | |||
| match one already stored (or partially stored) from a prior request. | representation to abort the request if the selected representation's | |||
| current entity-tag is not a member within the If-Match field value. | ||||
| An origin server that receives an If-Match header field MUST evaluate | When an origin server receives a request that selects a | |||
| the condition prior to performing the method (Section 5). | representation and that request includes an If-Match header field, | |||
| the origin server MUST evaluate the If-Match condition as per | ||||
| Section 13.2 prior to performing the method. | ||||
| If the field-value is "*", the condition is false if the origin | To evaluate a received If-Match header field: | |||
| server does not have a current representation for the target resource. | ||||
| If the field-value is a list of entity-tags, the condition is false | 1. If the field value is "*", the condition is true if the origin | |||
| if none of the listed tags match the entity-tag of the | server has a current representation for the target resource. | |||
| selected representation. | ||||
| An origin server MUST NOT perform the requested method if a received | 2. If the field value is a list of entity-tags, the condition is | |||
| If-Match condition evaluates to false; instead, the origin server | true if any of the listed tags match the entity-tag of the | |||
| MUST respond with either a) the 412 (Precondition Failed) status code | selected representation. | |||
| or b) one of the 2xx (Successful) status codes if the origin server | ||||
| has verified that a state change is being requested and the final | ||||
| state is already reflected in the current state of the target | ||||
| resource (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 a compatible change was made | ||||
| by some other user agent). In the latter case, the origin server | ||||
| MUST NOT send a validator header field in the response unless it can | ||||
| verify that the request is a duplicate of an immediately prior change | ||||
| made by the same user agent. | ||||
| [new] | 3. Otherwise, the condition is false. | |||
| The If-Match header field can be ignored by caches and intermediaries | An origin server that evaluates an If-Match condition MUST NOT | |||
| because it is not applicable to a stored response. | perform the requested method if the condition evaluates to false. | |||
| 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). | ||||
| [new] | Allowing an origin server to send a success response when a change | |||
| 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. | ||||
| A client MAY send an If-Match header field in a GET request to | ||||
| indicate that it would prefer a 412 (Precondition Failed) response if | ||||
| the selected representation does not match. However, this is only | ||||
| useful in range requests (Section 14), for completing a previously | ||||
| received partial representation, when there is no desire for a new | ||||
| representation. If-Range (Section 13.1.5) is better suited for range | ||||
| requests when the client prefers to receive a new representation. | ||||
| A cache or intermediary MAY ignore If-Match because its | ||||
| interoperability features are only necessary for an origin server. | ||||
| Note that an If-Match header field with a list value containing "*" | ||||
| and other values (including other instances of "*") is syntactically | ||||
| invalid (therefore not allowed to be generated) and furthermore is | ||||
| unlikely to be interoperable. | ||||
| 13.1.2. If-None-Match | 13.1.2. If-None-Match | |||
| The "If-None-Match" header field makes the request method conditional | The "If-None-Match" header field makes the request method conditional | |||
| on a recipient cache or origin server either not having any current | on a recipient cache or origin server either not having any current | |||
| representation of the target resource, when the field-value is "*", | representation of the target resource, when the field value is "*", | |||
| or having a selected representation with an entity-tag that does not | or having a selected representation with an entity-tag that does not | |||
| match any of those listed in the field-value. | match any of those listed in the field value. | |||
| A recipient MUST use the weak comparison function when comparing | A recipient MUST use the weak comparison function when comparing | |||
| entity-tags for If-None-Match (Section 2.3.2), since weak entity-tags | entity-tags for If-None-Match (Section 8.8.3.2), since weak entity- | |||
| can be used for cache validation even if there have been changes to | tags can be used for cache validation even if there have been changes | |||
| the representation data. | to the representation data. | |||
| If-None-Match = "*" / 1#entity-tag | If-None-Match = "*" / #entity-tag | |||
| Examples: | Examples: | |||
| If-None-Match: "xyzzy" | If-None-Match: "xyzzy" | |||
| If-None-Match: W/"xyzzy" | If-None-Match: W/"xyzzy" | |||
| If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz" | If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz" | |||
| If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz" | If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz" | |||
| If-None-Match: * | If-None-Match: * | |||
| If-None-Match is primarily used in conditional GET requests to enable | If-None-Match is primarily used in conditional GET requests to enable | |||
| efficient updates of cached information with a minimum amount of | efficient updates of cached information with a minimum amount of | |||
| transaction overhead. When a client desires to update one or more | transaction overhead. When a client desires to update one or more | |||
| stored responses that have entity-tags, the client SHOULD generate an | stored responses that have entity-tags, the client SHOULD generate an | |||
| If-None-Match header field containing a list of those entity-tags | If-None-Match header field containing a list of those entity-tags | |||
| when making a GET request; this allows recipient servers to send a | when making a GET request; this allows recipient servers to send a | |||
| 304 (Not Modified) response to indicate when one of those stored | 304 (Not Modified) response to indicate when one of those stored | |||
| responses matches the selected representation. | responses matches the selected representation. | |||
| If-None-Match can also be used with a value of "*" to prevent an | If-None-Match can also be used with a value of "*" to prevent an | |||
| unsafe request method (e.g., PUT) from inadvertently modifying an | unsafe request method (e.g., PUT) from inadvertently modifying an | |||
| existing representation of the target resource when the client | existing representation of the target resource when the client | |||
| believes that the resource does not have a current representation | believes that the resource does not have a current representation | |||
| (Section 4.2.1 of [RFC7231]). This is a variation on the "lost | (Section 9.2.1). This is a variation on the "lost update" problem | |||
| update" problem that might arise if more than one client attempts to | that might arise if more than one client attempts to create an | |||
| create an initial representation for the target resource. | initial representation for the target resource. | |||
| An origin server that receives an If-None-Match header field MUST | When an origin server receives a request that selects a | |||
| evaluate the condition prior to performing the method (Section 5). | representation and that request includes an If-None-Match header | |||
| field, the origin server MUST evaluate the If-None-Match condition as | ||||
| per Section 13.2 prior to performing the method. | ||||
| [new] | To evaluate a received If-None-Match header field: | |||
| If the field-value is "*", the condition is false if the origin | 1. If the field value is "*", the condition is false if the origin | |||
| server has a current representation for the target resource. | server has a current representation for the target resource. | |||
| If the field-value is a list of entity-tags, the condition is false if | 2. If the field value is a list of entity-tags, the condition is | |||
| one of the listed tags match the entity-tag of the | false if one of the listed tags matches the entity-tag of the | |||
| selected representation. | selected representation. | |||
| [new] | 3. Otherwise, the condition is true. | |||
| An origin server MUST NOT perform the requested method if the | An origin server that evaluates an If-None-Match condition MUST NOT | |||
| condition evaluates to false; instead, the origin server MUST respond | perform the requested method if the condition evaluates to false; | |||
| with either a) the 304 (Not Modified) status code if the request | instead, the origin server MUST respond with either a) the 304 (Not | |||
| method is GET or HEAD or b) the 412 (Precondition Failed) status code | Modified) status code if the request method is GET or HEAD or b) the | |||
| for all other request methods. | 412 (Precondition Failed) status code for all other request methods. | |||
| Requirements on cache handling of a received If-None-Match header | Requirements on cache handling of a received If-None-Match header | |||
| field are defined in Section 4.3.2 of [RFC7234]. | field are defined in Section 4.3.2 of [CACHING]. | |||
| Note that an If-None-Match header field with a list value containing | ||||
| "*" and other values (including other instances of "*") is | ||||
| syntactically invalid (therefore not allowed to be generated) and | ||||
| furthermore is unlikely to be interoperable. | ||||
| 13.1.3. If-Modified-Since | 13.1.3. If-Modified-Since | |||
| The "If-Modified-Since" header field makes a GET or HEAD request | The "If-Modified-Since" header field makes a GET or HEAD request | |||
| method conditional on the selected representation's modification date | method conditional on the selected representation's modification date | |||
| being more recent than the date provided in the field-value. | being more recent than the date provided in the field value. | |||
| Transfer of the selected representation's data is avoided if that | Transfer of the selected representation's data is avoided if that | |||
| data has not changed. | data has not changed. | |||
| If-Modified-Since = HTTP-date | If-Modified-Since = HTTP-date | |||
| An example of the field is: | An example of the field is: | |||
| If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT | If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT | |||
| A recipient MUST ignore If-Modified-Since if the request contains an | A recipient MUST ignore If-Modified-Since if the request contains an | |||
| If-None-Match header field; the condition in If-None-Match is | If-None-Match header field; the condition in If-None-Match is | |||
| considered to be a more accurate replacement for the condition in | considered to be a more accurate replacement for the condition in If- | |||
| If-Modified-Since, and the two are only combined for the sake of | Modified-Since, and the two are only combined for the sake of | |||
| interoperating with older intermediaries that might not implement | interoperating with older intermediaries that might not implement | |||
| If-None-Match. | If-None-Match. | |||
| A recipient MUST ignore the If-Modified-Since header field if the | A recipient MUST ignore the If-Modified-Since header field if the | |||
| received field-value is not a valid HTTP-date, or if the request | received field value is not a valid HTTP-date, the field value has | |||
| method is neither GET nor HEAD. | more than one member, or if the request method is neither GET nor | |||
| HEAD. | ||||
| A recipient MUST interpret an If-Modified-Since field-value's | A recipient MUST ignore the If-Modified-Since header field if the | |||
| resource does not have a modification date available. | ||||
| A recipient MUST interpret an If-Modified-Since field value's | ||||
| timestamp in terms of the origin server's clock. | timestamp in terms of the origin server's clock. | |||
| If-Modified-Since is typically used for two distinct purposes: 1) to | If-Modified-Since is typically used for two distinct purposes: 1) to | |||
| allow efficient updates of a cached representation that does not have | 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 | an entity-tag and 2) to limit the scope of a web traversal to | |||
| resources that have recently changed. | resources that have recently changed. | |||
| When used for cache updates, a cache will typically use the value of | When used for cache updates, a cache will typically use the value of | |||
| the cached message's Last-Modified field to generate the field value | the cached message's Last-Modified header field to generate the field | |||
| of If-Modified-Since. This behavior is most interoperable for cases | value of If-Modified-Since. This behavior is most interoperable for | |||
| where clocks are poorly synchronized or when the server has chosen to | cases where clocks are poorly synchronized or when the server has | |||
| only honor exact timestamp matches (due to a problem with | 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 | 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 | server's clock is corrected or a representation is restored from an | |||
| archived backup). However, caches occasionally generate the field | archived backup). However, caches occasionally generate the field | |||
| value based on other data, such as the Date header field of the | 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, | cached message or the clock time at which the message was received, | |||
| particularly when the cached message does not contain a Last-Modified | particularly when the cached message does not contain a Last-Modified | |||
| field. | header field. | |||
| When used for limiting the scope of retrieval to a recent time | When used for limiting the scope of retrieval to a recent time | |||
| window, a user agent will generate an If-Modified-Since field value | 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 | based on either its own clock or a Date header field received from | |||
| from the server in a prior response. Origin servers that choose an | the server in a prior response. Origin servers that choose an exact | |||
| exact timestamp match based on the selected representation's | timestamp match based on the selected representation's Last-Modified | |||
| Last-Modified field will not be able to help the user agent limit its | header field will not be able to help the user agent limit its data | |||
| data transfers to only those changed during the specified window. | transfers to only those changed during the specified window. | |||
| An origin server that receives an If-Modified-Since header field | When an origin server receives a request that selects a | |||
| SHOULD evaluate the condition prior to performing the method | representation and that request includes an If-Modified-Since header | |||
| (Section 5). | field without an If-None-Match header field, the origin server SHOULD | |||
| evaluate the If-Modified-Since condition as per Section 13.2 prior to | ||||
| performing the method. | ||||
| The origin server SHOULD NOT perform the requested | To evaluate a received If-Modified-Since header field: | |||
| method if the selected representation's last modification date is | ||||
| earlier than or equal to the date provided in the field-value; | 1. If the selected representation's last modification date is | |||
| earlier or equal to the date provided in the field value, the | ||||
| condition is false. | ||||
| 2. Otherwise, the condition is true. | ||||
| An origin server that evaluates an If-Modified-Since condition SHOULD | ||||
| NOT perform the requested method if the condition evaluates to false; | ||||
| instead, the origin server SHOULD generate a 304 (Not Modified) | instead, the origin server SHOULD generate a 304 (Not Modified) | |||
| response, including only those metadata that are useful for | response, including only those metadata that are useful for | |||
| identifying or updating a previously cached response. | identifying or updating a previously cached response. | |||
| Requirements on cache handling of a received If-Modified-Since header | Requirements on cache handling of a received If-Modified-Since header | |||
| field are defined in Section 4.3.2 of [RFC7234]. | field are defined in Section 4.3.2 of [CACHING]. | |||
| 13.1.4. If-Unmodified-Since | 13.1.4. If-Unmodified-Since | |||
| The "If-Unmodified-Since" header field makes the request method | The "If-Unmodified-Since" header field makes the request method | |||
| conditional on the selected representation's last modification date | conditional on the selected representation's last modification date | |||
| being earlier than or equal to the date provided in the field-value. | 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 | This field accomplishes the same purpose as If-Match for cases where | |||
| the user agent does not have an entity-tag for the representation. | the user agent does not have an entity-tag for the representation. | |||
| If-Unmodified-Since = HTTP-date | If-Unmodified-Since = HTTP-date | |||
| An example of the field is: | An example of the field is: | |||
| If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT | If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT | |||
| A recipient MUST ignore If-Unmodified-Since if the request contains | A recipient MUST ignore If-Unmodified-Since if the request contains | |||
| an If-Match header field; the condition in If-Match is considered to | an If-Match header field; the condition in If-Match is considered to | |||
| be a more accurate replacement for the condition in | be a more accurate replacement for the condition in If-Unmodified- | |||
| If-Unmodified-Since, and the two are only combined for the sake of | Since, and the two are only combined for the sake of interoperating | |||
| interoperating with older intermediaries that might not implement | with older intermediaries that might not implement If-Match. | |||
| If-Match. | ||||
| A recipient MUST ignore the If-Unmodified-Since header field if the | A recipient MUST ignore the If-Unmodified-Since header field if the | |||
| received field-value is not a valid HTTP-date. | 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 | A recipient MUST ignore the If-Unmodified-Since header field if the | |||
| resource does not have a modification date available. | ||||
| A recipient MUST interpret an If-Unmodified-Since field value's | ||||
| timestamp in terms of the origin server's clock. | timestamp in terms of the origin server's clock. | |||
| If-Unmodified-Since is most often used with state-changing methods | If-Unmodified-Since is most often used with state-changing methods | |||
| (e.g., POST, PUT, DELETE) to prevent accidental overwrites when | (e.g., POST, PUT, DELETE) to prevent accidental overwrites when | |||
| multiple user agents might be acting in parallel on a resource that | multiple user agents might be acting in parallel on a resource that | |||
| does not supply entity-tags with its representations (i.e., to | does not supply entity-tags with its representations (i.e., to | |||
| prevent the "lost update" problem). It can also be used with safe | prevent the "lost update" problem). In general, it can be used with | |||
| methods to abort a request if the selected representation does not | any method that involves the selection or modification of a | |||
| match one already stored (or partially stored) from a prior request. | representation to abort the request if the selected representation's | |||
| last modification date has changed since the date provided in the If- | ||||
| Unmodified-Since field value. | ||||
| An origin server that receives an If-Unmodified-Since header field | When an origin server receives a request that selects a | |||
| MUST evaluate the condition prior to performing the method | representation and that request includes an If-Unmodified-Since | |||
| (Section 5). | header field without an If-Match header field, the origin server MUST | |||
| evaluate the If-Unmodified-Since condition as per Section 13.2 prior | ||||
| to performing the method. | ||||
| [new] | To evaluate a received If-Unmodified-Since header field: | |||
| [new] | 1. If the selected representation's last modification date is | |||
| earlier than or equal to the date provided in the field value, | ||||
| the condition is true. | ||||
| [new] | 2. Otherwise, the condition is false. | |||
| The origin server MUST NOT perform the requested method | An origin server that evaluates an If-Unmodified-Since condition MUST | |||
| if the selected representation's last modification date is | NOT perform the requested method if the condition evaluates to false. | |||
| more recent than the date provided in the field-value; instead the origin | Instead, the origin server MAY indicate that the conditional request | |||
| server MUST respond with either a) the 412 (Precondition Failed) | failed by responding with a 412 (Precondition Failed) status code. | |||
| status code or b) one of the 2xx (Successful) status codes if the | Alternatively, if the request is a state-changing operation that | |||
| origin server has verified that a state change is being requested and | appears to have already been applied to the selected representation, | |||
| the final state is already reflected in the current state of the | the origin server MAY respond with a 2xx (Successful) status code | |||
| target resource (i.e., the change requested by the user agent has | (i.e., the change requested by the user agent has already succeeded, | |||
| already succeeded, but the user agent might not be aware of that | but the user agent might not be aware of it, perhaps because the | |||
| because the prior response message was lost or a compatible change | prior response was lost or an equivalent change was made by some | |||
| was made by some other user agent). In the latter case, the origin | other user agent). | |||
| server MUST NOT send a validator header field in the response unless | ||||
| it can verify that the request is a duplicate of an immediately prior | ||||
| change made by the same user agent. | ||||
| [new] | Allowing an origin server to send a success response when a change | |||
| 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 | A client MAY send an If-Unmodified-Since header field in a GET | |||
| intermediaries because it is not applicable to a stored response. | request to indicate that it would prefer a 412 (Precondition Failed) | |||
| response if the selected representation has been modified. However, | ||||
| this is only useful in range requests (Section 14), for completing a | ||||
| previously received partial representation, when there is no desire | ||||
| for a new representation. If-Range (Section 13.1.5) is better suited | ||||
| for range requests when the client prefers to receive a new | ||||
| representation. | ||||
| A cache or intermediary MAY ignore If-Unmodified-Since because its | ||||
| interoperability features are only necessary for an origin server. | ||||
| 13.1.5. If-Range | 13.1.5. If-Range | |||
| The "If-Range" header field provides a special conditional request | The "If-Range" header field provides a special conditional request | |||
| mechanism that is similar to the If-Match and If-Unmodified-Since | mechanism that is similar to the If-Match and If-Unmodified-Since | |||
| header fields but that instructs the recipient to ignore the Range | header fields but that instructs the recipient to ignore the Range | |||
| header field if the validator doesn't match, resulting in transfer of | header field if the validator doesn't match, resulting in transfer of | |||
| the new selected representation instead of a 412 (Precondition | the new selected representation instead of a 412 (Precondition | |||
| Failed) response. If-Range is defined in Section 3.2 of [RFC7233]. | Failed) response. | |||
| If a client has a partial copy of a representation and wishes to have | 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 | 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 | Range header field with a conditional GET (using either or both of | |||
| If-Unmodified-Since and If-Match.) However, if the precondition | If-Unmodified-Since and If-Match.) However, if the precondition | |||
| fails because the representation has been modified, the client would | fails because the representation has been modified, the client would | |||
| then have to make a second request to obtain the entire current | then have to make a second request to obtain the entire current | |||
| representation. | representation. | |||
| The "If-Range" header field allows a client to "short-circuit" the | The "If-Range" header field allows a client to "short-circuit" the | |||
| second request. Informally, its meaning is as follows: if the | second request. Informally, its meaning is as follows: if the | |||
| representation is unchanged, send me the part(s) that I am requesting | representation is unchanged, send me the part(s) that I am requesting | |||
| in Range; otherwise, send me the entire representation. | in Range; otherwise, send me the entire representation. | |||
| If-Range = entity-tag / HTTP-date | If-Range = entity-tag / HTTP-date | |||
| A valid entity-tag can be distinguished from a valid HTTP-date by | A valid entity-tag can be distinguished from a valid HTTP-date by | |||
| examining the first two characters for a DQUOTE. | examining the first three characters for a DQUOTE. | |||
| A client MUST NOT generate an If-Range header field in a request that | 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 | does not contain a Range header field. A server MUST ignore an If- | |||
| If-Range header field received in a request that does not contain a | Range header field received in a request that does not contain a | |||
| Range header field. An origin server MUST ignore an If-Range header | Range header field. An origin server MUST ignore an If-Range header | |||
| field received in a request for a target resource that does not | field received in a request for a target resource that does not | |||
| support Range requests. | support Range requests. | |||
| A client MUST NOT generate an If-Range header field containing an | A client MUST NOT generate an If-Range header field containing an | |||
| entity-tag that is marked as weak. A client MUST NOT generate an | entity-tag that is marked as weak. A client MUST NOT generate an If- | |||
| If-Range header field containing an HTTP-date unless the client has | Range header field containing an HTTP-date unless the client has no | |||
| no entity-tag for the corresponding representation and the date is a | entity-tag for the corresponding representation and the date is a | |||
| strong validator in the sense defined by Section 2.2.2 of [RFC7232]. | strong validator in the sense defined by Section 8.8.2.2. | |||
| A server that evaluates an If-Range precondition MUST use the strong | A server that receives an If-Range header field on a Range request | |||
| comparison function when comparing entity-tags (Section 2.3.2 of | MUST evaluate the condition as per Section 13.2 prior to performing | |||
| [RFC7232]) and MUST evaluate the condition as false if an HTTP-date | the method. | |||
| validator is provided that is not a strong validator in the sense | ||||
| defined by Section 2.2.2 of [RFC7232]. | ||||
| [new] | To evaluate a received If-Range header field containing an HTTP-date: | |||
| [new] | 1. If the HTTP-date validator provided is not a strong validator in | |||
| the sense defined by Section 8.8.2.2, the condition is false. | ||||
| [new] | 2. If the HTTP-date validator provided exactly matches the | |||
| Last-Modified field value for the selected representation, the | ||||
| condition is true. | ||||
| [new] | 3. Otherwise, the condition is false. | |||
| [new] | To evaluate a received If-Range header field containing an | |||
| entity-tag: | ||||
| [new] | 1. If the entity-tag validator provided exactly matches the ETag | |||
| field value for the selected representation using the strong | ||||
| comparison function (Section 8.8.3.2), the condition is true. | ||||
| [new] | 2. Otherwise, the condition is false. | |||
| If the validator given in the If-Range header field matches the | A recipient of an If-Range header field MUST ignore the Range header | |||
| current validator for the selected representation of the target | field if the If-Range condition evaluates to false. Otherwise, the | |||
| resource, then the server SHOULD process the Range header field as | recipient SHOULD process the Range header field as requested. | |||
| 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 | Note that the If-Range comparison is by exact match, including when | |||
| validator is an HTTP-date, differs from the "earlier than or equal | the validator is an HTTP-date, and so differs from the "earlier than | |||
| to" comparison used when evaluating an If-Unmodified-Since | or equal to" comparison used when evaluating an If-Unmodified-Since | |||
| conditional. | conditional. | |||
| 13.2. Evaluation of Preconditions | 13.2. Evaluation of Preconditions | |||
| 13.2.1. When to Evaluate | 13.2.1. When to Evaluate | |||
| Except when excluded below, a recipient cache or origin server MUST | Except when excluded below, a recipient cache or origin server MUST | |||
| evaluate received request preconditions after it has successfully | evaluate received request preconditions after it has successfully | |||
| performed its normal request checks and just before it would perform | performed its normal request checks and just before it would process | |||
| the action associated with the request method. A server MUST ignore | the request content (if any) or perform the action associated with | |||
| all received preconditions if its response to the same request | the request method. A server MUST ignore all received preconditions | |||
| without those conditions would have been a status code other than a | if its response to the same request without those conditions, prior | |||
| 2xx (Successful) or 412 (Precondition Failed). In other words, | to processing the request content, would have been a status code | |||
| redirects and failures take precedence over the evaluation of | other than a 2xx (Successful) or 412 (Precondition Failed). In other | |||
| preconditions in conditional requests. | 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 | 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 | cannot act as a cache for requests on the target resource MUST NOT | |||
| evaluate the conditional request header fields defined by this | evaluate the conditional request header fields defined by this | |||
| specification, and it MUST forward them if the request is forwarded, | specification, and it MUST forward them if the request is forwarded, | |||
| since the generating client intends that they be evaluated by a | since the generating client intends that they be evaluated by a | |||
| server that can provide a current representation. Likewise, a server | server that can provide a current representation. Likewise, a server | |||
| MUST ignore the conditional request header fields defined by this | MUST ignore the conditional request header fields defined by this | |||
| specification when received with a request method that does not | specification when received with a request method that does not | |||
| involve the selection or modification of a selected representation, | involve the selection or modification of a selected representation, | |||
| such as CONNECT, OPTIONS, or TRACE. | such as CONNECT, OPTIONS, or TRACE. | |||
| Conditional request header fields that are defined by extensions to | Note that protocol extensions can modify the conditions under which | |||
| HTTP might place conditions on all recipients, on the state of the | preconditions are evaluated or the consequences of their evaluation. | |||
| target resource in general, or on a group of resources. For | For example, the "immutable" cache directive (defined by [RFC8246]) | |||
| instance, the "If" header field in WebDAV can make a request | instructs caches to forgo forwarding conditional requests when they | |||
| conditional on various aspects of multiple resources, such as locks, | hold a fresh response. | |||
| if the recipient understands and implements that field ([RFC4918], | ||||
| Section 10.4). | ||||
| Although conditional request header fields are defined as being | Although conditional request header fields are defined as being | |||
| usable with the HEAD method (to keep HEAD's semantics consistent with | usable with the HEAD method (to keep HEAD's semantics consistent with | |||
| those of GET), there is no point in sending a conditional HEAD | 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 | because a successful response is around the same size as a 304 (Not | |||
| Modified) response and more useful than a 412 (Precondition Failed) | Modified) response and more useful than a 412 (Precondition Failed) | |||
| response. | response. | |||
| 13.2.2. Precedence of Preconditions | 13.2.2. Precedence of Preconditions | |||
| skipping to change at line 5482 ¶ | skipping to change at page 136, line 33 ¶ | |||
| A recipient cache or origin server MUST evaluate the request | A recipient cache or origin server MUST evaluate the request | |||
| preconditions defined by this specification in the following order: | preconditions defined by this specification in the following order: | |||
| 1. When recipient is the origin server and If-Match is present, | 1. When recipient is the origin server and If-Match is present, | |||
| evaluate the If-Match precondition: | evaluate the If-Match precondition: | |||
| * if true, continue to step 3 | * if true, continue to step 3 | |||
| * if false, respond 412 (Precondition Failed) unless it can be | * if false, respond 412 (Precondition Failed) unless it can be | |||
| determined that the state-changing request has already | determined that the state-changing request has already | |||
| succeeded (see Section 3.1) | succeeded (see Section 13.1.1) | |||
| 2. When recipient is the origin server, If-Match is not present, and | 2. When recipient is the origin server, If-Match is not present, and | |||
| If-Unmodified-Since is present, evaluate the If-Unmodified-Since | If-Unmodified-Since is present, evaluate the If-Unmodified-Since | |||
| precondition: | precondition: | |||
| * if true, continue to step 3 | * if true, continue to step 3 | |||
| * if false, respond 412 (Precondition Failed) unless it can be | * if false, respond 412 (Precondition Failed) unless it can be | |||
| determined that the state-changing request has already | determined that the state-changing request has already | |||
| succeeded (see Section 3.4) | succeeded (see Section 13.1.4) | |||
| 3. When If-None-Match is present, evaluate the If-None-Match | 3. When If-None-Match is present, evaluate the If-None-Match | |||
| precondition: | precondition: | |||
| * if true, continue to step 5 | * if true, continue to step 5 | |||
| * if false for GET/HEAD, respond 304 (Not Modified) | * if false for GET/HEAD, respond 304 (Not Modified) | |||
| * if false for other methods, respond 412 (Precondition Failed) | * if false for other methods, respond 412 (Precondition Failed) | |||
| skipping to change at line 5514 ¶ | skipping to change at page 137, line 16 ¶ | |||
| If-Modified-Since is present, evaluate the If-Modified-Since | If-Modified-Since is present, evaluate the If-Modified-Since | |||
| precondition: | precondition: | |||
| * if true, continue to step 5 | * if true, continue to step 5 | |||
| * if false, respond 304 (Not Modified) | * if false, respond 304 (Not Modified) | |||
| 5. When the method is GET and both Range and If-Range are present, | 5. When the method is GET and both Range and If-Range are present, | |||
| evaluate the If-Range precondition: | evaluate the If-Range precondition: | |||
| * if the validator matches and the Range specification is | * if true and the Range is applicable to the selected | |||
| applicable to the selected representation, respond 206 | representation, respond 206 (Partial Content) | |||
| (Partial Content) [RFC7233] | ||||
| * otherwise, ignore the Range header field and respond 200 (OK) | ||||
| 6. Otherwise, | 6. Otherwise, | |||
| * all conditions are met, so perform the requested action and | * perform the requested method and respond according to its | |||
| respond according to its success or failure. | success or failure. | |||
| Any extension to HTTP/1.1 that defines additional conditional request | Any extension to HTTP that defines additional conditional request | |||
| header fields ought to define its own expectations regarding the | header fields ought to define the order for evaluating such fields in | |||
| order for evaluating such fields in relation to those defined in this | relation to those defined in this document and other conditionals | |||
| document and other conditionals that might be found in practice. | that might be found in practice. | |||
| 14. Range Requests | 14. Range Requests | |||
| Hypertext Transfer Protocol (HTTP) clients often encounter | Clients often encounter interrupted data transfers as a result of | |||
| interrupted data transfers as a result of canceled requests or | canceled requests or dropped connections. When a client has stored a | |||
| dropped connections. When a client has stored a partial | partial representation, it is desirable to request the remainder of | |||
| representation, it is desirable to request the remainder of that | that representation in a subsequent request rather than transfer the | |||
| representation in a subsequent request rather than transfer the | ||||
| entire representation. Likewise, devices with limited local storage | entire representation. Likewise, devices with limited local storage | |||
| might benefit from being able to request only a subset of a larger | 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 | representation, such as a single page of a very large document, or | |||
| the dimensions of an embedded image. | the dimensions of an embedded image. | |||
| Range requests are an OPTIONAL | Range requests are an OPTIONAL feature of HTTP, designed so that | |||
| feature of HTTP, designed so that recipients not implementing this | recipients not implementing this feature (or not supporting it for | |||
| feature (or not supporting it for the target resource) can respond as | the target resource) can respond as if it is a normal GET request | |||
| if it is a normal GET request without impacting interoperability. | without impacting interoperability. Partial responses are indicated | |||
| Partial responses are indicated by a distinct status code to not be | by a distinct status code to not be mistaken for full responses by | |||
| mistaken for full responses by caches that might not implement the | caches that might not implement the feature. | |||
| feature. | ||||
| 14.1. Range Units | 14.1. Range Units | |||
| A representation can be partitioned into subranges according to | Representation data can be partitioned into subranges when there are | |||
| various structural units, depending on the structure inherent in the | addressable structural units inherent to that data's content coding | |||
| representation's media type. | 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 "range unit" is used in the Accept-Ranges | This general notion of a _range unit_ is used in the Accept-Ranges | |||
| (Section 2.3) response header field to advertise support for range | (Section 14.3) response header field to advertise support for range | |||
| requests, the Range (Section 3.1) request header field to delineate | requests, the Range (Section 14.2) request header field to delineate | |||
| the parts of a representation that are requested, and the | the parts of a representation that are requested, and the | |||
| Content-Range (Section 4.2) payload header field to describe which | Content-Range (Section 14.4) header field to describe which part of a | |||
| part of a representation is being transferred. | representation is being transferred. | |||
| range-unit = bytes-unit / other-range-unit | ||||
| other-range-unit = token | range-unit = token | |||
| [new] | All range unit names are case-insensitive and ought to be registered | |||
| within the "HTTP Range Unit Registry", as defined in Section 16.5.1. | ||||
| Range units are intended to be extensible. New range units ought to | Range units are intended to be extensible, as described in | |||
| be registered with IANA, as defined in Section 5.1. | Section 16.5. | |||
| 14.1.1. Range Specifiers | 14.1.1. Range Specifiers | |||
| [Ranges are expressed ... | 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 grammar is generic: each range unit is expected to specify | |||
| , | requirements on when int-range, suffix-range, and other-range are | |||
| .] | allowed. | |||
| A byte-range request can specify a single range of bytes or a set of | A range request can specify a single range or a set of ranges within | |||
| ranges within a single representation. | a single representation. | |||
| byte-ranges-specifier = bytes-unit "=" byte-range-set | ranges-specifier = range-unit "=" range-set | |||
| byte-range-set = 1#( byte-range-spec / suffix-byte-range-spec ) | range-set = 1#range-spec | |||
| range-spec = int-range | ||||
| / suffix-range | ||||
| / other-range | ||||
| [new] | 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.). | ||||
| byte-range-spec = first-byte-pos "-" [ last-byte-pos ] | int-range = first-pos "-" [ last-pos ] | |||
| first-byte-pos = 1*DIGIT | first-pos = 1*DIGIT | |||
| last-byte-pos = 1*DIGIT | last-pos = 1*DIGIT | |||
| [new] | An int-range is invalid if the last-pos value is present and less | |||
| than the first-pos. | ||||
| [new] | 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-byte-range-spec = "-" suffix-length | suffix-range = "-" suffix-length | |||
| suffix-length = 1*DIGIT | suffix-length = 1*DIGIT | |||
| [new] | 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. | ||||
| [new] | other-range = 1*( %x21-2B / %x2D-7E ) | |||
| ; 1*(VCHAR excluding comma) | ||||
| 14.1.2. Byte Ranges | 14.1.2. Byte Ranges | |||
| Since representation data is transferred in payloads as a sequence of | The "bytes" range unit is used to express subranges of a | |||
| octets, a byte range is a meaningful substructure for any | representation data's octet sequence. Each byte range is expressed | |||
| representation transferable over HTTP (Section 3 of [RFC7231]). The | as an integer range at some offset, relative to either the beginning | |||
| "bytes" range unit is defined for expressing subranges of the data's | (int-range) or end (suffix-range) of the representation data. Byte | |||
| octet sequence. | ranges do not use the other-range specifier. | |||
| bytes-unit = "bytes" | ||||
| The first-byte-pos value in a byte-range-spec gives the byte-offset | The first-pos value in a bytes int-range gives the offset of the | |||
| of the first byte in a range. The last-byte-pos value gives the | first byte in a range. The last-pos value gives the offset of the | |||
| byte-offset of the last byte in the range; that is, the byte | last byte in the range; that is, the byte positions specified are | |||
| positions specified are inclusive. Byte offsets start at zero. | inclusive. Byte offsets start at zero. | |||
| Examples of byte-ranges-specifier values: | 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. | ||||
| o The first 500 bytes (byte offsets 0-499, inclusive): | Examples of bytes range specifiers: | |||
| bytes=0-499 | * The first 500 bytes (byte offsets 0-499, inclusive): | |||
| o The second 500 bytes (byte offsets 500-999, inclusive): | bytes=0-499 | |||
| bytes=500-999 | * The second 500 bytes (byte offsets 500-999, inclusive): | |||
| A byte-range-spec is invalid if the last-byte-pos value is present | bytes=500-999 | |||
| and less than the first-byte-pos. | ||||
| A client can limit the number of bytes requested without knowing the | A client can limit the number of bytes requested without knowing the | |||
| size of the selected representation. If the last-byte-pos value is | size of the selected representation. If the last-pos value is | |||
| absent, or if the value is greater than or equal to the current | absent, or if the value is greater than or equal to the current | |||
| length of the representation data, the byte range is interpreted as | length of the representation data, the byte range is interpreted as | |||
| the remainder of the representation (i.e., the server replaces the | the remainder of the representation (i.e., the server replaces the | |||
| value of last-byte-pos with a value that is one less than the current | value of last-pos with a value that is one less than the current | |||
| length of the selected representation). | length of the selected representation). | |||
| A client can request the last N bytes of the selected representation | A client can request the last N bytes (N > 0) of the selected | |||
| using a suffix-byte-range-spec. | representation using a suffix-range. If the selected representation | |||
| is shorter than the specified suffix-length, the entire | ||||
| If the selected representation is shorter than the specified | representation is used. | |||
| suffix-length, the entire representation is used. | ||||
| Additional examples, assuming a representation of length 10000: | Additional examples, assuming a representation of length 10000: | |||
| o The final 500 bytes (byte offsets 9500-9999, inclusive): | * The final 500 bytes (byte offsets 9500-9999, inclusive): | |||
| bytes=-500 | bytes=-500 | |||
| Or: | Or: | |||
| bytes=9500- | bytes=9500- | |||
| o The first and last bytes only (bytes 0 and 9999): | * The first and last bytes only (bytes 0 and 9999): | |||
| bytes=0-0,-1 | bytes=0-0,-1 | |||
| o Other valid (but not canonical) specifications of the second 500 | * The first, middle, and last 1000 bytes: | |||
| bytes= 0-999, 4500-5499, -1000 | ||||
| * Other valid (but not canonical) specifications of the second 500 | ||||
| bytes (byte offsets 500-999, inclusive): | bytes (byte offsets 500-999, inclusive): | |||
| bytes=500-600,601-999 | bytes=500-600,601-999 | |||
| bytes=500-700,601-999 | bytes=500-700,601-999 | |||
| If a valid byte-range-set includes at least one byte-range-spec with | If a valid bytes range-set includes at least one range-spec with a | |||
| a first-byte-pos that is less than the current length of the | first-pos that is less than the current length of the representation, | |||
| representation, or at least one suffix-byte-range-spec with a | or at least one suffix-range with a non-zero suffix-length, then the | |||
| non-zero suffix-length, then the byte-range-set is satisfiable. | bytes range-set is satisfiable. Otherwise, the bytes range-set is | |||
| Otherwise, the byte-range-set is unsatisfiable. | unsatisfiable. | |||
| [new] | 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-byte-pos, last-byte-pos, and | In the byte-range syntax, first-pos, last-pos, and suffix-length are | |||
| suffix-length are expressed as decimal number of octets. Since there | expressed as decimal number of octets. Since there is no predefined | |||
| is no predefined limit to the length of a payload, recipients MUST | limit to the length of content, recipients MUST anticipate | |||
| anticipate potentially large decimal numerals and prevent parsing | potentially large decimal numerals and prevent parsing errors due to | |||
| errors due to integer conversion overflows. | integer conversion overflows. | |||
| 14.2. Range | 14.2. Range | |||
| The "Range" header field on a GET request modifies the method | The "Range" header field on a GET request modifies the method | |||
| semantics to request transfer of only one or more subranges of the | semantics to request transfer of only one or more subranges of the | |||
| selected representation data, rather than the entire selected | selected representation data (Section 8.1), rather than the entire | |||
| representation data. | selected representation. | |||
| Range = byte-ranges-specifier / other-ranges-specifier | Range = ranges-specifier | |||
| other-ranges-specifier = other-range-unit "=" other-range-set | ||||
| other-range-set = 1*VCHAR | ||||
| A server MAY ignore the Range header field. However, origin servers | A server MAY ignore the Range header field. However, origin servers | |||
| and intermediate caches ought to support byte ranges when possible, | and intermediate caches ought to support byte ranges when possible, | |||
| since Range supports efficient recovery from partially failed | since they support efficient recovery from partially failed transfers | |||
| transfers and partial retrieval of large representations. A server | and partial retrieval of large representations. | |||
| MUST ignore a Range header field received with a request method other | ||||
| than GET. | ||||
| Although the range request mechanism is designed to allow for | A server MUST ignore a Range header field received with a request | |||
| extensible range types, this specification only defines requests for | method which is unrecognized or for which range handling is not | |||
| byte ranges. | defined. For this specification, GET is the only method for which | |||
| range handling is defined. | ||||
| An origin server MUST ignore a Range header field that contains a | An origin server MUST ignore a Range header field that contains a | |||
| range unit it does not understand. A proxy MAY discard a Range | range unit it does not understand. A proxy MAY discard a Range | |||
| header field that contains a range unit it does not understand. | header field that contains a range unit it does not understand. | |||
| A server that supports range requests MAY ignore or reject a Range | A server that supports range requests MAY ignore or reject a Range | |||
| header field that consists of more than two overlapping ranges, or a | header field that consists of more than two overlapping ranges, or a | |||
| set of many small ranges that are not listed in ascending order, | set of many small ranges that are not listed in ascending order, | |||
| since both are indications of either a broken client or a deliberate | since both are indications of either a broken client or a deliberate | |||
| denial-of-service attack (Section 6.1). A client SHOULD NOT request | denial-of-service attack (Section 17.15). A client SHOULD NOT | |||
| multiple ranges that are inherently less efficient to process and | request multiple ranges that are inherently less efficient to process | |||
| transfer than a single range that encompasses the same data. | 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 content (i.e., the selected | ||||
| representation's data is of zero length). | ||||
| A client that is requesting multiple ranges SHOULD list those ranges | A client that is requesting multiple ranges SHOULD list those ranges | |||
| in ascending order (the order in which they would typically be | in ascending order (the order in which they would typically be | |||
| received in a complete representation) unless there is a specific | received in a complete representation) unless there is a specific | |||
| need to request a later part earlier. For example, a user agent | need to request a later part earlier. For example, a user agent | |||
| processing a large representation with an internal catalog of parts | processing a large representation with an internal catalog of parts | |||
| might need to request later parts first, particularly if the | might need to request later parts first, particularly if the | |||
| representation consists of pages stored in reverse order and the user | representation consists of pages stored in reverse order and the user | |||
| agent wishes to transfer one page at a time. | agent wishes to transfer one page at a time. | |||
| The Range header field is evaluated after evaluating the precondition | The Range header field is evaluated after evaluating the precondition | |||
| header fields defined in [RFC7232], and only if the result in absence | header fields defined in Section 13.1, and only if the result in | |||
| of the Range header field would be a 200 (OK) response. In other | absence of the Range header field would be a 200 (OK) response. In | |||
| words, Range is ignored when a conditional GET would result in a 304 | other words, Range is ignored when a conditional GET would result in | |||
| (Not Modified) response. | a 304 (Not Modified) response. | |||
| The If-Range header field (Section 3.2) can be used as a precondition | The If-Range header field (Section 13.1.5) can be used as a | |||
| to applying the Range header field. | precondition to applying the Range header field. | |||
| If all of the preconditions are true, the server supports the Range | If all of the preconditions are true, the server supports the Range | |||
| header field for the target resource, and the specified range(s) are | header field for the target resource, and the specified range(s) are | |||
| valid and satisfiable (as defined in Section 2.1), the server SHOULD | valid and satisfiable (as defined in Section 14.1.2), the server | |||
| send a 206 (Partial Content) response with a payload containing one | SHOULD send a 206 (Partial Content) response with a content | |||
| or more partial representations that correspond to the satisfiable | containing one or more partial representations that correspond to the | |||
| ranges requested, as defined in Section 4. | satisfiable ranges requested. | |||
| The above does not imply that a server will send all requested | ||||
| ranges. In some cases, it may only be possible (or efficient) to | ||||
| send a portion of the requested ranges first, while expecting the | ||||
| client to re-request the remaining portions later if they are still | ||||
| desired (see Section 15.3.7). | ||||
| If all of the preconditions are true, the server supports the Range | If all of the preconditions are true, the server supports the Range | |||
| header field for the target resource, and the specified range(s) are | header field for the target resource, and the specified range(s) are | |||
| invalid or unsatisfiable, the server SHOULD send a 416 (Range Not | invalid or unsatisfiable, the server SHOULD send a 416 (Range Not | |||
| Satisfiable) response. | Satisfiable) response. | |||
| 14.3. Accept-Ranges | 14.3. Accept-Ranges | |||
| The "Accept-Ranges" header field allows a server to indicate that it | The "Accept-Ranges" field in a response indicates whether an upstream | |||
| supports range requests for the target resource. | server supports range requests for the target resource. | |||
| Accept-Ranges = acceptable-ranges | Accept-Ranges = acceptable-ranges | |||
| acceptable-ranges = 1#range-unit / "none" | acceptable-ranges = 1#range-unit | |||
| An origin server that supports byte-range requests for a given target | For example, a server that supports byte-range requests | |||
| resource MAY send | (Section 14.1.2) can send the field | |||
| Accept-Ranges: bytes | Accept-Ranges: bytes | |||
| to indicate that it supports byte range requests for that target | ||||
| resource, thereby encouraging its use by the client for future | ||||
| partial requests on the same request path. Range units are defined | ||||
| in Section 14.1. | ||||
| to indicate what range units are supported. A client MAY generate | A client MAY generate range requests regardless of having received an | |||
| range requests without having received this header field for the | Accept-Ranges field. The information only provides advice for the | |||
| resource involved. Range units are defined in Section 2. | sake of improving performance and reducing unnecessary network | |||
| transfers. | ||||
| Conversely, a client MUST NOT assume that receiving an Accept-Ranges | ||||
| field means that future range requests will return partial responses. | ||||
| The content might change, the server might only support range | ||||
| requests at certain times or under certain conditions, or a different | ||||
| intermediary might process the next request. | ||||
| A server that does not support any kind of range request for the | A server that does not support any kind of range request for the | |||
| target resource MAY send | target resource MAY send | |||
| Accept-Ranges: none | Accept-Ranges: none | |||
| to advise the client not to attempt a range request. | to advise the client not to attempt a range request on the same | |||
| request path. The range unit "none" is reserved for this purpose. | ||||
| The Accept-Ranges field MAY be sent in a trailer section, but is | ||||
| preferred to be sent as a header field because the information is | ||||
| particularly useful for restarting large information transfers that | ||||
| have failed in mid-content (before the trailer section is received). | ||||
| 14.4. Content-Range | 14.4. Content-Range | |||
| The "Content-Range" header field is sent in a single part 206 | The "Content-Range" header field is sent in a single part 206 | |||
| (Partial Content) response to indicate the partial range of the | (Partial Content) response to indicate the partial range of the | |||
| selected representation enclosed as the message payload, sent in each | selected representation enclosed as the message content, sent in each | |||
| part of a multipart 206 response to indicate the range enclosed | part of a multipart 206 response to indicate the range enclosed | |||
| within each body part, and sent in 416 (Range Not Satisfiable) | within each body part, and sent in 416 (Range Not Satisfiable) | |||
| responses to provide information about the selected representation. | responses to provide information about the selected representation. | |||
| Content-Range = byte-content-range | Content-Range = range-unit SP | |||
| / other-content-range | ( range-resp / unsatisfied-range ) | |||
| byte-content-range = bytes-unit SP | ||||
| ( byte-range-resp / unsatisfied-range ) | ||||
| byte-range-resp = byte-range "/" ( complete-length / "*" ) | range-resp = incl-range "/" ( complete-length / "*" ) | |||
| byte-range = first-byte-pos "-" last-byte-pos | incl-range = first-pos "-" last-pos | |||
| unsatisfied-range = "*/" complete-length | unsatisfied-range = "*/" complete-length | |||
| complete-length = 1*DIGIT | complete-length = 1*DIGIT | |||
| other-content-range = other-range-unit SP other-range-resp | ||||
| other-range-resp = *CHAR | ||||
| If a 206 (Partial Content) response contains a Content-Range header | If a 206 (Partial Content) response contains a Content-Range header | |||
| field with a range unit (Section 2) that the recipient does not | field with a range unit (Section 14.1) that the recipient does not | |||
| understand, the recipient MUST NOT attempt to recombine it with a | understand, the recipient MUST NOT attempt to recombine it with a | |||
| stored representation. A proxy that receives such a message SHOULD | stored representation. A proxy that receives such a message SHOULD | |||
| forward it downstream. | forward it downstream. | |||
| Content-Range might also be sent as a request modifier to request a | ||||
| partial PUT, as described in Section 14.5, based on private | ||||
| agreements between client and origin server. A server MUST ignore a | ||||
| Content-Range header field received in a request with a method for | ||||
| which Content-Range support is not defined. | ||||
| For byte ranges, a sender SHOULD indicate the complete length of the | For byte ranges, a sender SHOULD indicate the complete length of the | |||
| representation from which the range has been extracted, unless the | representation from which the range has been extracted, unless the | |||
| complete length is unknown or difficult to determine. An asterisk | complete length is unknown or difficult to determine. An asterisk | |||
| character ("*") in place of the complete-length indicates that the | character ("*") in place of the complete-length indicates that the | |||
| representation length was unknown when the header field was | representation length was unknown when the header field was | |||
| generated. | generated. | |||
| The following example illustrates when the complete length of the | The following example illustrates when the complete length of the | |||
| selected representation is known by the sender to be 1234 bytes: | selected representation is known by the sender to be 1234 bytes: | |||
| Content-Range: bytes 42-1233/1234 | Content-Range: bytes 42-1233/1234 | |||
| and this second example illustrates when the complete length is | and this second example illustrates when the complete length is | |||
| unknown: | unknown: | |||
| Content-Range: bytes 42-1233/* | Content-Range: bytes 42-1233/* | |||
| A Content-Range field value is invalid if it contains a | A Content-Range field value is invalid if it contains a range-resp | |||
| byte-range-resp that has a last-byte-pos value less than its | that has a last-pos value less than its first-pos value, or a | |||
| first-byte-pos value, or a complete-length value less than or equal | complete-length value less than or equal to its last-pos value. The | |||
| to its last-byte-pos value. The recipient of an invalid | recipient of an invalid Content-Range MUST NOT attempt to recombine | |||
| Content-Range MUST NOT attempt to recombine the received content with | the received content with a stored representation. | |||
| a stored representation. | ||||
| A server generating a 416 (Range Not Satisfiable) response to a | A server generating a 416 (Range Not Satisfiable) response to a byte- | |||
| byte-range request SHOULD send a Content-Range header field with an | range request SHOULD send a Content-Range header field with an | |||
| unsatisfied-range value, as in the following example: | unsatisfied-range value, as in the following example: | |||
| Content-Range: bytes */1234 | Content-Range: bytes */1234 | |||
| The complete-length in a 416 response indicates the current length of | The complete-length in a 416 response indicates the current length of | |||
| the selected representation. | the selected representation. | |||
| The Content-Range header field has no meaning for status codes that | The Content-Range header field has no meaning for status codes that | |||
| do not explicitly describe its semantic. For this specification, | do not explicitly describe its semantic. For this specification, | |||
| only the 206 (Partial Content) and 416 (Range Not Satisfiable) status | only the 206 (Partial Content) and 416 (Range Not Satisfiable) status | |||
| codes describe a meaning for Content-Range. | codes describe a meaning for Content-Range. | |||
| The following are examples of Content-Range values in which the | The following are examples of Content-Range values in which the | |||
| selected representation contains a total of 1234 bytes: | selected representation contains a total of 1234 bytes: | |||
| o The first 500 bytes: | * The first 500 bytes: | |||
| Content-Range: bytes 0-499/1234 | Content-Range: bytes 0-499/1234 | |||
| o The second 500 bytes: | * The second 500 bytes: | |||
| Content-Range: bytes 500-999/1234 | Content-Range: bytes 500-999/1234 | |||
| o All except for the first 500 bytes: | * All except for the first 500 bytes: | |||
| Content-Range: bytes 500-1233/1234 | Content-Range: bytes 500-1233/1234 | |||
| o The last 500 bytes: | * The last 500 bytes: | |||
| Content-Range: bytes 734-1233/1234 | Content-Range: bytes 734-1233/1234 | |||
| 14.5. Partial PUT | 14.5. Partial PUT | |||
| [new] | Some origin servers support PUT of a partial representation when the | |||
| user agent sends a Content-Range header field (Section 14.4) in the | ||||
| request, though such support is inconsistent and depends on private | ||||
| agreements with user agents. In general, it requests that the state | ||||
| of the target resource be partly replaced with the enclosed content | ||||
| at an offset and length indicated by the Content-Range value, where | ||||
| the offset is relative to the current selected representation. | ||||
| [new] | An origin server SHOULD respond with a 400 (Bad Request) status code | |||
| if it receives Content-Range on a PUT for a target resource that does | ||||
| not support partial PUT requests. | ||||
| [new] | Partial PUT is not backwards compatible with the original definition | |||
| of PUT. It may result in the content being written as a complete | ||||
| replacement for the current representation. | ||||
| Partial content updates are possible by targeting a separately | Partial resource updates are also possible by targeting a separately | |||
| identified resource with state that overlaps a portion of | identified resource with state that overlaps or extends 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]). | |||
| 14.6. Media Type multipart/byteranges | 14.6. Media Type multipart/byteranges | |||
| When a 206 (Partial Content) response message includes the content of | When a 206 (Partial Content) response message includes the content of | |||
| multiple ranges, they are transmitted as body parts in a multipart | multiple ranges, they are transmitted as body parts in a multipart | |||
| message body ([RFC2046], Section 5.1) with the media type of | message body ([RFC2046], Section 5.1) with the media type of | |||
| "multipart/byteranges". | "multipart/byteranges". | |||
| skipping to change at line 5890 ¶ | skipping to change at page 146, line 28 ¶ | |||
| 1. Additional CRLFs might precede the first boundary string in the | 1. Additional CRLFs might precede the first boundary string in the | |||
| body. | body. | |||
| 2. Although [RFC2046] permits the boundary string to be quoted, some | 2. Although [RFC2046] permits the boundary string to be quoted, some | |||
| existing implementations handle a quoted boundary string | existing implementations handle a quoted boundary string | |||
| incorrectly. | incorrectly. | |||
| 3. A number of clients and servers were coded to an early draft of | 3. A number of clients and servers were coded to an early draft of | |||
| the byteranges specification that used a media type of multipart/ | the byteranges specification that used a media type of multipart/ | |||
| x-byteranges, which is almost (but not quite) compatible with | x-byteranges , which is almost (but not quite) compatible with | |||
| this type. | this type. | |||
| Despite the name, the "multipart/byteranges" media type is not | Despite the name, the "multipart/byteranges" media type is not | |||
| limited to byte ranges. The following example uses an "exampleunit" | limited to byte ranges. The following example uses an "exampleunit" | |||
| range unit: | range unit: | |||
| HTTP/1.1 206 Partial Content | HTTP/1.1 206 Partial Content | |||
| Date: Tue, 14 Nov 1995 06:25:24 GMT | Date: Tue, 14 Nov 1995 06:25:24 GMT | |||
| Last-Modified: Tue, 14 July 04:58:08 GMT | Last-Modified: Tue, 14 July 04:58:08 GMT | |||
| Content-Length: 2331785 | Content-Length: 2331785 | |||
| Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES | Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES | |||
| --THIS_STRING_SEPARATES | --THIS_STRING_SEPARATES | |||
| Content-Type: video/example | Content-Type: video/example | |||
| Content-Range: exampleunit 1.2-4.3/25 | Content-Range: exampleunit 1.2-4.3/25 | |||
| ...the first range... | ...the first range... | |||
| --THIS_STRING_SEPARATES | --THIS_STRING_SEPARATES | |||
| Content-Type: video/example | Content-Type: video/example | |||
| Content-Range: exampleunit 11.2-14.3/25 | Content-Range: exampleunit 11.2-14.3/25 | |||
| ...the second range | ...the second range | |||
| --THIS_STRING_SEPARATES-- | --THIS_STRING_SEPARATES-- | |||
| The following information serves as the registration form for the | ||||
| multipart/byteranges media type. | ||||
| This document serves as the specification for the Internet media type | ||||
| "multipart/byteranges". The following has been registered with IANA. | ||||
| Type name: multipart | Type name: multipart | |||
| Subtype name: byteranges | Subtype name: byteranges | |||
| Required parameters: boundary | Required parameters: boundary | |||
| Optional parameters: N/A | Optional parameters: N/A | |||
| Encoding considerations: only "7bit", "8bit", or "binary" are | Encoding considerations: only "7bit", "8bit", or "binary" are | |||
| permitted | permitted | |||
| Security considerations: see Section 6 | Security considerations: see Section 17 | |||
| Interoperability considerations: N/A | Interoperability considerations: N/A | |||
| Published specification: This specification (see Appendix A). | Published specification: This specification (see Section 14.6). | |||
| Applications that use this media type: HTTP components supporting | Applications that use this media type: HTTP components supporting | |||
| multiple ranges in a single request. | multiple ranges in a single request. | |||
| Fragment identifier considerations: N/A | Fragment identifier considerations: N/A | |||
| Additional information: | Additional information: Deprecated alias names for this type: N/A | |||
| Deprecated alias names for this type: N/A | ||||
| Magic number(s): N/A | Magic number(s): N/A | |||
| File extension(s): N/A | File extension(s): N/A | |||
| Macintosh file type code(s): N/A | Macintosh file type code(s): N/A | |||
| Person and email address to contact for further information: See | Person and email address to contact for further information: See Aut | |||
| Authors' Addresses section. | hors' Addresses section. | |||
| Intended usage: COMMON | Intended usage: COMMON | |||
| Restrictions on usage: N/A | Restrictions on usage: N/A | |||
| Author: See Authors' Addresses section. | Author: See Authors' Addresses section. | |||
| Change controller: IESG | Change controller: IESG | |||
| 15. Status Codes | 15. Status Codes | |||
| The status-code element is a three-digit integer code giving the | The status code of a response is a three-digit integer code that | |||
| result of the attempt to understand and satisfy the request. | describes the result of the request and the semantics of the | |||
| response, including whether the request was successful and what | ||||
| content is enclosed (if any). All valid status codes are within the | ||||
| range of 100 to 599, inclusive. | ||||
| The first digit of the status-code defines the class of response. | The first digit of the status code defines the class of response. | |||
| The last two digits do not have any categorization role. There are | The last two digits do not have any categorization role. There are | |||
| five values for the first digit: | five values for the first digit: | |||
| o 1xx (Informational): The request was received, continuing process | * 1xx (Informational): The request was received, continuing process | |||
| o 2xx (Successful): The request was successfully received, | * 2xx (Successful): The request was successfully received, | |||
| understood, and accepted | understood, and accepted | |||
| o 3xx (Redirection): Further action needs to be taken in order to | * 3xx (Redirection): Further action needs to be taken in order to | |||
| complete the request | complete the request | |||
| o 4xx (Client Error): The request contains bad syntax or cannot be | * 4xx (Client Error): The request contains bad syntax or cannot be | |||
| fulfilled | fulfilled | |||
| o 5xx (Server Error): The server failed to fulfill an apparently | * 5xx (Server Error): The server failed to fulfill an apparently | |||
| valid request | valid request | |||
| HTTP status codes are extensible. HTTP clients are not required to | HTTP status codes are extensible. A client is 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, with the exception that a | the x00 status code of that class. | |||
| recipient MUST NOT cache a response with an unrecognized status code. | ||||
| For example, if an unrecognized status code of 471 is received by a | For example, if a client receives an unrecognized status code of 471, | |||
| client, the client can assume that there was something wrong with its | it can see from the first digit that there was something wrong with | |||
| request and treat the response as if it had received a 400 (Bad | its request and treat the response as if it had received a 400 (Bad | |||
| Request) status code. The response message will usually contain a | Request) status code. The response message will usually contain a | |||
| representation that explains the status. | representation that explains the status. | |||
| [new] | Values outside the range 100..599 are invalid. Implementations often | |||
| use three-digit integer values outside of that range (i.e., 600..999) | ||||
| for internal communication of non-HTTP status (e.g., library errors). | ||||
| A client that receives a response with an invalid status code SHOULD | ||||
| process the response as if it had a 5xx (Server Error) status code. | ||||
| A single request can have multiple associated responses: zero or more | ||||
| _interim_ (non-final) responses with status codes in the | ||||
| "informational" (1xx) range, followed by exactly one _final_ response | ||||
| with a status code in one of the other ranges. | ||||
| 15.1. Overview of Status Codes | 15.1. Overview of Status Codes | |||
| The status codes listed below are defined in this specification, | The status codes listed below are defined in this specification. The | |||
| Section 4 of [RFC7232], Section 4 of [RFC7233], and Section 3 of | reason phrases listed here are only recommendations - they can be | |||
| [RFC7235]. The | replaced by local equivalents or left out altogether without | |||
| reason phrases listed here are only recommendations -- they can be | affecting the protocol. | |||
| replaced by local equivalents without affecting the protocol. | ||||
| Responses with status codes that are defined as cacheable by default | Responses with status codes that are defined as heuristically | |||
| (e.g., 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, and 501 in | cacheable (e.g., 200, 203, 204, 206, 300, 301, 308, 404, 405, 410, | |||
| this specification) can be reused by a cache with heuristic | 414, and 501 in this specification) can be reused by a cache with | |||
| expiration unless otherwise indicated by the method definition or | heuristic expiration unless otherwise indicated by the method | |||
| explicit cache controls [RFC7234]; all other status codes are not | definition or explicit cache controls [CACHING]; all other status | |||
| cacheable by default. | codes are not heuristically cacheable. | |||
| Note that this list is not exhaustive -- it does not include | Additional status codes, outside the scope of this specification, | |||
| extension status codes defined in other specifications. The complete | have been specified for use in HTTP. All such status codes ought to | |||
| list of status codes is maintained by IANA. See Section 8.2 for | be registered within the "Hypertext Transfer Protocol (HTTP) Status | |||
| details. | Code Registry", as described in Section 16.2. | |||
| 15.2. Informational 1xx | 15.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. Since HTTP/1.0 did not define any 1xx status codes, a | response. 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. | |||
| 1xx responses are terminated by the first empty line after the | A 1xx response is terminated by the end of the header section; it | |||
| status-line (the empty line signaling the end of the header section). | cannot contain content or trailers. | |||
| 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" header field when it forwards a request, then | |||
| not forward the corresponding 100 (Continue) response(s). | it need not forward the corresponding 100 (Continue) response(s). | |||
| 15.2.1. 100 Continue | 15.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 content, as described in | |||
| Section 5.1.1. The client ought to continue sending the request and | Section 10.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. | |||
| 15.2.2. 101 Switching Protocols | 15.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 of [RFC7230]), for a change in | the Upgrade header field (Section 7.8), for a change in the | |||
| the application protocol being used on this connection. The server | application protocol being used on this connection. The server MUST | |||
| MUST generate an Upgrade header field in the response that indicates | generate an Upgrade header field in the response that indicates which | |||
| which protocol(s) will be switched to immediately after the empty | protocol(s) will be in effect after this response. | |||
| line that 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. | |||
| 15.3. Successful 2xx | 15.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 | |||
| request was successfully received, understood, and accepted. | client's request was successfully received, understood, and accepted. | |||
| 15.3.1. 200 OK | 15.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 content 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 content can be summarized as: | |||
| GET a representation of the target resource; | ||||
| HEAD the same representation as GET, but without the representation | ||||
| data; | ||||
| POST a representation of the status of, or results obtained from, | ||||
| the action; | ||||
| PUT, DELETE a representation of the status of the action; | ||||
| OPTIONS a representation of the communications options; | +================+============================================+ | |||
| | request method | response content is a representation of | | ||||
| +================+============================================+ | ||||
| | GET | the target resource | | ||||
| +----------------+--------------------------------------------+ | ||||
| | HEAD | the target resource, like GET, but without | | ||||
| | | transferring the representation data | | ||||
| +----------------+--------------------------------------------+ | ||||
| | POST | the status of, or results obtained from, | | ||||
| | | the action | | ||||
| +----------------+--------------------------------------------+ | ||||
| | PUT, DELETE | the status of the action | | ||||
| +----------------+--------------------------------------------+ | ||||
| | OPTIONS | communication options for the target | | ||||
| | | resource | | ||||
| +----------------+--------------------------------------------+ | ||||
| | TRACE | the request message as received by the | | ||||
| | | server returning the trace | | ||||
| +----------------+--------------------------------------------+ | ||||
| TRACE a representation of the request message as received by the end | Table 6 | |||
| server. | ||||
| Aside from responses to CONNECT, a 200 response always has a payload, | Aside from responses to CONNECT, a 200 response is expected to | |||
| though an origin server MAY generate a payload body of zero length. | contain message content unless the message framing explicitly | |||
| If no payload is desired, an origin server ought to send 204 (No | indicates that the content has zero length. If some aspect of the | |||
| Content) instead. For CONNECT, no payload is allowed because the | request indicates a preference for no content upon success, the | |||
| successful result is a tunnel, which begins immediately after the 200 | origin server ought to send a _204 (No Content)_ response instead. | |||
| response header section. | For CONNECT, there is no content because the successful result is a | |||
| tunnel, which begins immediately after the 200 response header | ||||
| section. | ||||
| A 200 response is cacheable by default; 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 [RFC7234]). | Section 4.2.2 of [CACHING]). | |||
| In 200 (OK) responses to GET or HEAD, an origin server: | ||||
| o SHOULD send an entity-tag validator unless it is not feasible to | ||||
| generate one. | ||||
| 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. | ||||
| o SHOULD send a Last-Modified value if it is feasible to send one. | In 200 responses to GET or HEAD, an origin server SHOULD send any | |||
| available validator fields (Section 8.8) for the selected | ||||
| representation, with both a strong entity-tag and a Last-Modified | ||||
| date being preferred. | ||||
| In other words, the preferred behavior for an origin server is to | In 200 responses to state-changing methods, any validator fields | |||
| send both a strong entity-tag and a Last-Modified value in successful | (Section 8.8) sent in the response convey the current validators for | |||
| responses to a retrieval request. | the new representation formed as a result of successfully applying | |||
| the request semantics. Note that the PUT method (Section 9.3.4) has | ||||
| additional requirements that might preclude sending such validators. | ||||
| 15.3.2. 201 Created | 15.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 effective request URI. | header field is received, by the target URI. | |||
| The 201 response payload typically describes and links to the | The 201 response content typically describes and links to the | |||
| resource(s) created. See Section 7.2 for a discussion of the meaning | resource(s) created. Any validator fields (Section 8.8) sent in the | |||
| and purpose of validator header fields, such as ETag and | response convey the current validators for a new representation | |||
| Last-Modified, in a 201 response. | created by the request. Note that the PUT method (Section 9.3.4) has | |||
| additional requirements that might preclude sending such validators. | ||||
| 15.3.3. 202 Accepted | 15.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. | |||
| 15.3.4. 203 Non-Authoritative Information | 15.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 content 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 5.7.2 of [RFC7230]). This status code allows the | proxy (Section 7.7). This status code allows the proxy to notify | |||
| proxy to notify recipients when a transformation has been applied, | recipients when a transformation has been applied, since that | |||
| since that knowledge might impact later decisions regarding the | knowledge might impact later decisions regarding the content. For | |||
| content. For example, future cache validation requests for the | example, future cache validation requests for the content might only | |||
| content might only be applicable along the same request path (through | be applicable along the same request path (through the same proxies). | |||
| the same proxies). | ||||
| The 203 response is similar to the Warning code of 214 Transformation | ||||
| Applied (Section 5.5 of [RFC7234]), which has the advantage of being | ||||
| applicable to responses with any status code. | ||||
| A 203 response is cacheable by default; 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 [RFC7234]). | Section 4.2.2 of [CACHING]). | |||
| 15.3.5. 204 No Content | 15.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 content. Metadata in the response | |||
| response header fields refer to the target resource and its selected | 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 header field, then the PUT | request and the response contains an ETag field, then the PUT was | |||
| was successful and the ETag field-value contains the entity-tag for | successful and the ETag field value contains the entity-tag for the | |||
| the new representation of that target resource. | new representation of that target resource. | |||
| The 204 response allows a server to indicate that the action has been | The 204 response allows a server to indicate that the action has been | |||
| successfully applied to the target resource, while implying that the | successfully applied to the target resource, while implying that the | |||
| user agent does not need to traverse away from its current "document | user agent does not need to traverse away from its current "document | |||
| view" (if any). The server assumes that the user agent will provide | view" (if any). The server assumes that the user agent will provide | |||
| some indication of the success to its user, in accord with its own | some indication of the success to its user, in accord with its own | |||
| interface, and apply any new or updated metadata in the response to | interface, and apply any new or updated metadata in the response to | |||
| its active representation. | its active representation. | |||
| For example, a 204 status code is commonly used with document editing | For example, a 204 status code is commonly used with document editing | |||
| interfaces corresponding to a "save" action, such that the document | interfaces corresponding to a "save" action, such that the document | |||
| being saved remains available to the user for editing. It is also | being saved remains available to the user for editing. It is also | |||
| 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 end of the header section; it | |||
| fields because it cannot contain a message body. | cannot contain content or trailers. | |||
| A 204 response is cacheable by default; 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 [RFC7234]). | Section 4.2.2 of [CACHING]). | |||
| 15.3.6. 205 Reset Content | 15.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. In | provided, a server MUST NOT generate content in a 205 response. | |||
| other words, a server MUST do one of the following for a 205 | ||||
| response: a) indicate a zero-length body for the response by | ||||
| including a Content-Length header field with a value of 0; b) | ||||
| indicate a zero-length payload for the response by including a | ||||
| Transfer-Encoding header field with a value of chunked and a message | ||||
| body consisting of a single chunk of zero-length; or, c) close the | ||||
| connection immediately after sending the blank line terminating the | ||||
| header section. | ||||
| 15.3.7. 206 Partial Content | 15.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 that | transferring one or more parts of the selected representation. | |||
| correspond to the satisfiable ranges found in the request's Range | ||||
| header field (Section 3.1). | ||||
| When a 206 response is generated, the server MUST generate the | A server that supports range requests (Section 14) will usually | |||
| following header fields, in addition to those required above, if the | attempt to satisfy all of the requested ranges, since sending less | |||
| field would have been sent in a 200 (OK) response to the same | data will likely result in another client request for the remainder. | |||
| request: Date, Cache-Control, ETag, Expires, Content-Location, and | However, a server might want to send only a subset of the data | |||
| Vary. | requested for reasons of its own, such as temporary unavailability, | |||
| cache efficiency, load balancing, etc. Since a 206 response is self- | ||||
| descriptive, the client can still understand a response that only | ||||
| partially satisfies its range request. | ||||
| If a 206 is generated in response to a request with an If-Range | A client MUST inspect a 206 response's Content-Type and Content-Range | |||
| header field, the sender SHOULD NOT generate other representation | field(s) to determine what parts are enclosed and whether additional | |||
| header fields beyond those required above, because the client is | requests are needed. | |||
| understood to already have a prior response containing those header | ||||
| fields. Otherwise, the sender MUST generate all of the | ||||
| representation header fields that would have been sent in a 200 (OK) | ||||
| response to the same request. | ||||
| A 206 response is cacheable by default; i.e., unless otherwise | A server that generates a 206 response MUST generate the following | |||
| header fields, in addition to those required in the subsections | ||||
| below, if the field would have been sent in a 200 (OK) response to | ||||
| the same request: Date, Cache-Control, ETag, Expires, | ||||
| Content-Location, and Vary. | ||||
| A Content-Length header field present in a 206 response indicates the | ||||
| number of octets in the content of this message, which is usually not | ||||
| the complete length of the selected representation. Each | ||||
| Content-Range header field includes information about the selected | ||||
| representation's complete length. | ||||
| A sender that generates a 206 response to a request with an If-Range | ||||
| header field SHOULD NOT generate other representation header fields | ||||
| beyond those required, because the client already has a prior | ||||
| response containing those header fields. Otherwise, a sender MUST | ||||
| generate all of the representation header fields that would have been | ||||
| sent in a 200 (OK) response to the same request. | ||||
| 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 | |||
| [RFC7234]). | [CACHING]). | |||
| 15.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 content | |||
| 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 ... | |||
| 15.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 "multipart/byteranges" content, as defined | |||
| defined in Appendix A, and a Content-Type header field containing the | in Section 14.6, and a Content-Type header field containing the | |||
| multipart/byteranges media type and its required boundary parameter. | multipart/byteranges media type and its required boundary parameter. | |||
| To avoid confusion with single-part responses, a server MUST NOT | To avoid confusion with single-part responses, a server MUST NOT | |||
| generate a Content-Range header field in the HTTP header section of a | generate a Content-Range header field in the HTTP header section of a | |||
| multiple part response (this field will be sent in each part | multiple part response (this field will be sent in each part | |||
| instead). | instead). | |||
| Within the header area of each body part in the multipart payload, | Within the header area of each body part in the multipart content, | |||
| 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 | |||
| (OK) response, the server SHOULD generate that same Content-Type | (OK) response, the server SHOULD generate that same Content-Type | |||
| field in the header area of each body part. For example: | header field in the header area of each body part. 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-Length: 1741 | Content-Length: 1741 | |||
| Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES | Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES | |||
| --THIS_STRING_SEPARATES | --THIS_STRING_SEPARATES | |||
| Content-Type: application/pdf | Content-Type: application/pdf | |||
| Content-Range: bytes 500-999/8000 | Content-Range: bytes 500-999/8000 | |||
| ...the first range... | ...the first range... | |||
| --THIS_STRING_SEPARATES | --THIS_STRING_SEPARATES | |||
| Content-Type: application/pdf | Content-Type: application/pdf | |||
| Content-Range: bytes 7000-7999/8000 | Content-Range: bytes 7000-7999/8000 | |||
| ...the second range | ...the second range | |||
| --THIS_STRING_SEPARATES-- | --THIS_STRING_SEPARATES-- | |||
| When multiple ranges are requested, a server MAY coalesce any of the | When multiple ranges are requested, a server MAY coalesce any of the | |||
| ranges that overlap, or that are separated by a gap that is smaller | ranges that overlap, or that are separated by a gap that is smaller | |||
| than the overhead of sending multiple parts, regardless of the order | than the overhead of sending multiple parts, regardless of the order | |||
| in which the corresponding byte-range-spec appeared in the received | in which the corresponding range-spec appeared in the received Range | |||
| Range header field. Since the typical overhead between parts of a | header field. Since the typical overhead between each part of a | |||
| multipart/byteranges payload is around 80 bytes, depending on the | multipart/byteranges is around 80 bytes, depending on the selected | |||
| selected representation's media type and the chosen boundary | representation's media type and the chosen boundary parameter length, | |||
| parameter length, it can be less efficient to transfer many small | it can be less efficient to transfer many small disjoint parts than | |||
| disjoint parts than it is to transfer the entire selected | it is to transfer the entire selected representation. | |||
| representation. | ||||
| A server MUST NOT generate a multipart response to a request for a | A server MUST NOT generate a multipart response to a request for a | |||
| single range, since a client that does not request multiple parts | single range, since a client that does not request multiple parts | |||
| might not support multipart responses. However, a server MAY | might not support multipart responses. However, a server MAY | |||
| generate a multipart/byteranges payload with only a single body part | generate a multipart/byteranges response with only a single body part | |||
| if multiple ranges were requested and only one range was found to be | if multiple ranges were requested and only one range was found to be | |||
| satisfiable or only one range remained after coalescing. A client | satisfiable or only one range remained after coalescing. A client | |||
| that cannot process a multipart/byteranges response MUST NOT generate | that cannot process a multipart/byteranges response MUST NOT generate | |||
| a request that asks for multiple ranges. | a request that asks for multiple ranges. | |||
| When a multipart response payload is generated, the server SHOULD | A server that generates a multipart response SHOULD send the parts in | |||
| send the parts in the same order that the corresponding | the same order that the corresponding range-spec appeared in the | |||
| byte-range-spec appeared in the received Range header field, | received Range header field, excluding those ranges that were deemed | |||
| excluding those ranges that were deemed unsatisfiable or that were | unsatisfiable or that were coalesced into other ranges. A client | |||
| coalesced into other ranges. A client that receives a multipart | that receives a multipart response MUST inspect the Content-Range | |||
| response MUST inspect the Content-Range header field present in each | header field present in each body part in order to determine which | |||
| body part in order to determine which range is contained in that body | range is contained in that body part; a client cannot rely on | |||
| part; a client cannot rely on receiving the same ranges that it | receiving the same ranges that it requested, nor the same order that | |||
| requested, nor the same order that it requested. | it requested. | |||
| 15.3.7.3. Combining Parts | 15.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 2.1 of [RFC7232]). | same strong validator (Section 8.8.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 | |||
| at least one of the matching stored responses is a 200 (OK), then the | at least one of the matching stored responses is a 200 (OK), then the | |||
| combined response header fields consist of the most recent 200 | combined response header fields consist of the most recent 200 | |||
| response's header fields. If all of the matching stored responses | response's header fields. If all of the matching stored responses | |||
| are 206 responses, then the stored response with the most recent | are 206 responses, then the stored response with the most recent | |||
| header fields is used as the source of header fields for the combined | header fields is used as the source of header fields for the combined | |||
| response, except that the client MUST use other header fields | response, except that the client MUST use other header fields | |||
| provided in the new response, aside from Content-Range, to replace | provided in the new response, aside from Content-Range, to replace | |||
| all instances of the corresponding header fields in the stored | all instances of the corresponding header fields in the stored | |||
| response. | response. | |||
| The combined response message body consists of the union of partial | The combined response content consists of the union of partial | |||
| content ranges in the new response and each of the selected | content ranges within the new response and all of the matching stored | |||
| responses. If the union consists of the entire range of the | responses. If the union consists of the entire range of the | |||
| 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 multipart/byteranges content, 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. | |||
| 15.4. Redirection 3xx | 15.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. | request. There are several types of redirects: | |||
| There are several types of redirects: | ||||
| 1. Redirects that indicate the 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 header field, as in | |||
| status codes 301 (Moved Permanently), 302 (Found), and 307 | the status codes 301 (Moved Permanently), 302 (Found), 307 | |||
| (Temporary Redirect). | (Temporary Redirect), and 308 (Permanent Redirect). | |||
| 2. Redirection that offers a choice of matching resources, each | 2. Redirection that offers a choice among matching resources capable | |||
| capable of representing the original request target, as in the | of representing this resource, as in the 300 (Multiple Choices) | |||
| 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 | header field, that can represent an indirect response to the | |||
| in the 303 (See Other) status code. | request, as in the 303 (See Other) status code. | |||
| 4. Redirection to a previously cached result, as in the 304 (Not | 4. Redirection to a previously stored result, as in the 304 (Not | |||
| Modified) status code. | Modified) status code. | |||
| Note: In HTTP/1.0, the status codes 301 (Moved Permanently) and | | *Note:* In HTTP/1.0, the status codes 301 (Moved Permanently) | |||
| 302 (Found) were defined for the first type of redirect | | and 302 (Found) were originally defined as method-preserving | |||
| ([RFC1945], Section 9.3). Early user agents split on whether the | | ([HTTP/1.0], Section 9.3) to match their implementation at | |||
| method applied to the redirect target would be the same as the | | CERN; 303 (See Other) was defined for a redirection that | |||
| original request or would be rewritten as GET. Although HTTP | | changed its method to GET. However, early user agents split on | |||
| originally defined the former semantics for 301 and 302 (to match | | whether to redirect POST requests as POST (according to then- | |||
| its original implementation at CERN), and defined 303 (See Other) | | current specification) or as GET (the safer alternative when | |||
| to match the latter semantics, prevailing practice gradually | | redirected to a different site). Prevailing practice | |||
| converged on the latter semantics for 301 and 302 as well. The | | eventually converged on changing the method to GET. 307 | |||
| first revision of HTTP/1.1 added 307 (Temporary Redirect) to | | (Temporary Redirect) and 308 (Permanent Redirect) [RFC7538] | |||
| indicate the former semantics without being impacted by divergent | | were later added to unambiguously indicate method-preserving | |||
| practice. Over 10 years later, most user agents still do method | | redirects, and 301/302 have been adjusted to allow a POST | |||
| rewriting for 301 and 302; therefore, this specification makes | | request to be redirected as GET. | |||
| that behavior conformant when the original request is POST. | ||||
| If a Location header field (Section 7.1.2) is provided, the user | If a Location header field (Section 10.2.2) is provided, the user | |||
| agent MAY automatically redirect its request to the URI | agent MAY automatically redirect its request to the URI referenced by | |||
| referenced by the Location field value, even if the specific status | the Location field value, even if the specific status code is not | |||
| code is not understood. Automatic redirection needs to done with | understood. Automatic redirection needs to be done with care for | |||
| care for methods not known to be safe, as defined in Section 4.2.1, | methods not known to be safe, as defined in Section 9.2.1, since the | |||
| since the user might not wish to redirect an unsafe request. | user might not wish to redirect an unsafe request. | |||
| [new] | When automatically following a redirected request, the user agent | |||
| SHOULD resend the original request message with the following | ||||
| modifications: | ||||
| [new] | 1. Replace the target URI with the URI referenced by the redirection | |||
| response's Location header field value after resolving it | ||||
| relative to the original request's target URI. | ||||
| [new] | 2. Remove header fields that were automatically generated by the | |||
| implementation, replacing them with updated values as appropriate | ||||
| to the new request. This includes: | ||||
| [new] | 1. Connection-specific header fields (see Section 7.6.1), | |||
| [new] | 2. Header fields specific to the client's proxy configuration, | |||
| including (but not limited to) Proxy-Authorization, | ||||
| [new] | 3. Origin-specific header fields (if any), including (but not | |||
| limited to) Host, | ||||
| [new] | 4. Validating header fields that were added by the | |||
| implementation's cache (e.g., If-None-Match, | ||||
| If-Modified-Since), | ||||
| [new] | 5. Resource-specific header fields, including (but not limited | |||
| to) Referer, Origin, Authorization, and Cookie. | ||||
| [new] | 3. Consider removing header fields that were not automatically | |||
| generated by the implementation (i.e., those present in the | ||||
| request because they were added by the calling context) where | ||||
| there are security implications; this includes but is not limited | ||||
| to Authorization and Cookie. | ||||
| [new] | 4. Change the request method according to the redirecting status | |||
| code's semantics, if applicable. | ||||
| [new] | 5. If the request method has been changed to GET or HEAD, remove | |||
| content-specific header fields, including (but not limited to) | ||||
| Content-Encoding, Content-Language, Content-Location, | ||||
| Content-Type, Content-Length, Digest, Last-Modified. | ||||
| 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). Content | | maximum of five redirections ([RFC2068], Section 10.3). | |||
| developers need to be aware that some clients might implement such | | Content developers need to be aware that some clients might | |||
| a fixed limitation. | | implement such a fixed limitation. | |||
| 15.4.1. 300 Multiple Choices | 15.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 3.4). | representation(s) for its needs (Section 12). | |||
| 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 | |||
| payload in the 300 response containing a list of representation | content 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 | |||
| from that list automatically if it understands the provided media | from that list automatically if it understands the provided media | |||
| type. A specific format for automatic selection is not defined by | type. A specific format for automatic selection is not defined by | |||
| this specification because HTTP tries to remain orthogonal to the | this specification because HTTP tries to remain orthogonal to the | |||
| definition of its payloads. In practice, the representation is | definition of its content. In practice, the representation is | |||
| provided in some easily parsed format believed to be acceptable to | provided in some easily parsed format believed to be acceptable to | |||
| the user agent, as determined by shared design or content | the user agent, as determined by shared design or content | |||
| negotiation, or in some commonly accepted hypertext format. | negotiation, or in some commonly accepted hypertext format. | |||
| A 300 response is cacheable by default; i.e., unless otherwise | A 300 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 [RFC7234]). | Section 4.2.2 of [CACHING]). | |||
| Note: The original proposal for the 300 status code defined the | | *Note:* The original proposal for the 300 status code defined | |||
| 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 method. | | 406 responses and be transferred in responses to the HEAD | |||
| However, lack of deployment and disagreement over syntax led to | | method. However, lack of deployment and disagreement over | |||
| both URI and Alternates (a subsequent proposal) being dropped from | | syntax led to both URI and Alternates (a subsequent proposal) | |||
| this specification. It is possible to communicate the list using | | being dropped from this specification. It is possible to | |||
| a set of Link header fields [RFC5988], each with a relationship of | | communicate the list as a Link header field value [RFC8288] | |||
| "alternate", though deployment is a chicken-and-egg problem. | | whose members have a relationship of "alternate", though | |||
| | deployment is a chicken-and-egg problem. | ||||
| 15.4.2. 301 Moved Permanently | 15.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 effective request URI to one or more of the new | references to the target URI to one or more of the new references | |||
| 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 | |||
| user agent MAY use the Location field value for automatic | user agent MAY use the Location field value for automatic | |||
| redirection. The server's response payload usually contains a short | redirection. The server's response content usually contains a short | |||
| hypertext note with a hyperlink to the new URI(s). | hypertext note with a hyperlink to the new URI(s). | |||
| Note: For historical reasons, a user agent MAY change the request | | *Note:* For historical reasons, a user agent MAY change the | |||
| method from POST to GET for the subsequent request. If this | | request method from POST to GET for the subsequent request. If | |||
| behavior is undesired, the 307 (Temporary Redirect) status code | | this behavior is undesired, the 308 (Permanent Redirect) status | |||
| can be used instead. | | code can be used instead. | |||
| A 301 response is cacheable by default; 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 [RFC7234]). | Section 4.2.2 of [CACHING]). | |||
| 15.4.3. 302 Found | 15.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 | |||
| effective request 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 content 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 request | | *Note:* For historical reasons, a user agent MAY change the | |||
| method from POST to GET for the subsequent request. If this | | request method from POST to GET for the subsequent request. If | |||
| behavior is undesired, the 307 (Temporary Redirect) status code | | this behavior is undesired, the 307 (Temporary Redirect) status | |||
| can be used instead. | | code can be used instead. | |||
| 15.4.4. 303 See Other | 15.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 | |||
| effective request URI. | target URI. | |||
| This status code is applicable to any HTTP method. It is primarily | This status code is applicable to any HTTP method. It is primarily | |||
| used to allow the output of a POST action to redirect the user agent | used to allow the output of a POST action to redirect the user agent | |||
| to a selected resource, since doing so provides the information | to a different resource, since doing so provides the information | |||
| corresponding to the POST response in a form that can be separately | corresponding to the POST response as a resource that can be | |||
| identified, bookmarked, and cached, independent of the original | separately identified, bookmarked, and cached. | |||
| request. | ||||
| A 303 response to a GET request indicates that the origin server does | A 303 response to a GET request indicates that the origin server does | |||
| not have a representation of the target resource that can be | not have a representation of the target resource that can be | |||
| transferred by the server over HTTP. However, the Location field | transferred by the server over HTTP. However, the Location field | |||
| value refers to a resource that is descriptive of the target | value refers to a resource that is descriptive of the target | |||
| resource, such that making a retrieval request on that other resource | resource, such that making a retrieval request on that other resource | |||
| 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. | |||
| 15.4.5. 304 Not Modified | 15.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 content of a 200 (OK) response. | |||
| The server generating a 304 response MUST generate any of the | The server generating a 304 response MUST generate any of the | |||
| following header fields that would have been sent in a 200 (OK) | following header fields that would have been sent in a 200 (OK) | |||
| response to the same request: Cache-Control, Content-Location, Date, | response to the same request: Cache-Control, Content-Location, Date, | |||
| ETag, Expires, and Vary. | ETag, Expires, and Vary. | |||
| Since the goal of a 304 response is to minimize information transfer | Since the goal of a 304 response is to minimize information transfer | |||
| when the recipient already has one or more cached representations, a | when the recipient already has one or more cached representations, a | |||
| sender SHOULD NOT generate representation metadata other than the | sender SHOULD NOT generate representation metadata other than the | |||
| above listed fields unless said metadata exists for the purpose of | above listed fields unless said metadata exists for the purpose of | |||
| guiding cache updates (e.g., Last-Modified might be useful if the | guiding cache updates (e.g., Last-Modified might be useful if the | |||
| response does not have an ETag field). | response does not have an ETag field). | |||
| 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 [RFC7234]. 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 is terminated by the end of the header section; it | |||
| by the first empty line after the header fields. | cannot contain content or trailers. | |||
| 15.4.6. 305 Use Proxy | 15.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 | |||
| this specification and is now deprecated (Appendix B). | of this specification and is now deprecated (Appendix B of | |||
| [RFC7231]). | ||||
| 15.4.7. 306 (Unused) | 15.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. | |||
| 15.4.7. 307 Temporary Redirect | 15.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 effective request URI | the client ought to continue using the original target URI for future | |||
| 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 content usually contains a short hypertext note with a | |||
| hyperlink to the different URI(s). | hyperlink to the different URI(s). | |||
| Note: This status code is similar to 302 (Found), except that it | ||||
| does not allow changing the request method from POST to GET. This | ||||
| specification defines no equivalent counterpart for 301 (Moved | ||||
| Permanently) ([RFC7238], however, defines the status code 308 | ||||
| (Permanent Redirect) for this purpose). | ||||
| 15.4.9. 308 Permanent Redirect | 15.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 effective request URI (Section 5.5 of [RFC7230]) to | references to the target URI to one or more of the new references | |||
| 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 ([RFC7231], | The server SHOULD generate a Location header field in the response | |||
| Section 7.1.2) in the response containing a preferred URI reference | containing a preferred URI reference for the new permanent URI. The | |||
| for the new permanent URI. The user agent MAY use the Location field | user agent MAY use the Location field value for automatic | |||
| value for automatic redirection. The server's response payload | redirection. The server's response content usually contains a short | |||
| usually contains a short hypertext note with a hyperlink to the new | hypertext note with a hyperlink to the new URI(s). | |||
| URI(s). | ||||
| A 308 response is cacheable by default; 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 | |||
| [RFC7234], Section 4.2.2). | Section 4.2.2 of [CACHING]). | |||
| Note: This status code is similar to 301 (Moved Permanently) | | *Note:* This status code is much younger (June 2014) than its | |||
| ([RFC7231], Section 6.4.2), except that it does not allow changing | | sibling codes, and thus might not be recognized everywhere. | |||
| the request method from POST to GET. | | See Section 4 of [RFC7538] for deployment considerations. | |||
| 15.5. Client Error 4xx | 15.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 | |||
| seems to have erred. Except when responding to a HEAD request, the | client seems to have erred. Except when responding to a HEAD | |||
| server SHOULD send a representation containing an explanation of the | request, the server SHOULD send a representation containing an | |||
| error situation, and whether it is a temporary or permanent | explanation of the error situation, and whether it is a temporary or | |||
| condition. These status codes are applicable to any request method. | permanent condition. These status codes are applicable to any | |||
| User agents SHOULD display any included representation to the user. | request method. User agents SHOULD display any included | |||
| representation to the user. | ||||
| 15.5.1. 400 Bad Request | 15.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 | |||
| will not process the request due to something that is perceived to be | or will not process the request due to something that is perceived to | |||
| a client error (e.g., malformed request syntax, invalid request | be a client error (e.g., malformed request syntax, invalid request | |||
| message framing, or deceptive request routing). | message framing, or deceptive request routing). | |||
| 15.5.2. 401 Unauthorized | 15.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 | |||
| been applied because it lacks valid authentication credentials for | not been applied because it lacks valid authentication credentials | |||
| the target resource. The server generating a 401 response MUST send | for the target resource. The server generating a 401 response MUST | |||
| a WWW-Authenticate header field (Section 4.1) containing at least one | send a WWW-Authenticate header field (Section 11.6.1) containing at | |||
| challenge applicable to the target resource. | least 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 4.2). If the 401 | replaced Authorization header field (Section 11.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. | |||
| 15.5.3. 402 Payment Required | 15.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. | |||
| 15.5.4. 403 Forbidden | 15.5.4. 403 Forbidden | |||
| The 403 (Forbidden) status code indicates that the server understood | The _403 (Forbidden)_ status code indicates that the server | |||
| the request but refuses to authorize it. A server that wishes to | understood the request but refuses to fulfill it. A server that | |||
| make public why the request has been forbidden can describe that | wishes to make public why the request has been forbidden can describe | |||
| reason in the response payload (if any). | that reason in the response content (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). | |||
| 15.5.5. 404 Not Found | 15.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 | |||
| not find a current representation for the target resource or is not | did not find a current representation for the target resource or is | |||
| willing to disclose that one exists. A 404 status code does not | 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 cacheable by default; 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 [RFC7234]). | Section 4.2.2 of [CACHING]). | |||
| 15.5.6. 405 Method Not Allowed | 15.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 cacheable by default; 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 [RFC7234]). | Section 4.2.2 of [CACHING]). | |||
| 15.5.7. 406 Not Acceptable | 15.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 5.3), and the server | header fields received in the request (Section 12.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 content 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 6.4.1. | Section 15.4.1. | |||
| 15.5.8. 407 Proxy Authentication Required | 15.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 | |||
| (Unauthorized), but it indicates that the client needs to | 401 (Unauthorized), but it indicates that the client needs to | |||
| authenticate itself in order to use a proxy. The proxy MUST send a | authenticate itself in order to use a proxy for this request. The | |||
| Proxy-Authenticate header field (Section 4.3) containing a challenge | proxy MUST send a Proxy-Authenticate header field (Section 11.7.1) | |||
| applicable to that proxy for the target resource. The client MAY | containing a challenge applicable to that proxy for the request. The | |||
| repeat the request with a new or replaced Proxy-Authorization header | client MAY repeat the request with a new or replaced | |||
| field (Section 4.4). | Proxy-Authorization header field (Section 11.7.2). | |||
| 15.5.9. 408 Request Timeout | 15.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. A server SHOULD send the "close" connection option | prepared to wait. | |||
| (Section 6.1 of [RFC7230]) in the response, since 408 implies that | ||||
| the server has decided to close the connection rather than continue | If the client has an outstanding request in transit, it MAY repeat | |||
| waiting. If the client has an outstanding request in transit, the | that request. If the current connection is not usable (e.g., as it | |||
| client MAY repeat that request on a new connection. | would be in HTTP/1.1, because request delimitation is lost), a new | |||
| connection will be used. | ||||
| 15.5.10. 409 Conflict | 15.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 content 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. | |||
| 15.5.11. 410 Gone | 15.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 | |||
| intentionally unavailable and that the server owners desire that | intentionally unavailable and that the server owners desire that | |||
| remote links to that resource be removed. Such an event is common | remote links to that resource be removed. Such an event is common | |||
| 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 cacheable by default; 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 [RFC7234]). | Section 4.2.2 of [CACHING]). | |||
| 15.5.12. 411 Length Required | 15.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 3.3.2 of [RFC7230]). The client MAY repeat the request if | (Section 8.6). The client MAY repeat the request if it adds a valid | |||
| it adds a valid Content-Length header field containing the length of | Content-Length header field containing the length of the request | |||
| the message body in the request message. | content. | |||
| 15.5.13. 412 Precondition Failed | 15.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 | |||
| conditions given in the request header fields evaluated to false when | more conditions given in the request header fields evaluated to false | |||
| tested on the server. This response code allows the client to place | when tested on the server (Section 13). This response status code | |||
| preconditions on the current resource state (its current | allows the client to place preconditions on the current resource | |||
| representations and metadata) and, thus, prevent the request method | state (its current representations and metadata) and, thus, prevent | |||
| from being applied if the target resource is in an unexpected state. | the request method from being applied if the target resource is in an | |||
| unexpected state. | ||||
| 15.5.14. 413 Payload Too Large | 15.5.14. 413 Content Too Large | |||
| The 413 (Payload Too Large) status code indicates that the server is | The _413 (Content Too Large)_ status code indicates that the server | |||
| refusing to process a request because the request payload is larger | is refusing to process a request because the request content is | |||
| than the server is willing or able to process. The server MAY close | larger than the server is willing or able to process. The server MAY | |||
| the connection to prevent the client from continuing the request. | terminate the request, if the protocol version in use allows it; | |||
| 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. | |||
| 15.5.15. 414 URI Too Long | 15.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 request-target (Section | refusing to service the request because the target URI is longer than | |||
| 5.3 of [RFC7230]) is longer than the server is willing to interpret. | the server is willing to interpret. This rare condition is only | |||
| This rare condition is only likely to occur when a client has | likely to occur when a client has improperly converted a POST request | |||
| improperly converted a POST request to a GET request with long query | to a GET request with long query information, when the client has | |||
| information, when the client has descended into a "black hole" of | descended into a "black hole" of redirection (e.g., a redirected URI | |||
| redirection (e.g., a redirected URI prefix that points to a suffix of | prefix that points to a suffix of itself) or when the server is under | |||
| itself) or when the server is under attack by a client attempting to | attack by a client attempting to exploit potential security holes. | |||
| exploit potential security holes. | ||||
| A 414 response is cacheable by default; 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 [RFC7234]). | Section 4.2.2 of [CACHING]). | |||
| 15.5.16. 415 Unsupported Media Type | 15.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 content | |||
| 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. | |||
| [new] | If the problem was caused by an unsupported content coding, the | |||
| Accept-Encoding response header field (Section 12.5.3) ought to be | ||||
| used to indicate what (if any) content codings would have been | ||||
| accepted in the request. | ||||
| [new] | On the other hand, if the cause was an unsupported media type, the | |||
| Accept response header field (Section 12.5.1) can be used to indicate | ||||
| what media types would have been accepted in the request. | ||||
| 15.5.17. 416 Range Not Satisfiable | 15.5.17. 416 Range Not Satisfiable | |||
| The 416 (Range Not Satisfiable) status code indicates that none of | The _416 (Range Not Satisfiable)_ status code indicates that the set | |||
| the ranges in the request's Range header field (Section 3.1) overlap | of ranges in the request's Range header field (Section 14.2) has been | |||
| the current extent of the selected resource or that the set of ranges | rejected either because none of the requested ranges are satisfiable | |||
| requested has been rejected due to invalid ranges or an excessive | or because the client has requested an excessive number of small or | |||
| request of small or overlapping ranges. | overlapping ranges (a potential denial of service attack). | |||
| For byte ranges, failing to overlap the current extent means that the | Each range unit defines what is required for its own range sets to be | |||
| first-byte-pos of all of the byte-range-spec values were greater than | satisfiable. For example, Section 14.1.2 defines what makes a bytes | |||
| the current length of the selected representation. | range set satisfiable. | |||
| When this status code is generated in response to a byte-range | A server that generates a 416 response to a byte-range request SHOULD | |||
| request, the sender SHOULD generate a Content-Range header field | generate a Content-Range header field specifying the current length | |||
| specifying the current length of the selected representation | of the selected representation (Section 14.4). | |||
| (Section 4.2). | ||||
| 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 simply 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 range request until they have | |||
| received a complete representation. Thus, clients cannot depend | | received a complete representation. Thus, clients cannot | |||
| on receiving a 416 (Range Not Satisfiable) response even when it | | depend on receiving a 416 (Range Not Satisfiable) response even | |||
| is most appropriate. | | when it is most appropriate. | |||
| 15.5.18. 417 Expectation Failed | 15.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 5.1.1) could not be met by at least one of the inbound | (Section 10.1.1) could not be met by at least one of the inbound | |||
| servers. | servers. | |||
| 15.5.19. 418 (Unused) | 15.5.19. 418 (Unused) | |||
| [new] | [RFC2324] was an April 1 RFC that lampooned the various ways HTTP was | |||
| abused; one such abuse was the definition of an application-specific | ||||
| 418 status code. In the intervening years, this status code has been | ||||
| widely implemented as an "Easter Egg", and therefore is effectively | ||||
| consumed by this use. | ||||
| [new] | Therefore, the 418 status code is reserved in the IANA HTTP Status | |||
| Code Registry. This indicates that the status code cannot be | ||||
| assigned to other applications currently. If future circumstances | ||||
| require its use (e.g., exhaustion of 4NN status codes), it can be re- | ||||
| assigned to another use. | ||||
| 15.5.20. 421 Misdirected Request | 15.5.20. 421 Misdirected Request | |||
| [new] | The 421 (Misdirected Request) status code indicates that the request | |||
| was directed at a server that is unable or unwilling to produce an | ||||
| authoritative response for the target URI. An origin server (or | ||||
| gateway acting on behalf of the origin server) sends 421 to reject a | ||||
| target URI that does not match an origin for which the server has | ||||
| been configured (Section 4.3.1) or does not match the connection | ||||
| context over which the request was received (Section 7.4). | ||||
| [new] | A client that receives a 421 (Misdirected Request) response MAY retry | |||
| the request, whether or not the request method is idempotent, over a | ||||
| different connection, such as a fresh connection specific to the | ||||
| target resource's origin, or via an alternative service [ALTSVC]. | ||||
| [new] | A proxy MUST NOT generate a 421 response. | |||
| 15.5.21. 422 Unprocessable Payload | 15.5.21. 422 Unprocessable Content | |||
| [new] | The 422 (Unprocessable Content) status code indicates that the server | |||
| understands the content type of the request content (hence a 415 | ||||
| (Unsupported Media Type) status code is inappropriate), and the | ||||
| syntax of the request content is correct, but was unable to process | ||||
| the contained instructions. For example, this status code can be | ||||
| sent if an XML request content contains well-formed (i.e., | ||||
| syntactically correct), but semantically erroneous XML instructions. | ||||
| 15.5.22. 426 Upgrade Required | 15.5.22. 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 of | response to indicate the required protocol(s) (Section 7.8). | |||
| [RFC7230]). | ||||
| 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. | |||
| 15.6. Server Error 5xx | 15.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 | |||
| is aware that it has erred or is incapable of performing the | server 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. | |||
| 15.6.1. 500 Internal Server Error | 15.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 | |||
| encountered an unexpected condition that prevented it from fulfilling | server encountered an unexpected condition that prevented it from | |||
| the request. | fulfilling the request. | |||
| 15.6.2. 501 Not Implemented | 15.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 | |||
| not support the functionality required to fulfill the request. This | does not support the functionality required to fulfill the request. | |||
| is the appropriate response when the server does not recognize the | This is the appropriate response when the server does not recognize | |||
| request method and is not capable of supporting it for any resource. | the request method and is not capable of supporting it for any | |||
| resource. | ||||
| A 501 response is cacheable by default; 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 [RFC7234]). | Section 4.2.2 of [CACHING]). | |||
| 15.6.3. 502 Bad Gateway | 15.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. | |||
| 15.6.4. 503 Service Unavailable | 15.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 7.1.3) to suggest an appropriate amount of time for the | (Section 10.2.3) 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 that a | | *Note:* The existence of the 503 status code does not imply | |||
| server has to use it when becoming overloaded. Some servers might | | that a server has to use it when becoming overloaded. Some | |||
| simply refuse the connection. | | servers might simply refuse the connection. | |||
| 15.6.5. 504 Gateway Timeout | 15.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. | |||
| 15.6.6. 505 HTTP Version Not Supported | 15.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 2.6 of | major version as the client, as described in Section 2.5, other than | |||
| [RFC7230], other than with this error message. The server SHOULD | with this error message. The server SHOULD generate a representation | |||
| generate a representation for the 505 response that describes why | for the 505 response that describes why that version is not supported | |||
| that version is not supported and what other protocols are supported | and what other protocols are supported by that server. | |||
| by that server. | ||||
| 16. Extending HTTP | 16. Extending HTTP | |||
| HTTP defines a number of generic extension points that can be used to | ||||
| introduce capabilities to the protocol without introducing a new | ||||
| version, including methods, status codes, field names, and further | ||||
| extensibility points within defined fields, such as authentication | ||||
| schemes and cache-directives (see Cache-Control extensions 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. | ||||
| 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 [HTTP/1.1]) and HTTP/2 ([HTTP/2]) 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 9.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. | ||||
| 16.1. Method Extensibility | 16.1. Method Extensibility | |||
| 16.1.1. Method Registry | 16.1.1. Method Registry | |||
| The "Hypertext Transfer Protocol (HTTP) Method Registry" defines the | The "Hypertext Transfer Protocol (HTTP) Method Registry", maintained | |||
| namespace for the request method token (Section 4). The method | by IANA at <https://www.iana.org/assignments/http-methods>, registers | |||
| registry has been created and is now maintained at | method names. | |||
| <http://www.iana.org/assignments/http-methods>. | ||||
| HTTP method registrations MUST include the following fields: | HTTP method registrations MUST include the following fields: | |||
| o Method Name (see Section 4) | * Method Name (see Section 9) | |||
| o Safe ("yes" or "no", see Section 4.2.1) | * Safe ("yes" or "no", see Section 9.2.1) | |||
| o Idempotent ("yes" or "no", see Section 4.2.2) | * Idempotent ("yes" or "no", see Section 9.2.2) | |||
| o Pointer to specification text | * Pointer to specification text | |||
| Values to be added to this namespace require IETF Review (see | Values to be added to this namespace require IETF Review (see | |||
| [RFC5226], Section 4.1). | [RFC8126], Section 4.8). | |||
| 16.1.2. Considerations for New Methods | 16.1.2. Considerations for New Methods | |||
| Standardized methods are generic; that is, they are potentially | Standardized methods are generic; that is, they are potentially | |||
| applicable to any resource, not just one particular media type, kind | applicable to any resource, not just one particular media type, kind | |||
| of resource, or application. As such, it is preferred that new | of resource, or application. As such, it is preferred that new | |||
| methods be registered in a document that isn't specific to a single | methods be registered in a document that isn't specific to a single | |||
| application or data format, since orthogonal technologies deserve | application or data format, since orthogonal technologies deserve | |||
| orthogonal specification. | orthogonal specification. | |||
| Since message parsing (Section 3.3 of [RFC7230]) needs to be | Since message parsing (Section 6) needs to be independent of method | |||
| independent of method semantics (aside from responses to HEAD), | semantics (aside from responses to HEAD), definitions of new methods | |||
| definitions of new methods cannot change the parsing algorithm or | cannot change the parsing algorithm or prohibit the presence of | |||
| prohibit the presence of a message body on either the request or the | content on either the request or the response message. Definitions | |||
| response message. Definitions of new methods can specify that only a | of new methods can specify that only a zero-length content is allowed | |||
| zero-length message body is allowed by requiring a Content-Length | by requiring a Content-Length header field with a value of "0". | |||
| header field with a value of "0". | ||||
| Likewise, new methods cannot use the special host:port and asterisk | ||||
| forms of request target that are allowed for CONNECT and OPTIONS, | ||||
| respectively (Section 7.1). A full URI in absolute form is needed | ||||
| for the target URI, which means either the request target needs to be | ||||
| sent in absolute form or the target URI will be reconstructed from | ||||
| the request context in the same way it is for other methods. | ||||
| A new method definition needs to indicate whether it is safe | A new method definition needs to indicate whether it is safe | |||
| (Section 4.2.1), idempotent (Section 4.2.2), cacheable | (Section 9.2.1), idempotent (Section 9.2.2), cacheable | |||
| (Section 4.2.3), what semantics are to be associated with the payload | (Section 9.2.3), what semantics are to be associated with the request | |||
| body if any is present in the request and what refinements the method | content (if any), and what refinements the method makes to header | |||
| makes to header field or status code semantics. If the new method is | field or status code semantics. If the new method is cacheable, its | |||
| cacheable, its definition ought to describe how, and under what | definition ought to describe how, and under what conditions, a cache | |||
| conditions, a cache can store a response and use it to satisfy a | can store a response and use it to satisfy a subsequent request. The | |||
| subsequent request. The new method ought to describe whether it can | new method ought to describe whether it can be made conditional | |||
| be made conditional (Section 5.2) and, if so, how a server responds | (Section 13.1) and, if so, how a server responds when the condition | |||
| when the condition is false. Likewise, if the new method might have | is false. Likewise, if the new method might have some use for | |||
| some use for partial response semantics ([RFC7233]), it ought to | partial response semantics (Section 14.2), it ought to document this, | |||
| document this, too. | too. | |||
| Note: Avoid defining a method name that starts with "M-", since | | *Note:* Avoid defining a method name that starts with "M-", | |||
| that prefix might be misinterpreted as having the semantics | | since that prefix might be misinterpreted as having the | |||
| assigned to it by [RFC2774]. | | semantics assigned to it by [RFC2774]. | |||
| 16.2. Status Code Extensibility | 16.2. Status Code Extensibility | |||
| 16.2.1. Status Code Registry | 16.2.1. Status Code Registry | |||
| The "Hypertext Transfer Protocol (HTTP) Status Code Registry" defines | The "Hypertext Transfer Protocol (HTTP) Status Code Registry", | |||
| the namespace for the response status-code token (Section 6). The | maintained by IANA at <https://www.iana.org/assignments/http-status- | |||
| status code registry is maintained at | codes>, registers status code numbers. | |||
| <http://www.iana.org/assignments/http-status-codes>. | ||||
| This section replaces the registration procedure for HTTP Status | ||||
| Codes previously defined in Section 7.1 of [RFC2817]. | ||||
| A registration MUST include the following fields: | A registration MUST include the following fields: | |||
| o Status Code (3 digits) | * Status Code (3 digits) | |||
| o Short Description | * Short Description | |||
| o Pointer to specification text | * 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 [RFC5226], Section 4.1). | Review (see [RFC8126], Section 4.8). | |||
| 16.2.2. Considerations for New Status Codes | 16.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 6. To allow existing parsers to process the | defined in Section 15. To allow existing parsers to process the | |||
| response message, new status codes cannot disallow a payload, | response message, new status codes cannot disallow content, although | |||
| although they can mandate a zero-length payload body. | they can mandate a zero-length content. | |||
| 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. | |||
| The definition of a new status code ought to explain the request | The definition of a new status code ought to explain the request | |||
| conditions that would cause a response containing that status code | conditions that would cause a response containing that status code | |||
| (e.g., combinations of request header fields and/or method(s)) along | (e.g., combinations of request header fields and/or method(s)) along | |||
| with any dependencies on response header fields (e.g., what fields | with any dependencies on response header fields (e.g., what fields | |||
| are required, what fields can modify the semantics, and what header | are required, what fields can modify the semantics, and what field | |||
| field semantics are further refined when used with the new status | semantics are further refined when used with the new status code). | |||
| code). | ||||
| The definition of a new status code ought to specify whether or not | By default, a status code applies only to the request corresponding | |||
| it is cacheable. Note that all status codes can be cached if the | to the response it occurs within. If a status code applies to a | |||
| response they occur in has explicit freshness information; however, | larger scope of applicability - for example, all requests to the | |||
| status codes that are defined as being cacheable are allowed to be | resource in question, or all requests to a server - this must be | |||
| cached without explicit freshness information. Likewise, the | explicitly specified. When doing so, it should be noted that not all | |||
| definition of a status code can place constraints upon cache | clients can be expected to consistently apply a larger scope, because | |||
| behavior. See [RFC7234] for more information. | they might not understand the new status code. | |||
| The definition of a new final status code ought to specify whether or | ||||
| not it is heuristically cacheable. Note that all final status codes | ||||
| can be cached if the response they occur in has explicit freshness | ||||
| information; however, those status codes that are defined as being | ||||
| heuristically cacheable are allowed to be cached without explicit | ||||
| freshness information. Likewise, the definition of a status code can | ||||
| place constraints upon cache behavior, if the 'must-understand' cache | ||||
| directive is used. 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 content has any implied association with an identified | |||
| resource (Section 3.1.4.1). | resource (Section 6.4.2). | |||
| 16.3. Field Extensibility | 16.3. Field Extensibility | |||
| Header fields are fully extensible: there is no limit on the | HTTP's most widely used extensibility point is the definition of new | |||
| introduction of new field names, each presumably defining new | header and trailer fields. | |||
| semantics, nor on the number of header fields used in a given | ||||
| message. Existing fields are defined in each part of this | ||||
| specification and in many other specifications outside this document | ||||
| set. | ||||
| New header fields can be defined such that, when they are understood by a | New fields can be defined such that, when they are understood by a | |||
| recipient, they might override or enhance the interpretation of previously | recipient, they override or enhance the interpretation of previously | |||
| defined header fields, define preconditions on request evaluation, or refine | defined fields, define preconditions on request evaluation, or refine | |||
| the meaning of responses. | the meaning of responses. | |||
| However, defining a field doesn't guarantee its deployment or | ||||
| recognition by recipients. Most fields are designed with the | ||||
| expectation that a recipient can safely ignore (but forward | ||||
| downstream) any field not recognized. In other cases, the sender's | ||||
| ability to understand a given field might be indicated by its prior | ||||
| communication, perhaps in the protocol version or fields that it sent | ||||
| in prior messages, or its use of a specific media type. Likewise, | ||||
| direct inspection of support might be possible through an OPTIONS | ||||
| request or by interacting with a defined well-known URI [RFC8615] if | ||||
| such inspection is defined along with the field being introduced. | ||||
| 16.3.1. Field Name Registry | 16.3.1. Field Name Registry | |||
| [new] | The "Hypertext Transfer Protocol (HTTP) Field Name Registry" defines | |||
| the namespace for HTTP field names. | ||||
| [new] | Any party can request registration of an HTTP field. See | |||
| Section 16.3.2 for considerations to take into account when creating | ||||
| a new HTTP field. | ||||
| HTTP header fields are registered within the "Message Headers" | The "Hypertext Transfer Protocol (HTTP) Field Name Registry" is | |||
| registry located at | located at <https://www.iana.org/assignments/http-fields/>. | |||
| <http://www.iana.org/assignments/message-headers>, as defined by | Registration requests can be made by following the instructions | |||
| [BCP90]. | located there or by sending an email to the "ietf-http-wg@w3.org" | |||
| mailing list. | ||||
| All defined header fields ought to be registered with IANA in the | Field names are registered on the advice of a Designated Expert | |||
| "Message Headers" registry, as described in Section 8.3 of [RFC7231]. | (appointed by the IESG or their delegate). Fields with the status | |||
| 'permanent' are Specification Required ([RFC8126], Section 4.6). | ||||
| [new] | Registration requests consist of the following information: | |||
| [new] | Field name: | |||
| The requested field name. It MUST conform to the field-name | ||||
| syntax defined in Section 5.1, and SHOULD be restricted to just | ||||
| letters, digits, and hyphen ('-') characters, with the first | ||||
| character being a letter. | ||||
| [new] | Status: | |||
| "permanent" or "provisional". | ||||
| [new] | 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. Optional but encouraged for provisional registrations. | ||||
| An indication of the relevant section(s) can also be included, but | ||||
| is not required. | ||||
| [new] | And, optionally: | |||
| [new] | Comments: Additional information, such as about reserved entries. | |||
| [new] | The Expert(s) can define additional fields to be collected in the | |||
| registry, in consultation with the community. | ||||
| [new] | 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". | ||||
| [new] | 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. | ||||
| [new] | 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. | ||||
| 16.3.2. Considerations for New Fields | 16.3.2. Considerations for New Fields | |||
| [new] | HTTP header and trailer fields are a widely-used extension point for | |||
| the protocol. While they can be used in an ad hoc fashion, fields | ||||
| that are intended for wider use need to be carefully documented to | ||||
| ensure interoperability. | ||||
| [new] | In particular, authors of specifications defining new fields are | |||
| advised to consider and, where appropriate, document the following | ||||
| aspects: | ||||
| o Under what conditions the header field can be used; e.g., only in | * Under what conditions the field can be used; e.g., only in | |||
| responses or requests, in all messages, only on responses to a | responses or requests, in all messages, only on responses to a | |||
| particular request method, etc. | particular request method, etc. | |||
| o Whether the field semantics are further refined by the context, | * Whether the field semantics are further refined by their context, | |||
| such as by existing request methods or status codes. | such as their use with certain request methods or status codes. | |||
| o [new] | * The scope of applicability for the information conveyed. 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 Under what conditions intermediaries are allowed to insert, | * Under what conditions intermediaries are allowed to insert, | |||
| delete, or modify the field's value. | delete, or modify the field's value. | |||
| o Whether the header field is useful or allowable in trailers (see | * If the field is allowable in trailers; by default, it will not be | |||
| Section 4.1 of [RFC7230]). | (see Section 6.5.1). | |||
| o Whether it is appropriate to list the field-name in the Connection | * Whether it is appropriate or even required to list the field name | |||
| header field (i.e., if the header field is to be hop-by-hop; see | in the Connection header field (i.e., if the field is to be hop- | |||
| Section 6.1 of [RFC7230]). | by-hop; see Section 7.6.1). | |||
| o Whether it introduces any additional security considerations, such | * Whether the field introduces any additional security | |||
| as disclosure of privacy-related data. | considerations, such as disclosure of privacy-related data. | |||
| [new] | Request header fields have additional considerations that need to be | |||
| documented if the default behaviour is not appropriate: | ||||
| o Whether it is appropriate to list the field-name in a Vary | * If it is appropriate to list the field name in a Vary response | |||
| response header field (e.g., when the request header field is used | header field (e.g., when the request header field is used by an | |||
| by an origin server's content selection algorithm; see | origin server's content selection algorithm; see Section 12.5.5). | |||
| Section 7.1.4). | ||||
| o Whether the field should be stored by origin servers that | * If the field is intended to be stored when received in a PUT | |||
| understand it upon a PUT request. | request (see Section 9.3.4). | |||
| o Whether the header field ought to be preserved across redirects. | * If the field ought to be removed when automatically redirecting a | |||
| request, due to security concerns (see Section 15.4). | ||||
| 16.3.2.1. Considerations for New Field Names | 16.3.2.1. Considerations for New Field Names | |||
| Authors of specifications defining new fields are advised to keep the | Authors of specifications defining new fields are advised to choose a | |||
| name as short as practical | short but descriptive field name. Short names avoid needless data | |||
| transmission; descriptive names avoid confusion and "squatting" on | ||||
| [new] | names that might have broader uses. | |||
| [new] | 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 that use (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. | ||||
| [new] | 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 a letter. For example, the underscore ("_") | ||||
| character can be problematic when passed through non-HTTP gateway | ||||
| interfaces (see Section 17.10). | ||||
| and not to prefix the name with "X-" | Field names ought not be prefixed with "X-"; see [BCP178] for further | |||
| unless the header field will never be used on the Internet. (The | information. | |||
| "X-" prefix idiom has been extensively misused in practice; it was | ||||
| intended to only be used as a mechanism for avoiding name collisions | ||||
| inside proprietary software or intranet processing, since the prefix | ||||
| would ensure that private names never collide with a newly registered | ||||
| Internet name; see [BCP178] for further information). | ||||
| [new] | Other prefixes are sometimes used in HTTP field names; for example, | |||
| "Accept-" is used in many content negotiation headers, and "Content-" | ||||
| is used as explained in Section 6.4. These prefixes are only an aid | ||||
| to recognizing the purpose of a field, and do not trigger automatic | ||||
| processing. | ||||
| 16.3.2.2. Considerations for New Field Values | 16.3.2.2. Considerations for New Field Values | |||
| [new] | A major task in the definition of a new HTTP field is the | |||
| specification of the field value syntax: what senders should | ||||
| generate, and how recipients should infer semantics from what is | ||||
| received. | ||||
| Authors of specifications defining new header fields are advised to | Authors are encouraged (but not required) to use either the ABNF | |||
| consider documenting: | rules in this specification or those in [RFC8941] to define the | |||
| syntax of new field values. | ||||
| o Whether the field is a single value or whether it can be a list | Authors are advised to carefully consider how the combination of | |||
| (delimited by commas; see Section 3.2 of [RFC7230]). | multiple field lines will impact them (see Section 5.3). Because | |||
| senders might erroneously send multiple values, and both | ||||
| intermediaries and HTTP libraries can perform combination | ||||
| automatically, this applies to all field values - even when only a | ||||
| single value is anticipated. | ||||
| If it does not use the list syntax, document how to treat messages | Therefore, authors are advised to delimit or encode values that | |||
| where the field occurs multiple times (a sensible default would be | contain commas (e.g., with the quoted-string rule of Section 5.6.4, | |||
| to ignore the field, but this might not always be the right | the String data type of [RFC8941], or a field-specific encoding). | |||
| choice). | This ensures that commas within field data are not confused with the | |||
| commas that delimit a list value. | ||||
| Note that intermediaries and software libraries might combine | For example, the Content-Type field value only allows commas inside | |||
| multiple header field instances into a single one, despite the | quoted strings, which can be reliably parsed even when multiple | |||
| field's definition not allowing the list syntax. A robust format | values are present. The Location field value provides a counter- | |||
| enables recipients to discover these situations (good example: | example that should not be emulated: because URIs can include commas, | |||
| "Content-Type", as the comma can only appear inside quoted | it is not possible to reliably distinguish between a single value | |||
| strings; bad example: "Location", as a comma can occur inside a | that includes a comma from two values. | |||
| URI). | ||||
| [new] | Authors of fields with a singleton value (see Section 5.5) are | |||
| additionally advised to 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). | ||||
| 16.4. Authentication Scheme Extensibility | 16.4. Authentication Scheme Extensibility | |||
| 16.4.1. Authentication Scheme Registry | 16.4.1. Authentication Scheme Registry | |||
| The "Hypertext Transfer Protocol (HTTP) Authentication Scheme | The "Hypertext Transfer Protocol (HTTP) Authentication Scheme | |||
| Registry" defines the namespace for the authentication schemes in | Registry" defines the namespace for the authentication schemes in | |||
| challenges and credentials. It has been created and is now | challenges and credentials. It is maintained at | |||
| maintained at <http://www.iana.org/assignments/http-authschemes>. | <https://www.iana.org/assignments/http-authschemes>. | |||
| Registrations MUST include the following fields: | Registrations MUST include the following fields: | |||
| o Authentication Scheme Name | * Authentication Scheme Name | |||
| o Pointer to specification text | * Pointer to specification text | |||
| o Notes (optional) | * Notes (optional) | |||
| Values to be added to this namespace require IETF Review (see | Values to be added to this namespace require IETF Review (see | |||
| [RFC5226], Section 4.1). | [RFC8126], Section 4.8). | |||
| 16.4.2. Considerations for New Authentication Schemes | 16.4.2. Considerations for New Authentication Schemes | |||
| There are certain aspects of the HTTP Authentication Framework that | There are certain aspects of the HTTP Authentication framework that | |||
| put constraints on how new authentication schemes can work: | put constraints on how new authentication schemes can work: | |||
| o HTTP authentication is presumed to be stateless: all of the | * HTTP authentication is presumed to be stateless: all of the | |||
| information necessary to authenticate a request MUST be provided | information necessary to authenticate a request MUST be provided | |||
| in the request, rather than be dependent on the server remembering | in the request, rather than be dependent on the server remembering | |||
| prior requests. Authentication based on, or bound to, the | prior requests. Authentication based on, or bound to, the | |||
| underlying connection is outside the scope of this specification | underlying connection is outside the scope of this specification | |||
| and inherently flawed unless steps are taken to ensure that the | and inherently flawed unless steps are taken to ensure that the | |||
| connection cannot be used by any party other than the | connection cannot be used by any party other than the | |||
| authenticated user (see Section 2.3 of [RFC7230]). | authenticated user (see Section 3.3). | |||
| o The authentication parameter "realm" is reserved for defining | * The authentication parameter "realm" is reserved for defining | |||
| protection spaces as described in Section 2.2. New schemes MUST | protection spaces as described in Section 11.5. New schemes MUST | |||
| NOT use it in a way incompatible with that definition. | NOT use it in a way incompatible with that definition. | |||
| o The "token68" notation was introduced for compatibility with | * The "token68" notation was introduced for compatibility with | |||
| existing authentication schemes and can only be used once per | existing authentication schemes and can only be used once per | |||
| challenge or credential. Thus, new schemes ought to use the | challenge or credential. Thus, new schemes ought to use the auth- | |||
| auth-param syntax instead, because otherwise future extensions | param syntax instead, because otherwise future extensions will be | |||
| will be impossible. | impossible. | |||
| o The parsing of challenges and credentials is defined by this | * The parsing of challenges and credentials is defined by this | |||
| specification and cannot be modified by new authentication | specification and cannot be modified by new authentication | |||
| schemes. When the auth-param syntax is used, all parameters ought | schemes. When the auth-param syntax is used, all parameters ought | |||
| to support both token and quoted-string syntax, and syntactical | to support both token and quoted-string syntax, and syntactical | |||
| constraints ought to be defined on the field value after parsing | constraints ought to be defined on the field value after parsing | |||
| (i.e., quoted-string processing). This is necessary so that | (i.e., quoted-string processing). This is necessary so that | |||
| recipients can use a generic parser that applies to all | recipients can use a generic parser that applies to all | |||
| authentication schemes. | authentication schemes. | |||
| Note: The fact that the value syntax for the "realm" parameter is | *Note:* The fact that the value syntax for the "realm" parameter | |||
| restricted to quoted-string was a bad design choice not to be | is restricted to quoted-string was a bad design choice not to be | |||
| repeated for new parameters. | repeated for new parameters. | |||
| o Definitions of new schemes ought to define the treatment of | * Definitions of new schemes ought to define the treatment of | |||
| unknown extension parameters. In general, a "must-ignore" rule is | unknown extension parameters. In general, a "must-ignore" rule is | |||
| preferable to a "must-understand" rule, because otherwise it will | preferable to a "must-understand" rule, because otherwise it will | |||
| be hard to introduce new parameters in the presence of legacy | be hard to introduce new parameters in the presence of legacy | |||
| recipients. Furthermore, it's good to describe the policy for | recipients. Furthermore, it's good to describe the policy for | |||
| defining new parameters (such as "update the specification" or | defining new parameters (such as "update the specification" or | |||
| "use this registry"). | "use this registry"). | |||
| o Authentication schemes need to document whether they are usable in | * Authentication schemes need to document whether they are usable in | |||
| origin-server authentication (i.e., using WWW-Authenticate), | origin-server authentication (i.e., using WWW-Authenticate), and/ | |||
| and/or proxy authentication (i.e., using Proxy-Authenticate). | or proxy authentication (i.e., using Proxy-Authenticate). | |||
| o The credentials carried in an Authorization header field are | * The credentials carried in an Authorization header field are | |||
| specific to the user agent and, therefore, have the same effect on | specific to the user agent and, therefore, have the same effect on | |||
| HTTP caches as the "private" Cache-Control response directive | HTTP caches as the "private" Cache-Control response directive | |||
| (Section 5.2.2.6 of [RFC7234]), within the scope of the request in | (Section 5.2.2.7 of [CACHING]), within the scope of the request in | |||
| which they appear. | which they appear. | |||
| Therefore, new authentication schemes that choose not to carry | Therefore, new authentication schemes that choose not to carry | |||
| credentials in the Authorization header field (e.g., using a newly | credentials in the Authorization header field (e.g., using a newly | |||
| defined header field) will need to explicitly disallow caching, by | defined header field) will need to explicitly disallow caching, by | |||
| mandating the use of either Cache-Control request directives | mandating the use of Cache-Control response directives (e.g., | |||
| (e.g., "no-store", Section 5.2.1.5 of [RFC7234]) or response | "private"). | |||
| directives (e.g., "private"). | ||||
| 16.5. Range Unit Extensibility | * Schemes using Authentication-Info, Proxy-Authentication-Info, or | |||
| any other authentication related response header field need to | ||||
| consider and document the related security considerations (see | ||||
| Section 17.16.4). | ||||
| 16.5. Range Unit Extensibility | ||||
| 16.5.1. Range Unit Registry | 16.5.1. Range Unit Registry | |||
| The "HTTP Range Unit Registry" defines the namespace for the range | The "HTTP Range Unit Registry" defines the namespace for the range | |||
| unit names and refers to their corresponding specifications. The | unit names and refers to their corresponding specifications. It is | |||
| registry has been created and is now maintained at | maintained at <https://www.iana.org/assignments/http-parameters>. | |||
| <http://www.iana.org/assignments/http-parameters>. | ||||
| Registration of an HTTP Range Unit MUST include the following fields: | Registration of an HTTP Range Unit MUST include the following fields: | |||
| o Name | * Name | |||
| o Description | * Description | |||
| o Pointer to specification text | * Pointer to specification text | |||
| Values to be added to this namespace require IETF Review (see | Values to be added to this namespace require IETF Review (see | |||
| [RFC5226], Section 4.1). | [RFC8126], Section 4.8). | |||
| 16.5.2. Considerations for New Range Units | 16.5.2. Considerations for New Range Units | |||
| [new] | 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. | ||||
| 16.6. Content Coding Extensibility | 16.6. Content Coding Extensibility | |||
| 16.6.1. Content Coding Registry | 16.6.1. Content Coding Registry | |||
| The "HTTP Content Coding Registry" defines the namespace for content | The "HTTP Content Coding Registry", maintained by IANA at | |||
| coding names (Section 4.2 of [RFC7230]). The content coding registry | <https://www.iana.org/assignments/http-parameters/>, registers | |||
| is maintained at <http://www.iana.org/assignments/http-parameters>. | content-coding names. | |||
| Content coding registrations MUST include the following fields: | Content coding registrations MUST include the following fields: | |||
| o Name | * Name | |||
| o Description | * Description | |||
| o Pointer to specification text | * Pointer to specification text | |||
| Names of content codings MUST NOT overlap with names of transfer | Names of content codings MUST NOT overlap with names of transfer | |||
| codings (Section 4 of [RFC7230]), unless the encoding transformation | codings (as per the "HTTP Transfer Coding registry", located at | |||
| is identical (as is the case for the compression codings defined in | <https://www.iana.org/assignments/http-parameters/>), unless the | |||
| Section 4.2 of [RFC7230]). | encoding transformation is identical (as is the case for the | |||
| compression codings defined in Section 8.4.1). | ||||
| Values to be added to this namespace require IETF Review (see Section | Values to be added to this namespace require IETF Review (see | |||
| 4.1 of [RFC5226]) and MUST conform to the purpose of content coding | Section 4.8 of [RFC8126]) and MUST conform to the purpose of content | |||
| defined in this section. | coding defined in Section 8.4.1. | |||
| 16.6.2. Considerations for New Content Codings | 16.6.2. Considerations for New Content Codings | |||
| [new] | 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. | ||||
| 16.7. Upgrade Token Registry | 16.7. Upgrade Token Registry | |||
| The "Hypertext Transfer Protocol (HTTP) Upgrade Token Registry" | The "Hypertext Transfer Protocol (HTTP) Upgrade Token Registry" | |||
| defines the namespace for protocol-name tokens used to identify | defines the namespace for protocol-name tokens used to identify | |||
| protocols in the Upgrade header field. The registry is maintained at | protocols in the Upgrade header field. The registry is maintained at | |||
| <http://www.iana.org/assignments/http-upgrade-tokens>. | <https://www.iana.org/assignments/http-upgrade-tokens>. | |||
| Each registered protocol name is associated with contact information | Each registered protocol name is associated with contact information | |||
| and an optional set of specifications that details how the connection | and an optional set of specifications that details how the connection | |||
| will be processed after it has been upgraded. | will be processed after it has been upgraded. | |||
| Registrations happen on a "First Come First Served" basis (see | Registrations happen on a "First Come First Served" basis (see | |||
| Section 4.1 of [RFC5226]) and are subject to the following rules: | Section 4.4 of [RFC8126]) and are subject to the following rules: | |||
| 1. A protocol-name token, once registered, stays registered forever. | 1. A protocol-name token, once registered, stays registered forever. | |||
| 2. The registration MUST name a responsible party for the | 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. | registration. | |||
| 3. The registration MUST name a point of contact. | 4. The registration MUST name a point of contact. | |||
| 4. The registration MAY name a set of specifications associated with | 5. The registration MAY name a set of specifications associated with | |||
| that token. Such specifications need not be publicly available. | that token. Such specifications need not be publicly available. | |||
| 5. The registration SHOULD name a set of expected "protocol-version" | 6. The registration SHOULD name a set of expected "protocol-version" | |||
| tokens associated with that token at the time of registration. | tokens associated with that token at the time of registration. | |||
| 6. The responsible party MAY change the registration at any time. | 7. The responsible party MAY change the registration at any time. | |||
| The IANA will keep a record of all such changes, and make them | The IANA will keep a record of all such changes, and make them | |||
| available upon request. | available upon request. | |||
| 7. The IESG MAY reassign responsibility for a protocol token. This | 8. The IESG MAY reassign responsibility for a protocol token. This | |||
| will normally only be used in the case when a responsible party | will normally only be used in the case when a responsible party | |||
| cannot be contacted. | cannot be contacted. | |||
| This registration procedure for HTTP Upgrade Tokens replaces that | ||||
| previously defined in Section 7.2 of [RFC2817]. | ||||
| 17. Security Considerations | 17. 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 caching are discussed in Section 7 of | |||
| discussed in Section 9 of [RFC7230]. | [CACHING] and considerations related to HTTP/1.1 message syntax and | |||
| parsing are discussed in Section 11 of [HTTP/1.1]. | ||||
| 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 content 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]). | |||
| 17.1. Establishing Authority | 17.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 authority | that has been determined by (or at the direction of) the origin | |||
| identified within the target URI to be the most appropriate response | server identified within the target URI to be the most appropriate | |||
| for that request given the state of the target resource at the time | response for that request given the state of the target resource at | |||
| 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.7.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. Likewise, the user's choice of server for | establishing authority for "http" URIs. Likewise, the user's choice | |||
| Domain Name Service (DNS), and the hierarchy of servers from which it | of server for Domain Name Service (DNS), and the hierarchy of servers | |||
| obtains resolution results, could impact the authenticity of address | from which it obtains resolution results, could impact the | |||
| mappings; DNS Security Extensions (DNSSEC, [RFC4033]) are one way to | authenticity of address mappings; DNS Security Extensions (DNSSEC, | |||
| improve authenticity. | [RFC4033]) are one way to improve authenticity, as are the various | |||
| mechanisms for making DNS requests over more secure transfer | ||||
| protocols. | ||||
| 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.7.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 TLS connection is secured and | authority, provided that the negotiated connection is secured and the | |||
| 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 (see [RFC2818]). | 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 | ||||
| extensions; for example, [ALTSVC]. Likewise, the set of servers for | ||||
| which a connection is considered authoritative can be changed with 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 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, establishing authority can be difficult. For example, | Unfortunately, communicating authority to users can be difficult. | |||
| phishing is an attack on the user's perception of authority, where | For example, _phishing_ is an attack on the user's perception of | |||
| that perception can be misled by presenting similar branding in | authority, where that perception can be misled by presenting similar | |||
| hypertext, possibly aided by userinfo obfuscating the authority | branding in hypertext, possibly aided by userinfo obfuscating the | |||
| component (see Section 2.7.1). User agents can reduce the impact of | authority component (see Section 4.2.1). User agents can reduce the | |||
| phishing attacks by enabling users to easily inspect a target URI | impact of phishing attacks by enabling users to easily inspect a | |||
| prior to making an action, by prominently distinguishing (or | target URI prior to making an action, by prominently distinguishing | |||
| 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. | |||
| 17.2. Risks of Intermediaries | 17.2. Risks of Intermediaries | |||
| By their very nature, HTTP intermediaries are men-in-the-middle and, | HTTP intermediaries are inherently situated for on-path attacks. | |||
| thus, represent an opportunity for man-in-the-middle 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. | |||
| Intermediaries that contain a shared cache are especially vulnerable | Intermediaries that contain a shared cache are especially vulnerable | |||
| to cache poisoning attacks, as described in Section 8 of [RFC7234]. | 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 | Intermediaries are no more trustworthy than the people and policies | |||
| than the people who run them; HTTP itself cannot solve this problem. | under which they operate; HTTP cannot solve this problem. | |||
| 17.3. Attacks Based on File and Path Names | 17.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 effective request URI to resource | manage the mapping from target URI to resource representations. Most | |||
| representations. Most file systems are not designed to protect | file systems are not designed to protect against malicious file or | |||
| against malicious file or path names. Therefore, an origin server | path names. Therefore, an origin server needs to avoid accessing | |||
| needs to avoid accessing names that have a special significance to | names that have a special significance to the system when mapping the | |||
| the system when mapping the request target to files, folders, or | target resource to files, folders, or directories. | |||
| 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 | |||
| current one, and they use specially named paths or file names to send | current one, and they use specially named paths or file names to send | |||
| data to system devices. Similar naming conventions might exist | data to system devices. Similar naming conventions might exist | |||
| within other types of storage systems. Likewise, local storage | within other types of storage systems. Likewise, local storage | |||
| 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. | |||
| skipping to change at line 7567 ¶ | skipping to change at page 186, line 38 ¶ | |||
| 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. | |||
| 17.4. Attacks Based on Command, Code, or Query Injection | 17.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, request-target, header fields, or body) to contain | elements (method, target URI, header fields, or content) to contain | |||
| data that might be misinterpreted as a command, code, or query when | data that might be misinterpreted as a command, code, or query when | |||
| passed through a command invocation, language interpreter, or | passed through a command invocation, language interpreter, or | |||
| database interface. | database interface. | |||
| For example, SQL injection is a common attack wherein additional | For example, SQL injection is a common attack wherein additional | |||
| query language is inserted within some part of the request-target or | query language is inserted within some part of the target URI or | |||
| header fields (e.g., Host, Referer, etc.). If the received data is | header fields (e.g., Host, Referer, etc.). If the received data is | |||
| used directly within a SELECT statement, the query language might be | used directly within a SELECT statement, the query language might be | |||
| interpreted as a database command instead of a simple string value. | interpreted as a database command instead of a simple string value. | |||
| This type of implementation vulnerability is extremely common, in | This type of implementation vulnerability is extremely common, in | |||
| spite of being easy to prevent. | spite of being easy to prevent. | |||
| In general, resource implementations ought to avoid use of request | In general, resource implementations ought to avoid use of request | |||
| data in contexts that are processed or interpreted as instructions. | data in contexts that are processed or interpreted as instructions. | |||
| 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 | |||
| skipping to change at line 7597 ¶ | skipping to change at page 187, line 22 ¶ | |||
| 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. | |||
| 17.5. Attacks via Protocol Element Length | 17.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. | 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 request-line (Section 3.1.1) and header fields | minimum size limits on fields (Section 5.4). These are minimum | |||
| (Section 3.2). These are minimum recommendations, chosen to be | recommendations, chosen to be supportable even by implementations | |||
| supportable even by implementations with limited resources; it is | with limited resources; it is expected that most implementations will | |||
| expected that most implementations will choose substantially higher | choose substantially higher limits. | |||
| limits. | ||||
| A server can reject a message that has a request-target that is too | A server can reject a message that has a target URI that is too long | |||
| long (Section 6.5.12 of [RFC7231]) or a request payload that is too | (Section 15.5.15) or request content that is too large | |||
| large (Section 6.5.11 of [RFC7231]). Additional status codes related | (Section 15.5.14). Additional status codes related to capacity | |||
| 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, header field-names, numeric values, | methods, response status phrases, field names, numeric values, and | |||
| and body chunks. Failure to limit such processing can result in | chunk lengths. Failure to limit such processing can result in | |||
| buffer overflows, arithmetic overflows, or increased vulnerability to | arbitrary code execution due to buffer or arithmetic overflows, and | |||
| denial-of-service attacks. | increased vulnerability to denial-of-service attacks. | |||
| 17.6. Attacks using Shared-dictionary Compression | 17.6. Attacks using Shared-dictionary Compression | |||
| [new] | Some attacks on encrypted protocols use the differences in size | |||
| created by dynamic compression to reveal confidential information; | ||||
| for example, [BREACH]. These attacks rely on creating a redundancy | ||||
| between attacker-controlled content and the confidential information, | ||||
| such that a dynamic compression algorithm using the same dictionary | ||||
| for both content will compress more efficiently when the attacker- | ||||
| controlled content matches parts of the confidential content. | ||||
| HTTP messages can be compressed in a number of ways, including using | ||||
| TLS compression, content codings, transfer codings, and other | ||||
| extension or version-specific mechanisms. | ||||
| The most effective mitigation for this risk is to disable compression | ||||
| on sensitive data, or to strictly separate sensitive data from | ||||
| attacker-controlled data so that they cannot share the same | ||||
| compression dictionary. With careful design, a compression scheme | ||||
| can be designed in a way that is not considered exploitable in | ||||
| limited use cases, such as HPACK ([HPACK]). | ||||
| 17.7. Disclosure of Personal Information | 17.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. | |||
| skipping to change at line 7650 ¶ | skipping to change at page 188, line 44 ¶ | |||
| 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. | |||
| Anonymization of personal information within individual entries | Anonymization of personal information within individual entries | |||
| helps, but it is generally not sufficient to prevent real log traces | helps, but it is generally not sufficient to prevent real log traces | |||
| from being re-identified based on correlation with other access | from being re-identified based on correlation with other access | |||
| 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 | information, including user identifiers, IP addresses, and user- | |||
| user-provided query parameters, as soon as that information is no | provided query parameters, as soon as that information is no longer | |||
| longer necessary to support operational needs for security, auditing, | necessary to support operational needs for security, auditing, or | |||
| or fraud control. | fraud control. | |||
| 17.9. Disclosure of Sensitive Information in URIs | 17.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. It is therefore unwise to include | unprotected bookmark lists. Many servers, proxies, and user agents | |||
| information within a URI that is sensitive, personally identifiable, | log or display the target URI in places where it might be visible to | |||
| or a risk to disclose. | third parties. It is therefore unwise to include information within | |||
| a URI that is sensitive, personally identifiable, or a risk to | ||||
| disclose. | ||||
| Authors of services ought to avoid GET-based forms for the submission | When an application uses client-side mechanisms to construct a target | |||
| of sensitive data because that data will be placed in the | URI out of user-provided information, such as the query fields of a | |||
| request-target. Many existing servers, proxies, and user agents log | form using GET, potentially sensitive data might be provided that | |||
| or display the request-target in places where it might be visible to | would not be appropriate for disclosure within a URI. POST is often | |||
| third parties. Such services ought to use POST-based form submission | preferred in such cases because it usually doesn't construct a URI; | |||
| instead. | instead, POST of a form transmits the potentially sensitive data in | |||
| the request content. However, this hinders caching and uses an | ||||
| unsafe method for what would otherwise be a safe request. | ||||
| Alternative workarounds include transforming the user-provided data | ||||
| prior to constructing the URI, or filtering the data to only include | ||||
| common values that are not sensitive. Likewise, redirecting the | ||||
| result of a query to a different (server-generated) URI can remove | ||||
| potentially sensitive data from later links and provide a cacheable | ||||
| response for 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 5.5.2 to address some of its security considerations. | Section 10.1.3 to address some of its security considerations. | |||
| 17.10. [new] | 17.10. Application Handling of Field Names | |||
| Servers often use non-HTTP gateway interfaces and frameworks to | ||||
| process a received request and produce content for the response. For | ||||
| historical reasons, such interfaces often pass received field names | ||||
| as external variable names, using a name mapping suitable for | ||||
| environment variables. | ||||
| For example, the Common Gateway Interface (CGI) mapping of protocol- | ||||
| specific meta-variables, defined by Section 4.1.18 of [RFC3875], is | ||||
| applied to received header fields that do not correspond to one of | ||||
| CGI's standard variables; the mapping consists of prepending "HTTP_" | ||||
| to each name and changing all instances of hyphen ("-") to underscore | ||||
| ("_"). This same mapping has been inherited by many other | ||||
| application frameworks in order to simplify moving applications from | ||||
| one platform to the next. | ||||
| In CGI, a received Content-Length field would be passed as the meta- | ||||
| variable "CONTENT_LENGTH" with a string value matching the received | ||||
| field's value. In contrast, a received "Content_Length" header field | ||||
| would be passed as the protocol-specific meta-variable | ||||
| "HTTP_CONTENT_LENGTH", which might lead to some confusion if an | ||||
| application mistakenly reads the protocol-specific meta-variable | ||||
| instead of the default one. (This historical practice is why | ||||
| Section 16.3.2.1 discourages the creation of new field names that | ||||
| contain an underscore.) | ||||
| Unfortunately, mapping field names to different interface names can | ||||
| lead to security vulnerabilities if the mapping is incomplete or | ||||
| ambiguous. For example, if an attacker were to send a field named | ||||
| "Transfer_Encoding", a naive interface might map that to the same | ||||
| variable name as the "Transfer-Encoding" field, resulting in a | ||||
| potential request smuggling vulnerability (Section 11.2 of | ||||
| [HTTP/1.1]). | ||||
| To mitigate the associated risks, implementations that perform such | ||||
| mappings are advised to make the mapping unambiguous and complete for | ||||
| the full range of potential octets received as a name (including | ||||
| those that are discouraged or forbidden by the HTTP grammar). For | ||||
| example, a field with an unusual name character might result in the | ||||
| request being blocked, the specific field being removed, or the name | ||||
| being passed with a different prefix to distinguish it from other | ||||
| fields. | ||||
| 17.11. Disclosure of Fragment after Redirects | 17.11. 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 7.1.2), this might have the effect of | reference in Location (Section 10.2.2), 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. | |||
| 17.12. Disclosure of Product Information | 17.12. Disclosure of Product Information | |||
| The User-Agent (Section 5.5.3), Via (Section 5.7.1 of [RFC7230]), and | The User-Agent (Section 10.1.5), Via (Section 7.6.3), and Server | |||
| Server (Section 7.4.2) header fields often reveal information about | (Section 10.2.4) header fields often reveal information about the | |||
| the respective sender's software systems. In theory, this can make | respective sender's software systems. In theory, this can make it | |||
| it easier for an attacker to exploit known security holes; in | easier for an attacker to exploit known security holes; in practice, | |||
| practice, attackers tend to try all potential holes regardless of the | attackers tend to try all potential holes regardless of the apparent | |||
| 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. | |||
| 17.13. Browser Fingerprinting | 17.13. 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 how it uses the underlying transport protocol, feature | |||
| environment, though of particular interest here is the set of unique | capabilities, and scripting environment, though of particular | |||
| characteristics that might be communicated via HTTP. Fingerprinting | interest here is the set of unique characteristics that might be | |||
| is considered a privacy concern because it enables tracking of a user | communicated via HTTP. Fingerprinting is considered a privacy | |||
| agent's behavior over time without the corresponding controls that | concern because it enables tracking of a user agent's behavior over | |||
| the user might have over other forms of data collection (e.g., | time ([Bujlow]) without the corresponding controls that the user | |||
| cookies). Many general-purpose user agents (i.e., Web browsers) have | might have over other forms of data collection (e.g., cookies). Many | |||
| taken steps to reduce their fingerprints. | general-purpose user agents (i.e., Web browsers) have taken steps to | |||
| reduce their fingerprints. | ||||
| There are a number of request header fields that might reveal | There are a number of request header fields that might reveal | |||
| information to servers that is sufficiently unique to enable | information to servers that is sufficiently unique to enable | |||
| fingerprinting. The From header field is the most obvious, though it | fingerprinting. The From header field is the most obvious, though it | |||
| is expected that From will only be sent when self-identification is | is expected that From will only be sent when self-identification is | |||
| 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 5.3), including the Accept, Accept-Charset, | negotiation (Section 12.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 | privacy would be for a user agent to omit the sending of Accept- | |||
| Accept-Language except for sites that have been whitelisted, perhaps | Language except for sites that have been explicitly permitted, | |||
| via interaction after detecting a Vary header field that indicates | perhaps via interaction after detecting a Vary header field that | |||
| language negotiation might be useful. | indicates 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. | |||
| 17.14. Validator Retention | 17.14. Validator Retention | |||
| This section is meant to inform developers, information providers, | ||||
| and users of known security concerns specific to the HTTP conditional | ||||
| request mechanisms. More general security considerations are | ||||
| addressed in HTTP "Message Syntax and Routing" [RFC7230] and | ||||
| "Semantics and Content" [RFC7231]. | ||||
| 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 man-in-the-middle attacks. At best, they enable | changes, or detect on-path attacks. At best, they enable more | |||
| more efficient cache updates and optimistic concurrent writes when | efficient cache updates and optimistic concurrent writes when all | |||
| all participants are behaving nicely. At worst, the conditions will | participants are behaving nicely. At worst, the conditions will fail | |||
| fail and the client will receive a response that is no more harmful | and the client will receive a response that is no more harmful than | |||
| 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 | |||
| example, a site might deliberately construct a semantically invalid | example, a site might deliberately construct a semantically invalid | |||
| 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. | |||
| 17.15. Denial-of-Service Attacks Using Range | 17.15. Denial-of-Service Attacks Using Range | |||
| This section is meant to inform developers, information providers, | ||||
| and users of known security concerns specific to the HTTP range | ||||
| request mechanisms. More general security considerations are | ||||
| addressed in HTTP messaging [RFC7230] and semantics [RFC7231]. | ||||
| 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. | |||
| 17.16. Authentication Considerations | 17.16. Authentication Considerations | |||
| This section is meant to inform developers, information providers, | ||||
| and users of known security concerns specific to HTTP authentication. | ||||
| More general security considerations are addressed in HTTP messaging | ||||
| [RFC7230] and semantics [RFC7231]. | ||||
| 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. | |||
| skipping to change at line 7837 ¶ | skipping to change at page 193, line 38 ¶ | |||
| 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 | |||
| effect of identifying that user even if the content within | effect of identifying that user even if the content within | |||
| credentials remains confidential. | credentials remains confidential. | |||
| 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 | |||
| header fields. In other words, if a server limits access to | fields. Services that depend on individual user authentication | |||
| authenticated users using this framework, the server needs to ensure | require a secured connection prior to exchanging credentials | |||
| that the connection is properly secured in accordance with the nature | (Section 4.2.2). | |||
| of the authentication scheme used. For example, services that depend | ||||
| on individual user authentication often require a connection to be | ||||
| secured with TLS ("Transport Layer Security", [RFC5246]) prior to | ||||
| exchanging any credentials. | ||||
| 17.16.2. Credentials and Idle Clients | 17.16.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 | |||
| application's security model include but are not limited to: | application's security model include but are not limited to: | |||
| o Clients that have been idle for an extended period, following | * Clients that have been idle for an extended period, following | |||
| which the server might wish to cause the client to re-prompt the | which the server might wish to cause the client to re-prompt the | |||
| user for credentials. | user for credentials. | |||
| o Applications that include a session termination indication (such | * 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. | |||
| 17.16.3. Protection Spaces | 17.16.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 (Section 2.2). | for multiple parties under the same origin (Section 11.5). Possible | |||
| Possible mitigation strategies include restricting direct access to | mitigation strategies include restricting direct access to | |||
| authentication credentials (i.e., not making the content of the | authentication credentials (i.e., not making the content of the | |||
| Authorization request header field available), and separating | Authorization request header field available), and separating | |||
| protection spaces by using a different host name (or port number) for | protection spaces by using a different host name (or port number) for | |||
| each party. | each party. | |||
| 17.16.4. Additional Response Fields | 17.16.4. Additional Response Fields | |||
| Adding information to HTTP responses that are sent over an | Adding information to responses that are sent over an unencrypted | |||
| unencrypted channel can affect security and privacy. The presence of | channel can affect security and privacy. The presence of the | |||
| the header fields alone indicates that HTTP authentication is in use. | Authentication-Info and Proxy-Authentication-Info header fields alone | |||
| Additional information could be exposed by the contents of the | indicates that HTTP authentication is in use. Additional information | |||
| authentication-scheme specific parameters; this will have to be | could be exposed by the contents of the authentication-scheme | |||
| considered in the definitions of these schemes. | specific parameters; this will have to be considered in the | |||
| definitions of these schemes. | ||||
| 18. IANA Considerations | 18. IANA Considerations | |||
| The change controller for the above 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". | |||
| 18.1. URI Scheme Registration | 18.1. URI Scheme Registration | |||
| IANA maintains the registry of URI Schemes [BCP115] at | Please update the registry of URI Schemes [BCP35] at | |||
| <http://www.iana.org/assignments/uri-schemes/>. | <https://www.iana.org/assignments/uri-schemes/> with the permanent | |||
| schemes listed in the table in Section 4.2. | ||||
| This document defines the following URI schemes, so the "Permanent | ||||
| URI Schemes" registry has been updated accordingly. | ||||
| 18.2. Method Registration | 18.2. Method Registration | |||
| The "Hypertext Transfer Protocol (HTTP) Method Registry" has been | Please update the "Hypertext Transfer Protocol (HTTP) Method | |||
| populated with the registrations below: | Registry" at <https://www.iana.org/assignments/http-methods> with the | |||
| registration procedure of Section 16.1.1 and the method names | ||||
| summarized in the following table. | ||||
| +---------+------+------------+----------------+ | +=========+======+============+=======+ | |||
| | Method | Safe | Idempotent | Reference | | | Method | Safe | Idempotent | Ref. | | |||
| +---------+------+------------+----------------+ | +=========+======+============+=======+ | |||
| | CONNECT | no | no | Section 4.3.6 | | | CONNECT | no | no | 9.3.6 | | |||
| | DELETE | no | yes | Section 4.3.5 | | +---------+------+------------+-------+ | |||
| | GET | yes | yes | Section 4.3.1 | | | DELETE | no | yes | 9.3.5 | | |||
| | HEAD | yes | yes | Section 4.3.2 | | +---------+------+------------+-------+ | |||
| | OPTIONS | yes | yes | Section 4.3.7 | | | GET | yes | yes | 9.3.1 | | |||
| | POST | no | no | Section 4.3.3 | | +---------+------+------------+-------+ | |||
| | PUT | no | yes | Section 4.3.4 | | | HEAD | yes | yes | 9.3.2 | | |||
| | TRACE | yes | yes | Section 4.3.8 | | +---------+------+------------+-------+ | |||
| +---------+------+------------+----------------+ | | OPTIONS | yes | yes | 9.3.7 | | |||
| +---------+------+------------+-------+ | ||||
| | POST | no | no | 9.3.3 | | ||||
| +---------+------+------------+-------+ | ||||
| | PUT | no | yes | 9.3.4 | | ||||
| +---------+------+------------+-------+ | ||||
| | TRACE | yes | yes | 9.3.8 | | ||||
| +---------+------+------------+-------+ | ||||
| | * | no | no | 18.2 | | ||||
| +---------+------+------------+-------+ | ||||
| Table 7 | ||||
| The method name "*" is reserved, since using "*" as a method name | ||||
| would conflict with its usage as a wildcard in some fields (e.g., | ||||
| "Access-Control-Request-Method"). | ||||
| 18.3. Status Code Registration | 18.3. Status Code Registration | |||
| The status code registry has been updated with the registrations | Please update the "Hypertext Transfer Protocol (HTTP) Status Code | |||
| below: | Registry" at <https://www.iana.org/assignments/http-status-codes> | |||
| with the registration procedure of Section 16.2.1 and the status code | ||||
| values summarized in the following table. | ||||
| +------+-------------------------------+--------------------------+ | +=======+===============================+=========+ | |||
| | Code | Reason-Phrase | Defined in... | | | Value | Description | Ref. | | |||
| +------+-------------------------------+--------------------------+ | +=======+===============================+=========+ | |||
| | 100 | Continue | Section 6.2.1 | | | 100 | Continue | 15.2.1 | | |||
| | 101 | Switching Protocols | Section 6.2.2 | | +-------+-------------------------------+---------+ | |||
| | 200 | OK | Section 6.3.1 | | | 101 | Switching Protocols | 15.2.2 | | |||
| | 201 | Created | Section 6.3.2 | | +-------+-------------------------------+---------+ | |||
| | 202 | Accepted | Section 6.3.3 | | | 200 | OK | 15.3.1 | | |||
| | 203 | Non-Authoritative Information | Section 6.3.4 | | +-------+-------------------------------+---------+ | |||
| | 204 | No Content | Section 6.3.5 | | | 201 | Created | 15.3.2 | | |||
| | 205 | Reset Content | Section 6.3.6 | | +-------+-------------------------------+---------+ | |||
| | 206 | Partial Content | Section 4.1 of [RFC7233] | | | 202 | Accepted | 15.3.3 | | |||
| | 300 | Multiple Choices | Section 6.4.1 | | +-------+-------------------------------+---------+ | |||
| | 301 | Moved Permanently | Section 6.4.2 | | | 203 | Non-Authoritative Information | 15.3.4 | | |||
| | 302 | Found | Section 6.4.3 | | +-------+-------------------------------+---------+ | |||
| | 303 | See Other | Section 6.4.4 | | | 204 | No Content | 15.3.5 | | |||
| | 304 | Not Modified | Section 4.1 of [RFC7232] | | +-------+-------------------------------+---------+ | |||
| | 305 | Use Proxy | Section 6.4.5 | | | 205 | Reset Content | 15.3.6 | | |||
| | 307 | Temporary Redirect | Section 6.4.7 | | +-------+-------------------------------+---------+ | |||
| | 400 | Bad Request | Section 6.5.1 | | | 206 | Partial Content | 15.3.7 | | |||
| | 401 | Unauthorized | Section 3.1 of [RFC7235] | | +-------+-------------------------------+---------+ | |||
| | 402 | Payment Required | Section 6.5.2 | | | 300 | Multiple Choices | 15.4.1 | | |||
| | 403 | Forbidden | Section 6.5.3 | | +-------+-------------------------------+---------+ | |||
| | 404 | Not Found | Section 6.5.4 | | | 301 | Moved Permanently | 15.4.2 | | |||
| | 405 | Method Not Allowed | Section 6.5.5 | | +-------+-------------------------------+---------+ | |||
| | 406 | Not Acceptable | Section 6.5.6 | | | 302 | Found | 15.4.3 | | |||
| | 407 | Proxy Authentication Required | Section 3.2 of [RFC7235] | | +-------+-------------------------------+---------+ | |||
| | 408 | Request Timeout | Section 6.5.7 | | | 303 | See Other | 15.4.4 | | |||
| | 409 | Conflict | Section 6.5.8 | | +-------+-------------------------------+---------+ | |||
| | 410 | Gone | Section 6.5.9 | | | 304 | Not Modified | 15.4.5 | | |||
| | 411 | Length Required | Section 6.5.10 | | +-------+-------------------------------+---------+ | |||
| | 412 | Precondition Failed | Section 4.2 of [RFC7232] | | | 305 | Use Proxy | 15.4.6 | | |||
| | 413 | Payload Too Large | Section 6.5.11 | | +-------+-------------------------------+---------+ | |||
| | 414 | URI Too Long | Section 6.5.12 | | | 306 | (Unused) | 15.4.7 | | |||
| | 415 | Unsupported Media Type | Section 6.5.13 | | +-------+-------------------------------+---------+ | |||
| | 416 | Range Not Satisfiable | Section 4.4 of [RFC7233] | | | 307 | Temporary Redirect | 15.4.8 | | |||
| | 417 | Expectation Failed | Section 6.5.14 | | +-------+-------------------------------+---------+ | |||
| | 426 | Upgrade Required | Section 6.5.15 | | | 308 | Permanent Redirect | 15.4.9 | | |||
| | 500 | Internal Server Error | Section 6.6.1 | | +-------+-------------------------------+---------+ | |||
| | 501 | Not Implemented | Section 6.6.2 | | | 400 | Bad Request | 15.5.1 | | |||
| | 502 | Bad Gateway | Section 6.6.3 | | +-------+-------------------------------+---------+ | |||
| | 503 | Service Unavailable | Section 6.6.4 | | | 401 | Unauthorized | 15.5.2 | | |||
| | 504 | Gateway Timeout | Section 6.6.5 | | +-------+-------------------------------+---------+ | |||
| | 505 | HTTP Version Not Supported | Section 6.6.6 | | | 402 | Payment Required | 15.5.3 | | |||
| +------+-------------------------------+--------------------------+ | +-------+-------------------------------+---------+ | |||
| | 403 | Forbidden | 15.5.4 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 404 | Not Found | 15.5.5 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 405 | Method Not Allowed | 15.5.6 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 406 | Not Acceptable | 15.5.7 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 407 | Proxy Authentication Required | 15.5.8 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 408 | Request Timeout | 15.5.9 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 409 | Conflict | 15.5.10 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 410 | Gone | 15.5.11 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 411 | Length Required | 15.5.12 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 412 | Precondition Failed | 15.5.13 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 413 | Content Too Large | 15.5.14 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 414 | URI Too Long | 15.5.15 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 415 | Unsupported Media Type | 15.5.16 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 416 | Range Not Satisfiable | 15.5.17 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 417 | Expectation Failed | 15.5.18 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 418 | (Unused) | 15.5.19 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 421 | Misdirected Request | 15.5.20 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 422 | Unprocessable Content | 15.5.21 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 426 | Upgrade Required | 15.5.22 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 500 | Internal Server Error | 15.6.1 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 501 | Not Implemented | 15.6.2 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 502 | Bad Gateway | 15.6.3 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 503 | Service Unavailable | 15.6.4 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 504 | Gateway Timeout | 15.6.5 | | ||||
| +-------+-------------------------------+---------+ | ||||
| | 505 | HTTP Version Not Supported | 15.6.6 | | ||||
| +-------+-------------------------------+---------+ | ||||
| Table 8 | ||||
| 18.4. Field Name Registration | 18.4. Field Name Registration | |||
| [new] | This specification updates the HTTP related aspects of the existing | |||
| registration procedures for message header fields defined in | ||||
| [RFC3864]. It defines both a new registration procedure and moves | ||||
| HTTP field definitions into a separate registry. | ||||
| [new] | Please create a new registry as outlined in Section 16.3.1. | |||
| [new] | After creating the registry, all entries in the Permanent and | |||
| Provisional Message Header Registries with the protocol 'http' are to | ||||
| be moved to it, with the following changes applied: | ||||
| [new] | 1. The 'Applicable Protocol' field is to be omitted. | |||
| [new] | 2. Entries with a status of 'standard', 'experimental', 'reserved', | |||
| or 'informational' are to have a status of 'permanent'. | ||||
| [new] | 3. Provisional entries without a status are to have a status of | |||
| 'provisional'. | ||||
| [new] | 4. Permanent entries without a status (after confirmation that the | |||
| registration document did not define one) will have a status of | ||||
| 'provisional'. The Expert(s) can choose to update their status | ||||
| if there is evidence that another is more appropriate. | ||||
| [new] | Please annotate the Permanent and Provisional Message Header | |||
| registries to indicate that HTTP field name registrations have moved, | ||||
| with an appropriate link. | ||||
| The "Message Headers" registry has been updated with the following | After that is complete, please update the new registry with the field | |||
| permanent registrations: | names listed in the following table. | |||
| +-------------------+----------+----------+-----------------+ | +===========================+============+========+============+ | |||
| | Header Field Name | Protocol | Status | Reference | | | Field Name | Status | Ref. | Comments | | |||
| +-------------------+----------+----------+-----------------+ | +===========================+============+========+============+ | |||
| | Accept | http | standard | Section 5.3.2 | | | Accept | standard | 12.5.1 | | | |||
| | Accept-Charset | http | standard | Section 5.3.3 | | +---------------------------+------------+--------+------------+ | |||
| | Accept-Encoding | http | standard | Section 5.3.4 | | | Accept-Charset | deprecated | 12.5.2 | | | |||
| | Accept-Language | http | standard | Section 5.3.5 | | +---------------------------+------------+--------+------------+ | |||
| | Accept-Ranges | http | standard | Section 2.3 | | | Accept-Encoding | standard | 12.5.3 | | | |||
| | Allow | http | standard | Section 7.4.1 | | +---------------------------+------------+--------+------------+ | |||
| | Authorization | http | standard | Section 4.2 | | | Accept-Language | standard | 12.5.4 | | | |||
| | Connection | http | standard | Section 6.1 | | +---------------------------+------------+--------+------------+ | |||
| | Content-Encoding | http | standard | Section 3.1.2.2 | | | Accept-Ranges | standard | 14.3 | | | |||
| | Content-Language | http | standard | Section 3.1.3.2 | | +---------------------------+------------+--------+------------+ | |||
| | Content-Length | http | standard | Section 3.3.2 | | | Allow | standard | 10.2.1 | | | |||
| | Content-Location | http | standard | Section 3.1.4.2 | | +---------------------------+------------+--------+------------+ | |||
| | Content-Range | http | standard | Section 4.2 | | | Authentication-Info | standard | 11.6.3 | | | |||
| | Content-Type | http | standard | Section 3.1.1.5 | | +---------------------------+------------+--------+------------+ | |||
| | Date | http | standard | Section 7.1.1.2 | | | Authorization | standard | 11.6.2 | | | |||
| | ETag | http | standard | Section 2.3 | | +---------------------------+------------+--------+------------+ | |||
| | Expect | http | standard | Section 5.1.1 | | | Connection | standard | 7.6.1 | | | |||
| | From | http | standard | Section 5.5.1 | | +---------------------------+------------+--------+------------+ | |||
| | Host | http | standard | Section 5.4 | | | Content-Encoding | standard | 8.4 | | | |||
| | If-Match | http | standard | Section 3.1 | | +---------------------------+------------+--------+------------+ | |||
| | If-Modified-Since | http | standard | Section 3.3 | | | Content-Language | standard | 8.5 | | | |||
| | If-None-Match | http | standard | Section 3.2 | | +---------------------------+------------+--------+------------+ | |||
| | If-Range | http | standard | Section 3.2 | | | Content-Length | standard | 8.6 | | | |||
| | If-Unmodified-Since | http | standard | Section 3.4 | | +---------------------------+------------+--------+------------+ | |||
| | Last-Modified | http | standard | Section 2.2 | | | Content-Location | standard | 8.7 | | | |||
| | Location | http | standard | Section 7.1.2 | | +---------------------------+------------+--------+------------+ | |||
| | Max-Forwards | http | standard | Section 5.1.2 | | | Content-Range | standard | 14.4 | | | |||
| | Proxy-Authenticate | http | standard | Section 4.3 | | +---------------------------+------------+--------+------------+ | |||
| | Proxy-Authorization | http | standard | Section 4.4 | | | Content-Type | standard | 8.3 | | | |||
| | Range | http | standard | Section 3.1 | | +---------------------------+------------+--------+------------+ | |||
| | Referer | http | standard | Section 5.5.2 | | | Date | standard | 6.6.1 | | | |||
| | Retry-After | http | standard | Section 7.1.3 | | +---------------------------+------------+--------+------------+ | |||
| | Server | http | standard | Section 7.4.2 | | | ETag | standard | 8.8.3 | | | |||
| | TE | http | standard | Section 4.3 | | +---------------------------+------------+--------+------------+ | |||
| | Trailer | http | standard | Section 4.4 | | | Expect | standard | 10.1.1 | | | |||
| | Upgrade | http | standard | Section 6.7 | | +---------------------------+------------+--------+------------+ | |||
| | User-Agent | http | standard | Section 5.5.3 | | | From | standard | 10.1.2 | | | |||
| | Vary | http | standard | Section 7.1.4 | | +---------------------------+------------+--------+------------+ | |||
| | Via | http | standard | Section 5.7.1 | | | Host | standard | 7.2 | | | |||
| | WWW-Authenticate | http | standard | Section 4.1 | | +---------------------------+------------+--------+------------+ | |||
| +-------------------+----------+----------+-----------------+ | | If-Match | standard | 13.1.1 | | | |||
| +---------------------------+------------+--------+------------+ | ||||
| | If-Modified-Since | standard | 13.1.3 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | If-None-Match | standard | 13.1.2 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | If-Range | standard | 13.1.5 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | If-Unmodified-Since | standard | 13.1.4 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | Last-Modified | standard | 8.8.2 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | Location | standard | 10.2.2 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | Max-Forwards | standard | 7.6.2 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | Proxy-Authenticate | standard | 11.7.1 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | Proxy-Authentication-Info | standard | 11.7.3 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | Proxy-Authorization | standard | 11.7.2 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | Range | standard | 14.2 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | Referer | standard | 10.1.3 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | Retry-After | standard | 10.2.3 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | Server | standard | 10.2.4 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | TE | standard | 10.1.4 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | Trailer | standard | 6.6.2 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | Upgrade | standard | 7.8 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | User-Agent | standard | 10.1.5 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | Vary | standard | 12.5.5 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | Via | standard | 7.6.3 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | WWW-Authenticate | standard | 11.6.1 | | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| | * | standard | 12.5.5 | (reserved) | | ||||
| +---------------------------+------------+--------+------------+ | ||||
| Table 9 | ||||
| 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 12.5.5). | ||||
| Finally, please update the "Content-MD5" entry in the new registry to | ||||
| have a status of 'obsoleted' with references to Section 14.15 of | ||||
| [RFC2616] (for the definition of the header field) and Appendix B of | ||||
| [RFC7231] (which removed the field definition from the updated | ||||
| specification). | ||||
| 18.5. Authentication Scheme Registration | 18.5. Authentication Scheme Registration | |||
| The "Hypertext Transfer Protocol (HTTP) Authentication Scheme | Please update the "Hypertext Transfer Protocol (HTTP) Authentication | |||
| Registry" defines the namespace for the authentication schemes in | Scheme Registry" at <https://www.iana.org/assignments/http- | |||
| challenges and credentials. It has been created and is now | authschemes> with the registration procedure of Section 16.4.1. No | |||
| maintained at <http://www.iana.org/assignments/http-authschemes>. | authentication schemes are defined in this document. | |||
| 18.6. Content Coding Registration | 18.6. Content Coding Registration | |||
| IANA maintains the "HTTP Content Coding Registry" at | Please update the "HTTP Content Coding Registry" at | |||
| <http://www.iana.org/assignments/http-parameters>. | <https://www.iana.org/assignments/http-parameters/> with the | |||
| The "HTTP Content Coding Registry" has been updated with the | registration procedure of Section 16.6.1 and the content coding names | |||
| registrations below: | summarized in the table below. | |||
| +------------+--------------------------------------+---------------+ | +============+===========================================+=========+ | |||
| | Name | Description | Reference | | | Name | Description | Ref. | | |||
| +------------+--------------------------------------+---------------+ | +============+===========================================+=========+ | |||
| | compress | UNIX "compress" data format [Welch] | Section 4.2.1 | | | compress | UNIX "compress" data format [Welch] | 8.4.1.1 | | |||
| | deflate | "deflate" compressed data | Section 4.2.2 | | +------------+-------------------------------------------+---------+ | |||
| | | ([RFC1951]) inside the "zlib" data | | | | deflate | "deflate" compressed data ([RFC1951]) | 8.4.1.2 | | |||
| | | format ([RFC1950]) | | | | | inside the "zlib" data format ([RFC1950]) | | | |||
| | gzip | GZIP file format [RFC1952] | Section 4.2.3 | | +------------+-------------------------------------------+---------+ | |||
| | identity | Reserved (synonym for "no encoding" in | Section 5.3.4 | | | gzip | GZIP file format [RFC1952] | 8.4.1.3 | | |||
| | | Accept-Encoding) | | | +------------+-------------------------------------------+---------+ | |||
| | x-compress | Deprecated (alias for compress) | Section 4.2.1 | | | identity | Reserved | 12.5.3 | | |||
| | x-gzip | Deprecated (alias for gzip) | Section 4.2.3 | | +------------+-------------------------------------------+---------+ | |||
| +------------+--------------------------------------+---------------+ | | x-compress | Deprecated (alias for compress) | 8.4.1.1 | | |||
| +------------+-------------------------------------------+---------+ | ||||
| | x-gzip | Deprecated (alias for gzip) | 8.4.1.3 | | ||||
| +------------+-------------------------------------------+---------+ | ||||
| Table 10 | ||||
| 18.7. Range Unit Registration | 18.7. Range Unit Registration | |||
| The initial range unit registry contains the registrations below: | Please update the "HTTP Range Unit Registry" at | |||
| <https://www.iana.org/assignments/http-parameters/> with the | ||||
| registration procedure of Section 16.5.1 and the range unit names | ||||
| summarized in the table below. | ||||
| +------------+-----------------------------------------+------------+ | +=================+==================================+========+ | |||
| Range Unit Name Description Ref. | | Range Unit Name | Description | Ref. | | |||
| | Name | | | | +=================+==================================+========+ | |||
| +------------+-----------------------------------------+------------+ | | bytes | a range of octets | 14.1.2 | | |||
| | bytes | a range of octets | Section 2.1 | | +-----------------+----------------------------------+--------+ | |||
| | none | reserved as keyword, indicating no | Section 2.3 | | | none | reserved as keyword to indicate | 14.3 | | |||
| | | ranges are supported | | | | | range requests are not supported | | | |||
| +------------+-----------------------------------------+------------+ | +-----------------+----------------------------------+--------+ | |||
| Table 11 | ||||
| 18.8. Media Type Registration | 18.8. Media Type Registration | |||
| IANA maintains the registry of Internet media types [BCP13] at | Please update the "Media Types" registry at | |||
| <http://www.iana.org/assignments/media-types>. | <https://www.iana.org/assignments/media-types> with the registration | |||
| information in Section 14.6 for the media type "multipart/ | ||||
| byteranges". | ||||
| 18.9. Port Registration | 18.9. Port Registration | |||
| [new] | Please update the "Service Name and Transport Protocol Port Number" | |||
| registry at <https://www.iana.org/assignments/service-names-port- | ||||
| numbers/> for the services on ports 80 and 443 that use UDP or TCP | ||||
| to: | ||||
| 1. use this document as "Reference", and | ||||
| 2. when currently unspecified, set "Assignee" to "IESG" and | ||||
| "Contact" to "IETF_Chair". | ||||
| 18.10. Upgrade Token Registration | 18.10. Upgrade Token Registration | |||
| The "HTTP" entry in the upgrade token registry has been updated with | Please update the "Hypertext Transfer Protocol (HTTP) Upgrade Token | |||
| the registration below: | Registry" at <https://www.iana.org/assignments/http-upgrade-tokens> | |||
| with the registration procedure of Section 16.7 and the upgrade token | ||||
| names summarized in the following table. | ||||
| +-------+----------------------+----------------------+-------------+ | +======+===================+=========================+======+ | |||
| | Value | Description | Expected Version | Reference | | | Name | Description | Expected Version Tokens | Ref. | | |||
| | | | Tokens | | | +======+===================+=========================+======+ | |||
| +-------+----------------------+----------------------+-------------+ | | HTTP | Hypertext | any DIGIT.DIGIT (e.g, | 2.5 | | |||
| | HTTP | Hypertext Transfer | any DIGIT.DIGIT | Section 2.6 | | | | Transfer Protocol | "2.0") | | | |||
| | | Protocol | (e.g, "2.0") | | | +------+-------------------+-------------------------+------+ | |||
| +-------+----------------------+----------------------+-------------+ | ||||
| Table 12 | ||||
| 19. References | 19. References | |||
| 19.1. Normative References | 19.1. Normative References | |||
| [new] | [CACHING] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
| Ed., "HTTP Caching", Work in Progress, Internet-Draft, | ||||
| [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | draft-ietf-httpbis-cache-18, 18 August 2021, | |||
| RFC 793, September 1981. | <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | |||
| cache-18>. | ||||
| [new] | ||||
| [new] | [RFC1950] Deutsch, L.P. and J-L. Gailly, "ZLIB Compressed Data | |||
| Format Specification version 3.3", RFC 1950, | ||||
| DOI 10.17487/RFC1950, May 1996, | ||||
| <https://www.rfc-editor.org/info/rfc1950>. | ||||
| [new] | [RFC1951] Deutsch, P., "DEFLATE Compressed Data Format Specification | |||
| version 1.3", RFC 1951, DOI 10.17487/RFC1951, May 1996, | ||||
| <https://www.rfc-editor.org/info/rfc1951>. | ||||
| [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail | [RFC1952] Deutsch, P., Gailly, J-L., Adler, M., Deutsch, L.P., and | |||
| Extensions (MIME) Part One: Format of Internet Message | G. Randers-Pehrson, "GZIP file format specification | |||
| Bodies", RFC 2045, November 1996. | version 4.3", RFC 1952, DOI 10.17487/RFC1952, May 1996, | |||
| <https://www.rfc-editor.org/info/rfc1952>. | ||||
| [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail | [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail | |||
| Extensions (MIME) Part Two: Media Types", RFC 2046, | Extensions (MIME) Part Two: Media Types", RFC 2046, | |||
| November 1996. | DOI 10.17487/RFC2046, November 1996, | |||
| <https://www.rfc-editor.org/info/rfc2046>. | ||||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, March 1997. | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | ||||
| [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | <https://www.rfc-editor.org/info/rfc2119>. | |||
| Resource Identifier (URI): Generic Syntax", STD 66, | ||||
| RFC 3986, January 2005. | ||||
| [RFC4647] Phillips, A., Ed. and M. Davis, Ed., "Matching of Language | [RFC4647] Phillips, A., Ed. and M. Davis, Ed., "Matching of Language | |||
| Tags", BCP 47, RFC 4647, September 2006. | Tags", BCP 47, RFC 4647, DOI 10.17487/RFC4647, September | |||
| 2006, <https://www.rfc-editor.org/info/rfc4647>. | ||||
| [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | |||
| Encodings", RFC 4648, October 2006. | Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006, | |||
| <https://www.rfc-editor.org/info/rfc4648>. | ||||
| [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | |||
| Specifications: ABNF", STD 68, RFC 5234, January 2008. | Specifications: ABNF", STD 68, RFC 5234, | |||
| DOI 10.17487/RFC5234, January 2008, | ||||
| <https://www.rfc-editor.org/info/rfc5234>. | ||||
| [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., | ||||
| Housley, R., and W. Polk, "Internet X.509 Public Key | ||||
| Infrastructure Certificate and Certificate Revocation List | ||||
| (CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008, | ||||
| <https://www.rfc-editor.org/info/rfc5280>. | ||||
| [RFC5322] Resnick, P., "Internet Message Format", RFC 5322, | ||||
| DOI 10.17487/RFC5322, October 2008, | ||||
| <https://www.rfc-editor.org/info/rfc5322>. | ||||
| [RFC5646] Phillips, A., Ed. and M. Davis, Ed., "Tags for Identifying | [RFC5646] Phillips, A., Ed. and M. Davis, Ed., "Tags for Identifying | |||
| Languages", BCP 47, RFC 5646, September 2009. | Languages", BCP 47, RFC 5646, DOI 10.17487/RFC5646, | |||
| September 2009, <https://www.rfc-editor.org/info/rfc5646>. | ||||
| [RFC6125] Saint-Andre, P. and J. Hodges, "Representation and | ||||
| Verification of Domain-Based Application Service Identity | ||||
| within Internet Public Key Infrastructure Using X.509 | ||||
| (PKIX) Certificates in the Context of Transport Layer | ||||
| Security (TLS)", RFC 6125, DOI 10.17487/RFC6125, March | ||||
| 2011, <https://www.rfc-editor.org/info/rfc6125>. | ||||
| [RFC6365] Hoffman, P. and J. Klensin, "Terminology Used in | [RFC6365] Hoffman, P. and J. Klensin, "Terminology Used in | |||
| Internationalization in the IETF", BCP 166, RFC 6365, | Internationalization in the IETF", BCP 166, RFC 6365, | |||
| September 2011. | DOI 10.17487/RFC6365, September 2011, | |||
| <https://www.rfc-editor.org/info/rfc6365>. | ||||
| [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [RFC7405] Kyzivat, P., "Case-Sensitive String Support in ABNF", | |||
| Protocol (HTTP/1.1): Message Syntax and Routing", | RFC 7405, DOI 10.17487/RFC7405, December 2014, | |||
| RFC 7230, June 2014. | <https://www.rfc-editor.org/info/rfc7405>. | |||
| [RFC7232] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| Protocol (HTTP/1.1): Conditional Requests", RFC 7232, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| June 2014. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| [RFC7233] Fielding, R., Ed., Lafon, Y., Ed., and J. Reschke, Ed., | [TCP] Postel, J., "Transmission Control Protocol", STD 7, | |||
| "Hypertext Transfer Protocol (HTTP/1.1): Range Requests", | RFC 793, DOI 10.17487/RFC0793, September 1981, | |||
| RFC 7233, June 2014. | <https://www.rfc-editor.org/info/rfc793>. | |||
| [RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | [TLS13] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
| Ed., "Hypertext Transfer Protocol (HTTP/1.1): Caching", | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
| RFC 7234, June 2014. | <https://www.rfc-editor.org/info/rfc8446>. | |||
| [RFC7235] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [URI] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | |||
| Protocol (HTTP/1.1): Authentication", RFC 7235, June 2014. | Resource Identifier (URI): Generic Syntax", STD 66, | |||
| RFC 3986, DOI 10.17487/RFC3986, January 2005, | ||||
| <https://www.rfc-editor.org/info/rfc3986>. | ||||
| [USASCII] American National Standards Institute, "Coded Character | ||||
| Set -- 7-bit American Standard Code for Information | ||||
| Interchange", ANSI X3.4, 1986. | ||||
| [Welch] Welch, T. A., "A Technique for High-Performance Data | ||||
| Compression", IEEE Computer 17(6), | ||||
| DOI 10.1109/MC.1984.1659158, June 1984, | ||||
| <https://ieeexplore.ieee.org/document/1659158/>. | ||||
| 19.2. Informative References | 19.2. Informative References | |||
| [BCP115] Hansen, T., Hardie, T., and L. Masinter, "Guidelines | [ALTSVC] Nottingham, M., McManus, P., and J. Reschke, "HTTP | |||
| and Registration Procedures for New URI Schemes", | Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | |||
| BCP 115, RFC 4395, February 2006. | April 2016, <https://www.rfc-editor.org/info/rfc7838>. | |||
| [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>. | ||||
| [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>. | ||||
| [BCP90] Klyne, G., Nottingham, M., and J. Mogul, "Registration | [BCP35] Thaler, D., Ed., Hansen, T., and T. Hardie, "Guidelines | |||
| Procedures for Message Header Fields", BCP 90, RFC 3864, | and Registration Procedures for URI Schemes", BCP 35, | |||
| September 2004. | RFC 7595, June 2015, | |||
| <https://www.rfc-editor.org/info/bcp35>. | ||||
| [Georgiev] Georgiev, M., Iyengar, S., Jana, S., Anubhai, R., | [BREACH] Gluck, Y., Harris, N., and A. Prado, "BREACH: Reviving the | |||
| Boneh, D., and V. Shmatikov, "The Most Dangerous Code | CRIME Attack", July 2013, | |||
| in the World: Validating SSL Certificates in Non- | <http://breachattack.com/resources/ | |||
| browser Software", In Proceedings of the 2012 ACM | BREACH%20-%20SSL,%20gone%20in%2030%20seconds.pdf>. | |||
| Conference on Computer and Communications Security (CCS | ||||
| '12), pp. 38-49, October 2012, | [Bujlow] Bujlow, T., Carela-Espanol, V., Sole-Pareta, J., and P. | |||
| <http://doi.acm.org/10.1145/2382196.2382204>. | Barlet-Ros, "A Survey on Web Tracking: Mechanisms, | |||
| Implications, and Defenses", | ||||
| DOI 10.1109/JPROC.2016.2637878, Proceedings of the | ||||
| IEEE 105(8), August 2017, | ||||
| <https://doi.org/10.1109/JPROC.2016.2637878>. | ||||
| [COOKIE] Barth, A., "HTTP State Management Mechanism", RFC 6265, | ||||
| DOI 10.17487/RFC6265, April 2011, | ||||
| <https://www.rfc-editor.org/info/rfc6265>. | ||||
| [Err1912] RFC Errata, Erratum ID 1912, RFC 2978, | ||||
| <https://www.rfc-editor.org/errata/eid1912>. | ||||
| [Err5433] RFC Errata, Erratum ID 5433, RFC 2978, | ||||
| <https://www.rfc-editor.org/errata/eid5433>. | ||||
| [Georgiev] Georgiev, M., Iyengar, S., Jana, S., Anubhai, R., Boneh, | ||||
| D., and V. Shmatikov, "The Most Dangerous Code in the | ||||
| World: Validating SSL Certificates in Non-browser | ||||
| Software", In Proceedings of the 2012 ACM Conference on | ||||
| Computer and Communications Security (CCS '12), pp. 38-49, | ||||
| DOI 10.1145/2382196.2382204, October 2012, | ||||
| <https://doi.org/10.1145/2382196.2382204>. | ||||
| [HPACK] Peon, R. and H. Ruellan, "HPACK: Header Compression for | ||||
| HTTP/2", RFC 7541, DOI 10.17487/RFC7541, May 2015, | ||||
| <https://www.rfc-editor.org/info/rfc7541>. | ||||
| [HTTP/1.0] Berners-Lee, T., Fielding, R.T., and H.F. Nielsen, | ||||
| "Hypertext Transfer Protocol -- HTTP/1.0", RFC 1945, | ||||
| DOI 10.17487/RFC1945, May 1996, | ||||
| <https://www.rfc-editor.org/info/rfc1945>. | ||||
| [HTTP/1.1] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | ||||
| Ed., "HTTP/1.1", Work in Progress, Internet-Draft, draft- | ||||
| ietf-httpbis-messaging-18, 18 August 2021, | ||||
| <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | ||||
| messaging-18>. | ||||
| [HTTP/2] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | ||||
| Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | ||||
| DOI 10.17487/RFC7540, May 2015, | ||||
| <https://www.rfc-editor.org/info/rfc7540>. | ||||
| [HTTP/3] Bishop, M., "Hypertext Transfer Protocol Version 3 | ||||
| (HTTP/3)", Work in Progress, Internet-Draft, draft-ietf- | ||||
| quic-http-34, 2 February 2021, | ||||
| <https://datatracker.ietf.org/doc/html/draft-ietf-quic- | ||||
| http-34>. | ||||
| [ISO-8859-1] | ||||
| International Organization for Standardization, | ||||
| "Information technology -- 8-bit single-byte coded graphic | ||||
| character sets -- Part 1: Latin alphabet No. 1", ISO/ | ||||
| IEC 8859-1:1998, 1998. | ||||
| [Kri2001] Kristol, D., "HTTP Cookies: Standards, Privacy, and | ||||
| Politics", ACM Transactions on Internet Technology 1(2), | ||||
| November 2001, <http://arxiv.org/abs/cs.SE/0105018>. | ||||
| [OWASP] van der Stock, A., Ed., "A Guide to Building Secure Web | [OWASP] van der Stock, A., Ed., "A Guide to Building Secure Web | |||
| Applications and Web Services", The Open Web Application | Applications and Web Services", The Open Web Application | |||
| Security Project (OWASP) 2.0.1, July 2005, | Security Project (OWASP) 2.0.1, 27 July 2005, | |||
| <https://www.owasp.org/>. | <https://www.owasp.org/>. | |||
| [REST] Fielding, R., "Architectural Styles and the Design of | [REST] Fielding, R.T., "Architectural Styles and the Design of | |||
| Network-based Software Architectures", | Network-based Software Architectures", Doctoral | |||
| Doctoral Dissertation, University of California, Irvine, | Dissertation, University of California, Irvine, September | |||
| September 2000, | 2000, <https://roy.gbiv.com/pubs/dissertation/top.htm>. | |||
| <http://roy.gbiv.com/pubs/dissertation/top.htm>. | ||||
| [RFC1919] Chatel, M., "Classical versus Transparent IP Proxies", | [RFC1919] Chatel, M., "Classical versus Transparent IP Proxies", | |||
| RFC 1919, March 1996. | RFC 1919, DOI 10.17487/RFC1919, March 1996, | |||
| <https://www.rfc-editor.org/info/rfc1919>. | ||||
| [RFC1945] Berners-Lee, T., Fielding, R., and H. Nielsen, "Hypertext | [RFC2047] Moore, K., "MIME (Multipurpose Internet Mail Extensions) | |||
| Transfer Protocol -- HTTP/1.0", RFC 1945, May 1996. | Part Three: Message Header Extensions for Non-ASCII Text", | |||
| RFC 2047, DOI 10.17487/RFC2047, November 1996, | ||||
| <https://www.rfc-editor.org/info/rfc2047>. | ||||
| [RFC2068] Fielding, R., Gettys, J., Mogul, J., Nielsen, H., and T. | [RFC2068] Fielding, R., Gettys, J., Mogul, J., Nielsen, H., and T. | |||
| Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", | Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", | |||
| RFC 2068, January 1997. | RFC 2068, DOI 10.17487/RFC2068, January 1997, | |||
| <https://www.rfc-editor.org/info/rfc2068>. | ||||
| [RFC2145] Mogul, J., Fielding, R., Gettys, J., and H. Nielsen, | [RFC2145] Mogul, J.C., Fielding, R.T., Gettys, J., and H.F. Nielsen, | |||
| "Use and Interpretation of HTTP Version Numbers", | "Use and Interpretation of HTTP Version Numbers", | |||
| RFC 2145, May 1997. | RFC 2145, DOI 10.17487/RFC2145, May 1997, | |||
| <https://www.rfc-editor.org/info/rfc2145>. | ||||
| [RFC2295] Holtman, K. and A. Mutz, "Transparent Content Negotiation | [RFC2295] Holtman, K. and A.H. Mutz, "Transparent Content | |||
| in HTTP", RFC 2295, March 1998. | Negotiation in HTTP", RFC 2295, DOI 10.17487/RFC2295, | |||
| March 1998, <https://www.rfc-editor.org/info/rfc2295>. | ||||
| [RFC2388] Masinter, L., "Returning Values from Forms: multipart/ | [RFC2324] Masinter, L., "Hyper Text Coffee Pot Control Protocol | |||
| form-data", RFC 2388, August 1998. | (HTCPCP/1.0)", RFC 2324, DOI 10.17487/RFC2324, 1 April | |||
| 1998, <https://www.rfc-editor.org/info/rfc2324>. | ||||
| [RFC2557] Palme, F., Hopmann, A., Shelness, N., and E. Stefferud, | [RFC2557] Palme, F., Hopmann, A., Shelness, N., and E. Stefferud, | |||
| "MIME Encapsulation of Aggregate Documents, such as HTML | "MIME Encapsulation of Aggregate Documents, such as HTML | |||
| (MHTML)", RFC 2557, March 1999. | (MHTML)", RFC 2557, DOI 10.17487/RFC2557, March 1999, | |||
| <https://www.rfc-editor.org/info/rfc2557>. | ||||
| [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., | [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., | |||
| Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext | Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext | |||
| Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999. | Transfer Protocol -- HTTP/1.1", RFC 2616, | |||
| DOI 10.17487/RFC2616, June 1999, | ||||
| <https://www.rfc-editor.org/info/rfc2616>. | ||||
| [RFC2617] Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S., | [RFC2617] Franks, J., Hallam-Baker, P.M., Hostetler, J.L., Lawrence, | |||
| Leach, P., Luotonen, A., and L. Stewart, "HTTP | S.D., Leach, P.J., Luotonen, A., and L. Stewart, "HTTP | |||
| Authentication: Basic and Digest Access Authentication", | Authentication: Basic and Digest Access Authentication", | |||
| RFC 2617, June 1999. | RFC 2617, DOI 10.17487/RFC2617, June 1999, | |||
| <https://www.rfc-editor.org/info/rfc2617>. | ||||
| [RFC2774] Frystyk, H., Leach, P., and S. Lawrence, "An HTTP | [RFC2774] Frystyk, H., Leach, P., and S. Lawrence, "An HTTP | |||
| Extension Framework", RFC 2774, February 2000. | Extension Framework", RFC 2774, DOI 10.17487/RFC2774, | |||
| February 2000, <https://www.rfc-editor.org/info/rfc2774>. | ||||
| [RFC2817] Khare, R. and S. Lawrence, "Upgrading to TLS Within | ||||
| HTTP/1.1", RFC 2817, May 2000. | ||||
| [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000. | [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, | |||
| DOI 10.17487/RFC2818, May 2000, | ||||
| <https://www.rfc-editor.org/info/rfc2818>. | ||||
| [RFC2978] Freed, N. and J. Postel, "IANA Charset Registration | [RFC2978] Freed, N. and J. Postel, "IANA Charset Registration | |||
| Procedures", BCP 19, RFC 2978, October 2000. | Procedures", BCP 19, RFC 2978, DOI 10.17487/RFC2978, | |||
| October 2000, <https://www.rfc-editor.org/info/rfc2978>. | ||||
| [RFC3040] Cooper, I., Melve, I., and G. Tomlinson, "Internet Web | ||||
| Replication and Caching Taxonomy", RFC 3040, | ||||
| January 2001. | ||||
| [RFC4033] Arends, R., Austein, R., Larson, M., Massey, D., and S. | ||||
| Rose, "DNS Security Introduction and Requirements", | ||||
| RFC 4033, March 2005. | ||||
| [RFC4559] Jaganathan, K., Zhu, L., and J. Brezak, "SPNEGO-based | [RFC3040] Cooper, I., Melve, I., and G. Tomlinson, "Internet Web | |||
| Kerberos and NTLM HTTP Authentication in Microsoft | Replication and Caching Taxonomy", RFC 3040, | |||
| Windows", RFC 4559, June 2006. | DOI 10.17487/RFC3040, January 2001, | |||
| <https://www.rfc-editor.org/info/rfc3040>. | ||||
| [RFC4918] Dusseault, L., Ed., "HTTP Extensions for Web Distributed | [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration | |||
| Authoring and Versioning (WebDAV)", RFC 4918, June 2007. | Procedures for Message Header Fields", BCP 90, RFC 3864, | |||
| DOI 10.17487/RFC3864, September 2004, | ||||
| <https://www.rfc-editor.org/info/rfc3864>. | ||||
| [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an | [RFC3875] Robinson, D. and K. Coar, "The Common Gateway Interface | |||
| IANA Considerations Section in RFCs", BCP 26, RFC 5226, | (CGI) Version 1.1", RFC 3875, DOI 10.17487/RFC3875, | |||
| May 2008. | October 2004, <https://www.rfc-editor.org/info/rfc3875>. | |||
| [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security | [RFC4033] Arends, R., Austein, R., Larson, M., Massey, D., and S. | |||
| (TLS) Protocol Version 1.2", RFC 5246, August 2008. | Rose, "DNS Security Introduction and Requirements", | |||
| RFC 4033, DOI 10.17487/RFC4033, March 2005, | ||||
| <https://www.rfc-editor.org/info/rfc4033>. | ||||
| [RFC5322] Resnick, P., "Internet Message Format", RFC 5322, | [RFC4559] Jaganathan, K., Zhu, L., and J. Brezak, "SPNEGO-based | |||
| October 2008. | Kerberos and NTLM HTTP Authentication in Microsoft | |||
| Windows", RFC 4559, DOI 10.17487/RFC4559, June 2006, | ||||
| <https://www.rfc-editor.org/info/rfc4559>. | ||||
| [RFC5789] Dusseault, L. and J. Snell, "PATCH Method for HTTP", | [RFC5789] Dusseault, L. and J. Snell, "PATCH Method for HTTP", | |||
| RFC 5789, March 2010. | RFC 5789, DOI 10.17487/RFC5789, March 2010, | |||
| <https://www.rfc-editor.org/info/rfc5789>. | ||||
| [RFC5861] Nottingham, M., "HTTP Cache-Control Extensions for Stale | ||||
| Content", RFC 5861, April 2010. | ||||
| [RFC5905] Mills, D., Martin, J., Ed., Burbank, J., and W. Kasch, | [RFC5905] Mills, D., Martin, J., Ed., Burbank, J., and W. Kasch, | |||
| "Network Time Protocol Version 4: Protocol and Algorithms | "Network Time Protocol Version 4: Protocol and Algorithms | |||
| Specification", RFC 5905, June 2010. | Specification", RFC 5905, DOI 10.17487/RFC5905, June 2010, | |||
| <https://www.rfc-editor.org/info/rfc5905>. | ||||
| [RFC5987] Reschke, J., "Character Set and Language Encoding for | [RFC6454] Barth, A., "The Web Origin Concept", RFC 6454, | |||
| Hypertext Transfer Protocol (HTTP) Header Field | DOI 10.17487/RFC6454, December 2011, | |||
| Parameters", RFC 5987, August 2010. | <https://www.rfc-editor.org/info/rfc6454>. | |||
| [RFC5988] Nottingham, M., "Web Linking", RFC 5988, October 2010. | [RFC6585] Nottingham, M. and R. Fielding, "Additional HTTP Status | |||
| Codes", RFC 6585, DOI 10.17487/RFC6585, April 2012, | ||||
| <https://www.rfc-editor.org/info/rfc6585>. | ||||
| [RFC6265] Barth, A., "HTTP State Management Mechanism", RFC 6265, | [RFC7230] Fielding, R., Ed. and J. F. Reschke, Ed., "Hypertext | |||
| April 2011. | Transfer Protocol (HTTP/1.1): Message Syntax and Routing", | |||
| RFC 7230, DOI 10.17487/RFC7230, June 2014, | ||||
| <https://www.rfc-editor.org/info/rfc7230>. | ||||
| [RFC6266] Reschke, J., "Use of the Content-Disposition Header Field | [RFC7231] Fielding, R., Ed. and J. F. Reschke, Ed., "Hypertext | |||
| in the Hypertext Transfer Protocol (HTTP)", RFC 6266, | Transfer Protocol (HTTP/1.1): Semantics and Content", | |||
| June 2011. | RFC 7231, DOI 10.17487/RFC7231, June 2014, | |||
| <https://www.rfc-editor.org/info/rfc7231>. | ||||
| [RFC7238] Reschke, J., "The Hypertext Transfer Protocol (HTTP) | [RFC7232] Fielding, R., Ed. and J. F. Reschke, Ed., "Hypertext | |||
| Status Code 308 (Permanent Redirect)", RFC 7238, | Transfer Protocol (HTTP/1.1): Conditional Requests", | |||
| June 2014. | RFC 7232, DOI 10.17487/RFC7232, June 2014, | |||
| <https://www.rfc-editor.org/info/rfc7232>. | ||||
| [RFC7233] Fielding, R., Ed., Lafon, Y., Ed., and J. F. Reschke, Ed., | ||||
| "Hypertext Transfer Protocol (HTTP/1.1): Range Requests", | ||||
| RFC 7233, DOI 10.17487/RFC7233, June 2014, | ||||
| <https://www.rfc-editor.org/info/rfc7233>. | ||||
| [RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. F. Reschke, | ||||
| Ed., "Hypertext Transfer Protocol (HTTP): Caching", | ||||
| RFC 7234, DOI 10.17487/RFC7234, June 2014, | ||||
| <https://www.rfc-editor.org/info/rfc7234>. | ||||
| [RFC7235] Fielding, R., Ed. and J. F. Reschke, Ed., "Hypertext | ||||
| Transfer Protocol (HTTP/1.1): Authentication", RFC 7235, | ||||
| DOI 10.17487/RFC7235, June 2014, | ||||
| <https://www.rfc-editor.org/info/rfc7235>. | ||||
| [RFC7538] Reschke, J. F., "The Hypertext Transfer Protocol Status | ||||
| Code 308 (Permanent Redirect)", RFC 7538, | ||||
| DOI 10.17487/RFC7538, April 2015, | ||||
| <https://www.rfc-editor.org/info/rfc7538>. | ||||
| [RFC7578] Masinter, L., "Returning Values from Forms: multipart/ | ||||
| form-data", RFC 7578, DOI 10.17487/RFC7578, July 2015, | ||||
| <https://www.rfc-editor.org/info/rfc7578>. | ||||
| [RFC7615] Reschke, J. F., "HTTP Authentication-Info and Proxy- | ||||
| Authentication-Info Response Header Fields", RFC 7615, | ||||
| DOI 10.17487/RFC7615, September 2015, | ||||
| <https://www.rfc-editor.org/info/rfc7615>. | ||||
| [RFC7616] Shekh-Yusef, R., Ed., Ahrens, D., and S. Bremer, "HTTP | ||||
| Digest Access Authentication", RFC 7616, | ||||
| DOI 10.17487/RFC7616, September 2015, | ||||
| <https://www.rfc-editor.org/info/rfc7616>. | ||||
| [RFC7617] Reschke, J. F., "The 'Basic' HTTP Authentication Scheme", | ||||
| RFC 7617, DOI 10.17487/RFC7617, September 2015, | ||||
| <https://www.rfc-editor.org/info/rfc7617>. | ||||
| [RFC7694] Reschke, J. F., "Hypertext Transfer Protocol (HTTP) | ||||
| Client-Initiated Content-Encoding", RFC 7694, | ||||
| DOI 10.17487/RFC7694, November 2015, | ||||
| <https://www.rfc-editor.org/info/rfc7694>. | ||||
| [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | ||||
| Writing an IANA Considerations Section in RFCs", BCP 26, | ||||
| RFC 8126, DOI 10.17487/RFC8126, June 2017, | ||||
| <https://www.rfc-editor.org/info/rfc8126>. | ||||
| [RFC8187] Reschke, J. F., "Indicating Character Encoding and | ||||
| Language for HTTP Header Field Parameters", RFC 8187, | ||||
| DOI 10.17487/RFC8187, September 2017, | ||||
| <https://www.rfc-editor.org/info/rfc8187>. | ||||
| [RFC8246] McManus, P., "HTTP Immutable Responses", RFC 8246, | ||||
| DOI 10.17487/RFC8246, September 2017, | ||||
| <https://www.rfc-editor.org/info/rfc8246>. | ||||
| [RFC8288] Nottingham, M., "Web Linking", RFC 8288, | ||||
| DOI 10.17487/RFC8288, October 2017, | ||||
| <https://www.rfc-editor.org/info/rfc8288>. | ||||
| [RFC8336] Nottingham, M. and E. Nygren, "The ORIGIN HTTP/2 Frame", | ||||
| RFC 8336, DOI 10.17487/RFC8336, March 2018, | ||||
| <https://www.rfc-editor.org/info/rfc8336>. | ||||
| [RFC8615] Nottingham, M., "Well-Known Uniform Resource Identifiers | ||||
| (URIs)", RFC 8615, DOI 10.17487/RFC8615, May 2019, | ||||
| <https://www.rfc-editor.org/info/rfc8615>. | ||||
| [RFC8941] Nottingham, M. and P-H. Kamp, "Structured Field Values for | ||||
| HTTP", RFC 8941, DOI 10.17487/RFC8941, February 2021, | ||||
| <https://www.rfc-editor.org/info/rfc8941>. | ||||
| [Sniffing] WHATWG, "MIME Sniffing", | ||||
| <https://mimesniff.spec.whatwg.org>. | ||||
| [WEBDAV] Dusseault, L.M., Ed., "HTTP Extensions for Web Distributed | ||||
| Authoring and Versioning (WebDAV)", RFC 4918, | ||||
| DOI 10.17487/RFC4918, June 2007, | ||||
| <https://www.rfc-editor.org/info/rfc4918>. | ||||
| 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 1.2 of [RFC7230]. | Section 5.6.1.1. | |||
| Accept = [ ( "," / ( media-range [ accept-params ] ) ) *( OWS "," [ | Accept = [ ( media-range [ weight ] ) *( OWS "," OWS ( media-range [ | |||
| OWS ( media-range [ accept-params ] ) ] ) ] | weight ] ) ) ] | |||
| Accept-Charset = *( "," OWS ) ( ( charset / "*" ) [ weight ] ) *( OWS | Accept-Charset = [ ( ( token / "*" ) [ weight ] ) *( OWS "," OWS ( ( | |||
| "," [ OWS ( ( charset / "*" ) [ weight ] ) ] ) | token / "*" ) [ weight ] ) ) ] | |||
| Accept-Encoding = [ ( "," / ( codings [ weight ] ) ) *( OWS "," [ OWS | Accept-Encoding = [ ( codings [ weight ] ) *( OWS "," OWS ( codings [ | |||
| ( codings [ weight ] ) ] ) ] | weight ] ) ) ] | |||
| Accept-Language = *( "," OWS ) ( language-range [ weight ] ) *( OWS | Accept-Language = [ ( language-range [ weight ] ) *( OWS "," OWS ( | |||
| "," [ OWS ( language-range [ weight ] ) ] ) | language-range [ weight ] ) ) ] | |||
| Allow = [ ( "," / method ) *( OWS "," [ OWS method ] ) ] | Accept-Ranges = acceptable-ranges | |||
| Allow = [ method *( OWS "," OWS method ) ] | ||||
| Authentication-Info = [ auth-param *( OWS "," OWS auth-param ) ] | ||||
| Authorization = credentials | ||||
| BWS = <BWS, see [RFC7230], Section 3.2.3> | BWS = OWS | |||
| Content-Encoding = *( "," OWS ) content-coding *( OWS "," [ OWS | Connection = [ connection-option *( OWS "," OWS connection-option ) | |||
| content-coding ] ) | ] | |||
| Content-Language = *( "," OWS ) language-tag *( OWS "," [ OWS | Content-Encoding = [ content-coding *( OWS "," OWS content-coding ) | |||
| language-tag ] ) | ] | |||
| Content-Language = [ language-tag *( OWS "," OWS language-tag ) ] | ||||
| Content-Length = 1*DIGIT | ||||
| Content-Location = absolute-URI / partial-URI | Content-Location = absolute-URI / partial-URI | |||
| Content-Range = range-unit SP ( range-resp / unsatisfied-range ) | ||||
| Content-Type = media-type | Content-Type = media-type | |||
| Date = HTTP-date | Date = HTTP-date | |||
| Expect = "100-continue" | ETag = entity-tag | |||
| Expect = [ expectation *( OWS "," OWS expectation ) ] | ||||
| From = mailbox | From = mailbox | |||
| GMT = %x47.4D.54 ; GMT | GMT = %x47.4D.54 ; GMT | |||
| HTTP-date = IMF-fixdate / obs-date | HTTP-date = IMF-fixdate / obs-date | |||
| Host = uri-host [ ":" port ] | ||||
| IMF-fixdate = day-name "," SP date1 SP time-of-day SP GMT | IMF-fixdate = day-name "," SP date1 SP time-of-day SP GMT | |||
| If-Match = "*" / [ entity-tag *( OWS "," OWS entity-tag ) ] | ||||
| If-Modified-Since = HTTP-date | ||||
| If-None-Match = "*" / [ entity-tag *( OWS "," OWS entity-tag ) ] | ||||
| If-Range = entity-tag / HTTP-date | ||||
| If-Unmodified-Since = HTTP-date | ||||
| Last-Modified = HTTP-date | ||||
| Location = URI-reference | Location = URI-reference | |||
| Max-Forwards = 1*DIGIT | Max-Forwards = 1*DIGIT | |||
| OWS = <OWS, see [RFC7230], Section 3.2.3> | OWS = *( SP / HTAB ) | |||
| RWS = <RWS, see [RFC7230], Section 3.2.3> | Proxy-Authenticate = [ challenge *( OWS "," OWS challenge ) ] | |||
| Proxy-Authentication-Info = [ auth-param *( OWS "," OWS auth-param ) | ||||
| ] | ||||
| Proxy-Authorization = credentials | ||||
| RWS = 1*( SP / HTAB ) | ||||
| Range = ranges-specifier | ||||
| Referer = absolute-URI / partial-URI | Referer = absolute-URI / partial-URI | |||
| Retry-After = HTTP-date / delay-seconds | Retry-After = HTTP-date / delay-seconds | |||
| Server = product *( RWS ( product / comment ) ) | Server = product *( RWS ( product / comment ) ) | |||
| URI-reference = <URI-reference, see [RFC7230], Section 2.7> | TE = [ t-codings *( OWS "," OWS t-codings ) ] | |||
| Trailer = [ field-name *( OWS "," OWS field-name ) ] | ||||
| URI-reference = <URI-reference, see [URI], Section 4.1> | ||||
| Upgrade = [ protocol *( OWS "," OWS protocol ) ] | ||||
| User-Agent = product *( RWS ( product / comment ) ) | User-Agent = product *( RWS ( product / comment ) ) | |||
| Vary = "*" / ( *( "," OWS ) field-name *( OWS "," [ OWS field-name ] | Vary = [ ( "*" / field-name ) *( OWS "," OWS ( "*" / field-name ) ) | |||
| ) ) | ] | |||
| Via = [ ( received-protocol RWS received-by [ RWS comment ] ) *( OWS | ||||
| "," OWS ( received-protocol RWS received-by [ RWS comment ] ) ) ] | ||||
| absolute-URI = <absolute-URI, see [RFC7230], Section 2.7> | WWW-Authenticate = [ challenge *( OWS "," OWS challenge ) ] | |||
| accept-ext = OWS ";" OWS token [ "=" ( token / quoted-string ) ] | ||||
| accept-params = weight *accept-ext | absolute-URI = <absolute-URI, see [URI], Section 4.3> | |||
| absolute-path = 1*( "/" segment ) | ||||
| acceptable-ranges = range-unit *( OWS "," OWS range-unit ) | ||||
| asctime-date = day-name SP date3 SP time-of-day SP year | asctime-date = day-name SP date3 SP time-of-day SP year | |||
| auth-param = token BWS "=" BWS ( token / quoted-string ) | ||||
| auth-scheme = token | ||||
| authority = <authority, see [URI], Section 3.2> | ||||
| charset = token | challenge = auth-scheme [ 1*SP ( token68 / [ auth-param *( OWS "," | |||
| OWS auth-param ) ] ) ] | ||||
| codings = content-coding / "identity" / "*" | codings = content-coding / "identity" / "*" | |||
| comment = <comment, see [RFC7230], Section 3.2.6> | comment = "(" *( ctext / quoted-pair / comment ) ")" | |||
| complete-length = 1*DIGIT | ||||
| connection-option = token | ||||
| content-coding = token | content-coding = token | |||
| credentials = auth-scheme [ 1*SP ( token68 / [ auth-param *( OWS "," | ||||
| OWS auth-param ) ] ) ] | ||||
| ctext = HTAB / SP / %x21-27 ; '!'-''' | ||||
| / %x2A-5B ; '*'-'[' | ||||
| / %x5D-7E ; ']'-'~' | ||||
| / obs-text | ||||
| date1 = day SP month SP year | date1 = day SP month SP year | |||
| date2 = day "-" month "-" 2DIGIT | date2 = day "-" month "-" 2DIGIT | |||
| date3 = month SP ( 2DIGIT / ( SP DIGIT ) ) | date3 = month SP ( 2DIGIT / ( SP DIGIT ) ) | |||
| day = 2DIGIT | day = 2DIGIT | |||
| day-name = %x4D.6F.6E ; Mon | day-name = %x4D.6F.6E ; Mon | |||
| / %x54.75.65 ; Tue | / %x54.75.65 ; Tue | |||
| / %x57.65.64 ; Wed | / %x57.65.64 ; Wed | |||
| / %x54.68.75 ; Thu | / %x54.68.75 ; Thu | |||
| / %x46.72.69 ; Fri | / %x46.72.69 ; Fri | |||
| skipping to change at line 8391 ¶ | skipping to change at page 213, line 31 ¶ | |||
| / %x53.75.6E ; Sun | / %x53.75.6E ; Sun | |||
| day-name-l = %x4D.6F.6E.64.61.79 ; Monday | day-name-l = %x4D.6F.6E.64.61.79 ; Monday | |||
| / %x54.75.65.73.64.61.79 ; Tuesday | / %x54.75.65.73.64.61.79 ; Tuesday | |||
| / %x57.65.64.6E.65.73.64.61.79 ; Wednesday | / %x57.65.64.6E.65.73.64.61.79 ; Wednesday | |||
| / %x54.68.75.72.73.64.61.79 ; Thursday | / %x54.68.75.72.73.64.61.79 ; Thursday | |||
| / %x46.72.69.64.61.79 ; Friday | / %x46.72.69.64.61.79 ; Friday | |||
| / %x53.61.74.75.72.64.61.79 ; Saturday | / %x53.61.74.75.72.64.61.79 ; Saturday | |||
| / %x53.75.6E.64.61.79 ; Sunday | / %x53.75.6E.64.61.79 ; Sunday | |||
| delay-seconds = 1*DIGIT | delay-seconds = 1*DIGIT | |||
| field-name = <comment, see [RFC7230], Section 3.2> | entity-tag = [ weak ] opaque-tag | |||
| etagc = "!" / %x23-7E ; '#'-'~' | ||||
| / obs-text | ||||
| expectation = token [ "=" ( token / quoted-string ) parameters ] | ||||
| field-content = field-vchar [ 1*( SP / HTAB / field-vchar ) | ||||
| field-vchar ] | ||||
| field-name = token | ||||
| field-value = *field-content | ||||
| field-vchar = VCHAR / obs-text | ||||
| first-pos = 1*DIGIT | ||||
| hour = 2DIGIT | hour = 2DIGIT | |||
| http-URI = "http://" authority path-abempty [ "?" query ] | ||||
| https-URI = "https://" authority path-abempty [ "?" query ] | ||||
| incl-range = first-pos "-" last-pos | ||||
| int-range = first-pos "-" [ last-pos ] | ||||
| language-range = <language-range, see [RFC4647], Section 2.1> | language-range = <language-range, see [RFC4647], Section 2.1> | |||
| language-tag = <Language-Tag, see [RFC5646], Section 2.1> | language-tag = <Language-Tag, see [RFC5646], Section 2.1> | |||
| last-pos = 1*DIGIT | ||||
| mailbox = <mailbox, see [RFC5322], Section 3.4> | mailbox = <mailbox, see [RFC5322], Section 3.4> | |||
| media-range = ( "*/*" / ( type "/*" ) / ( type "/" subtype ) ) *( OWS | media-range = ( "*/*" / ( type "/*" ) / ( type "/" subtype ) ) | |||
| ";" OWS parameter ) | parameters | |||
| media-type = type "/" subtype parameters | ||||
| media-type = type "/" subtype *( OWS ";" OWS parameter ) | ||||
| method = token | method = token | |||
| minute = 2DIGIT | minute = 2DIGIT | |||
| month = %x4A.61.6E ; Jan | month = %x4A.61.6E ; Jan | |||
| / %x46.65.62 ; Feb | / %x46.65.62 ; Feb | |||
| / %x4D.61.72 ; Mar | / %x4D.61.72 ; Mar | |||
| / %x41.70.72 ; Apr | / %x41.70.72 ; Apr | |||
| / %x4D.61.79 ; May | / %x4D.61.79 ; May | |||
| / %x4A.75.6E ; Jun | / %x4A.75.6E ; Jun | |||
| / %x4A.75.6C ; Jul | / %x4A.75.6C ; Jul | |||
| / %x41.75.67 ; Aug | / %x41.75.67 ; Aug | |||
| / %x53.65.70 ; Sep | / %x53.65.70 ; Sep | |||
| / %x4F.63.74 ; Oct | / %x4F.63.74 ; Oct | |||
| / %x4E.6F.76 ; Nov | / %x4E.6F.76 ; Nov | |||
| / %x44.65.63 ; Dec | / %x44.65.63 ; Dec | |||
| obs-date = rfc850-date / asctime-date | obs-date = rfc850-date / asctime-date | |||
| obs-text = %x80-FF | ||||
| opaque-tag = DQUOTE *etagc DQUOTE | ||||
| other-range = 1*( %x21-2B ; '!'-'+' | ||||
| / %x2D-7E ; '-'-'~' | ||||
| ) | ||||
| parameter = token "=" ( token / quoted-string ) | parameter = parameter-name "=" parameter-value | |||
| partial-URI = <partial-URI, see [RFC7230], Section 2.7> | parameter-name = token | |||
| parameter-value = ( token / quoted-string ) | ||||
| parameters = *( OWS ";" OWS [ parameter ] ) | ||||
| partial-URI = relative-part [ "?" query ] | ||||
| path-abempty = <path-abempty, see [URI], Section 3.3> | ||||
| port = <port, see [URI], Section 3.2.3> | ||||
| product = token [ "/" product-version ] | product = token [ "/" product-version ] | |||
| product-version = token | product-version = token | |||
| quoted-string = <quoted-string, see [RFC7230], Section 3.2.6> | protocol = protocol-name [ "/" protocol-version ] | |||
| protocol-name = token | ||||
| protocol-version = token | ||||
| pseudonym = token | ||||
| qdtext = HTAB / SP / "!" / %x23-5B ; '#'-'[' | ||||
| / %x5D-7E ; ']'-'~' | ||||
| / obs-text | ||||
| query = <query, see [URI], Section 3.4> | ||||
| quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) | ||||
| quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE | ||||
| qvalue = ( "0" [ "." *3DIGIT ] ) / ( "1" [ "." *3"0" ] ) | qvalue = ( "0" [ "." *3DIGIT ] ) / ( "1" [ "." *3"0" ] ) | |||
| range-resp = incl-range "/" ( complete-length / "*" ) | ||||
| range-set = range-spec *( OWS "," OWS range-spec ) | ||||
| range-spec = int-range / suffix-range / other-range | ||||
| range-unit = token | ||||
| ranges-specifier = range-unit "=" range-set | ||||
| received-by = pseudonym [ ":" port ] | ||||
| received-protocol = [ protocol-name "/" ] protocol-version | ||||
| relative-part = <relative-part, see [URI], Section 4.2> | ||||
| rfc850-date = day-name-l "," SP date2 SP time-of-day SP GMT | rfc850-date = day-name-l "," SP date2 SP time-of-day SP GMT | |||
| second = 2DIGIT | second = 2DIGIT | |||
| segment = <segment, see [URI], Section 3.3> | ||||
| subtype = token | subtype = token | |||
| suffix-length = 1*DIGIT | ||||
| suffix-range = "-" suffix-length | ||||
| t-codings = "trailers" / ( transfer-coding [ weight ] ) | ||||
| tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / | ||||
| "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA | ||||
| time-of-day = hour ":" minute ":" second | time-of-day = hour ":" minute ":" second | |||
| token = <token, see [RFC7230], Section 3.2.6> | token = 1*tchar | |||
| token68 = 1*( ALPHA / DIGIT / "-" / "." / "_" / "~" / "+" / "/" ) | ||||
| *"=" | ||||
| transfer-coding = token *( OWS ";" OWS transfer-parameter ) | ||||
| transfer-parameter = token BWS "=" BWS ( token / quoted-string ) | ||||
| type = token | type = token | |||
| unsatisfied-range = "*/" complete-length | ||||
| uri-host = <host, see [URI], Section 3.2.2> | ||||
| weak = %x57.2F ; W/ | ||||
| weight = OWS ";" OWS "q=" qvalue | weight = OWS ";" OWS "q=" qvalue | |||
| year = 4DIGIT | year = 4DIGIT | |||
| Appendix B. Changes from RFC 2616 | Appendix B. Changes from previous RFCs | |||
| [elided] | ||||
| B.1. Changes from RFC 2818 | B.1. Changes from RFC 2818 | |||
| None. | ||||
| B.2. Changes from RFC 7230 | B.2. Changes from RFC 7230 | |||
| The sections introducing HTTP's design goals, history, architecture, | ||||
| conformance criteria, protocol versioning, URIs, message routing, and | ||||
| header fields have been moved here. | ||||
| The requirement on semantic conformance has been replaced with | ||||
| permission to ignore/workaround implementation-specific failures. | ||||
| (Section 2.2) | ||||
| The description of an origin and authoritative access to origin | ||||
| servers has been extended for both "http" and "https" URIs to account | ||||
| for alternative services and secured connections that are not | ||||
| necessarily based on TCP. (Section 4.2.1, Section 4.2.2, | ||||
| Section 4.3.1, Section 7.3.3) | ||||
| Explicit requirements have been added to check the target URI | ||||
| scheme's semantics and reject requests that don't meet any associated | ||||
| requirements. (Section 7.4) | ||||
| Parameters in media type, media range, and expectation can be empty | ||||
| via one or more trailing semicolons. (Section 5.6.6) | ||||
| "Field value" now refers to the value after multiple field lines are | ||||
| combined with commas - by far the most common use. To refer to a | ||||
| single header line's value, use "field line value". (Section 6.3) | ||||
| Trailer field semantics now transcend the specifics of chunked | ||||
| encoding. Use of trailer fields has been further limited to only | ||||
| allow generation as a trailer field when the sender knows the field | ||||
| defines that usage and to only allow merging into the header section | ||||
| if the recipient knows the corresponding field definition permits and | ||||
| defines how to merge. In all other cases, implementations are | ||||
| encouraged to either store the trailer fields separately or discard | ||||
| them instead of merging. (Section 6.5.1) | ||||
| Made the priority of the absolute form of the request URI over the | ||||
| Host header by origin servers explicit, to align with proxy handling. | ||||
| (Section 7.2) | ||||
| The grammar definition for the Via field's "received-by" was expanded | ||||
| in 7230 due to changes in the URI grammar for host [URI] that are not | ||||
| desirable for Via. For simplicity, we have removed uri-host from the | ||||
| received-by production because it can be encompassed by the existing | ||||
| grammar for pseudonym. In particular, this change removed comma from | ||||
| the allowed set of charaters for a host name in received-by. | ||||
| (Section 7.6.3) | ||||
| B.3. Changes from RFC 7231 | B.3. Changes from RFC 7231 | |||
| Minimum URI lengths to be supported by implementations are now | ||||
| recommended. (Section 3.1) | ||||
| Clarified that CR and NUL in field values are to be rejected or | ||||
| mapped to SP and that leading and trailing whitespace need to be | ||||
| stripped from field values before they are consumed. (Section 5.5) | ||||
| Parameters in media type, media range, and expectation can be empty | ||||
| via one or more trailing semicolons. (Section 5.6.6) | ||||
| An abstract data type for HTTP messages has been introduced to define | ||||
| the components of a message and their semantics as an abstraction | ||||
| across multiple HTTP versions, rather than in terms of the specific | ||||
| syntax form of HTTP/1.1 in [HTTP/1.1], and reflect the contents after | ||||
| the message is parsed. This makes it easier to distinguish between | ||||
| requirements on the content (what is conveyed) versus requirements on | ||||
| the messaging syntax (how it is conveyed) and avoids baking | ||||
| limitations of early protocol versions into the future of HTTP. | ||||
| (Section 6) | ||||
| The terms "payload" and "payload body" have been replaced with | ||||
| "content", to better align with its usage elsewhere (e.g., in field | ||||
| names) and to avoid confusion with frame payloads in HTTP/2 and | ||||
| HTTP/3. (Section 6.4) | ||||
| The term "effective request URI" has been replaced with "target URI". | ||||
| (Section 7.1) | ||||
| Restrictions on client retries have been loosened, to reflect | ||||
| implementation behavior. (Section 9.2.2) | ||||
| Clarified that request bodies on GET, HEAD, and DELETE are not | ||||
| interoperable. (Section 9.3.1, Section 9.3.2, Section 9.3.5) | ||||
| Allowed use of the Content-Range header field (Section 14.4) as a | ||||
| request modifier on PUT. (Section 9.3.4) | ||||
| Removed a superfluous requirement about setting Content-Length from | ||||
| the description of the OPTIONS method. (Section 9.3.7) | ||||
| Removed normative requirement to use the "message/http" media type in | ||||
| TRACE responses. (Section 9.3.8) | ||||
| Restore list-based grammar for Expect for compatibility with RFC | ||||
| 2616. (Section 10.1.1) | ||||
| Allow Accept and Accept-Encoding in response messages; the latter was | ||||
| introduced by [RFC7694]. (Section 12.3) | ||||
| "Accept Parameters" (accept-params and accept-ext ABNF production) | ||||
| have been removed from the definition of the Accept field. | ||||
| (Section 12.5.1) | ||||
| The "Accept-Charset" field now is deprecated. (Section 12.5.2) | ||||
| The semantics of "*" in the Vary header field when other values are | ||||
| present was clarified. (Section 12.5.5) | ||||
| Range units are compared in a case insensitive fashion. | ||||
| (Section 14.1) | ||||
| Use of "Accept-Ranges" is not restricted to origin servers. | ||||
| (Section 14.3) | ||||
| The process of creating a redirected request has been clarified. | ||||
| (Section 15.4) | ||||
| Added status code 308 (previously defined in [RFC7538]) so that it's | ||||
| defined closer to status codes 301, 302, and 307. (Section 15.4.9) | ||||
| Added status code 421 (previously defined in Section 9.1.2 of | ||||
| [HTTP/2]) because of its general applicability. 421 is no longer | ||||
| defined as heuristically cacheable, since the response is specific to | ||||
| the connection (not the target resource). (Section 15.5.20) | ||||
| Added status code 422 (previously defined in Section 11.2 of | ||||
| [WEBDAV]) because of its general applicability. (Section 15.5.21) | ||||
| B.4. Changes from RFC 7232 | B.4. Changes from RFC 7232 | |||
| Previous revisions of HTTP imposed an arbitrary 60-second limit on | ||||
| the determination of whether Last-Modified was a strong validator to | ||||
| guard 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. This specification has | ||||
| relaxed that to allow reasonable discretion. (Section 8.8.2.2) | ||||
| Removed edge case requirement on If-Match and If-Unmodified-Since | ||||
| 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 | ||||
| applied. (Section 13.1.1 and Section 13.1.4) | ||||
| Clarified that If-Unmodified-Since doesn't apply to a resource | ||||
| without a concept of modification time. (Section 13.1.4) | ||||
| Preconditions can now be evaluated before the request content is | ||||
| processed rather than waiting until the response would otherwise be | ||||
| successful. (Section 13.2) | ||||
| B.5. Changes from RFC 7233 | B.5. Changes from RFC 7233 | |||
| Refactored the range-unit and ranges-specifier grammars to simplify | ||||
| and reduce artificial distinctions between bytes and other | ||||
| (extension) range units, removing the overlapping grammar of other- | ||||
| range-unit by defining range units generically as a token and placing | ||||
| extensions within the scope of a range-spec (other-range). This | ||||
| disambiguates the role of list syntax (commas) in all range sets, | ||||
| including extension range units, for indicating a range-set of more | ||||
| than one range. Moving the extension grammar into range specifiers | ||||
| also allows protocol specific to byte ranges to be specified | ||||
| separately. | ||||
| It is now possible to define Range handling on extension methods. | ||||
| (Section 14.2) | ||||
| Described use of the Content-Range header field (Section 14.4) as a | ||||
| request modifier to perform a partial PUT. (Section 14.5) | ||||
| B.6. Changes from RFC 7235 | B.6. Changes from RFC 7235 | |||
| None. | ||||
| B.7. Changes from RFC 7538 | B.7. Changes from RFC 7538 | |||
| None. | ||||
| B.8. Changes from RFC 7615 | B.8. Changes from RFC 7615 | |||
| None. | ||||
| B.9. Changes from RFC 7694 | B.9. Changes from RFC 7694 | |||
| This specification includes the extension defined in [RFC7694], but | ||||
| leaves out examples and deployment considerations. | ||||
| Appendix C. Change Log | Appendix C. Change Log | |||
| This section is to be removed before publishing as an RFC. | ||||
| C.1. Between RFC723x and draft 00 | C.1. Between RFC723x and draft 00 | |||
| The changes were purely editorial: | ||||
| * Change boilerplate and abstract to indicate the "draft" status, | ||||
| and update references to ancestor specifications. | ||||
| * Remove version "1.1" from document title, indicating that this | ||||
| specification applies to all HTTP versions. | ||||
| * Adjust historical notes. | ||||
| * Update links to sibling specifications. | ||||
| * Replace sections listing changes from RFC 2616 by new empty | ||||
| sections referring to RFC 723x. | ||||
| * Remove acknowledgements specific to RFC 723x. | ||||
| * Move "Acknowledgements" to the very end and make them unnumbered. | ||||
| C.2. Since draft-ietf-httpbis-semantics-00 | C.2. Since draft-ietf-httpbis-semantics-00 | |||
| The changes in this draft are editorial, with respect to HTTP as a | ||||
| whole, to merge core HTTP semantics into this document: | ||||
| * Merged introduction, architecture, conformance, and ABNF | ||||
| extensions from RFC 7230 (Messaging). | ||||
| * Rearranged architecture to extract conformance, http(s) schemes, | ||||
| and protocol versioning into a separate major section. | ||||
| * Moved discussion of MIME differences to [HTTP/1.1] since that is | ||||
| primarily concerned with transforming 1.1 messages. | ||||
| * Merged entire content of RFC 7232 (Conditional Requests). | ||||
| * Merged entire content of RFC 7233 (Range Requests). | ||||
| * Merged entire content of RFC 7235 (Auth Framework). | ||||
| * Moved all extensibility tips, registration procedures, and | ||||
| registry tables from the IANA considerations to normative | ||||
| sections, reducing the IANA considerations to just instructions | ||||
| that will be removed prior to publication as an RFC. | ||||
| C.3. Since draft-ietf-httpbis-semantics-01 | C.3. Since draft-ietf-httpbis-semantics-01 | |||
| * Improve [Welch] citation (<https://github.com/httpwg/http-core/ | ||||
| issues/63>) | ||||
| * Remove HTTP/1.1-ism about Range Requests | ||||
| (<https://github.com/httpwg/http-core/issues/71>) | ||||
| * Cite RFC 8126 instead of RFC 5226 (<https://github.com/httpwg/ | ||||
| http-core/issues/75>) | ||||
| * Cite RFC 7538 instead of RFC 7238 (<https://github.com/httpwg/ | ||||
| http-core/issues/76>) | ||||
| * Cite RFC 8288 instead of RFC 5988 (<https://github.com/httpwg/ | ||||
| http-core/issues/77>) | ||||
| * Cite RFC 8187 instead of RFC 5987 (<https://github.com/httpwg/ | ||||
| http-core/issues/78>) | ||||
| * Cite RFC 7578 instead of RFC 2388 (<https://github.com/httpwg/ | ||||
| http-core/issues/79>) | ||||
| * Cite RFC 7595 instead of RFC 4395 (<https://github.com/httpwg/ | ||||
| http-core/issues/80>) | ||||
| * improve ABNF readability for qdtext (<https://github.com/httpwg/ | ||||
| http-core/issues/81>, <https://www.rfc-editor.org/errata/eid4891>) | ||||
| * Clarify "resource" vs "representation" in definition of status | ||||
| code 416 (<https://github.com/httpwg/http-core/issues/83>, | ||||
| <https://www.rfc-editor.org/errata/eid4664>) | ||||
| * Resolved erratum 4072, no change needed here | ||||
| (<https://github.com/httpwg/http-core/issues/84>, | ||||
| <https://www.rfc-editor.org/errata/eid4072>) | ||||
| * Clarify DELETE status code suggestions | ||||
| (<https://github.com/httpwg/http-core/issues/85>, | ||||
| <https://www.rfc-editor.org/errata/eid4436>) | ||||
| * In Section 14.4, fix ABNF for "other-range-resp" to use VCHAR | ||||
| instead of CHAR (<https://github.com/httpwg/http-core/issues/86>, | ||||
| <https://www.rfc-editor.org/errata/eid4707>) | ||||
| * Resolved erratum 5162, no change needed here | ||||
| (<https://github.com/httpwg/http-core/issues/89>, | ||||
| <https://www.rfc-editor.org/errata/eid5162>) | ||||
| * Replace "response code" with "response status code" and "status- | ||||
| code" (the ABNF production name from the HTTP/1.1 message format) | ||||
| by "status code" (<https://github.com/httpwg/http-core/issues/94>, | ||||
| <https://www.rfc-editor.org/errata/eid4050>) | ||||
| * Added a missing word in Section 15.4 (<https://github.com/httpwg/ | ||||
| http-core/issues/98>, <https://www.rfc-editor.org/errata/eid4452>) | ||||
| * In Section 5.6.1, fixed an example that had trailing whitespace | ||||
| where it shouldn't (<https://github.com/httpwg/http-core/ | ||||
| issues/104>, <https://www.rfc-editor.org/errata/eid4169>) | ||||
| * In Section 15.3.7, remove words that were potentially misleading | ||||
| with respect to the relation to the requested ranges | ||||
| (<https://github.com/httpwg/http-core/issues/102>, | ||||
| <https://www.rfc-editor.org/errata/eid4358>) | ||||
| C.4. Since draft-ietf-httpbis-semantics-02 | C.4. Since draft-ietf-httpbis-semantics-02 | |||
| * Included (Proxy-)Auth-Info header field definition from RFC 7615 | ||||
| (<https://github.com/httpwg/http-core/issues/9>) | ||||
| * In Section 9.3.3, clarify POST caching | ||||
| (<https://github.com/httpwg/http-core/issues/17>) | ||||
| * Add Section 15.5.19 to reserve the 418 status code | ||||
| (<https://github.com/httpwg/http-core/issues/43>) | ||||
| * In Section 3.4 and Section 10.1.1, clarified when a response can | ||||
| be sent (<https://github.com/httpwg/http-core/issues/82>) | ||||
| * In Section 8.3.2, explain the difference between the "token" | ||||
| production, the RFC 2978 ABNF for charset names, and the actual | ||||
| registration practice (<https://github.com/httpwg/http-core/ | ||||
| issues/100>, <https://www.rfc-editor.org/errata/eid4689>) | ||||
| * In Section 3.1, removed the fragment component in the URI scheme | ||||
| definitions as per Section 4.3 of [URI], furthermore moved | ||||
| fragment discussion into a separate section | ||||
| (<https://github.com/httpwg/http-core/issues/103>, | ||||
| <https://www.rfc-editor.org/errata/eid4251>, <https://www.rfc- | ||||
| editor.org/errata/eid4252>) | ||||
| * In Section 2.5, add language about minor HTTP version number | ||||
| defaulting (<https://github.com/httpwg/http-core/issues/115>) | ||||
| * Added Section 15.5.21 for status code 422, previously defined in | ||||
| Section 11.2 of [WEBDAV] (<https://github.com/httpwg/http-core/ | ||||
| issues/123>) | ||||
| * In Section 15.5.17, fixed prose about byte range comparison | ||||
| (<https://github.com/httpwg/http-core/issues/135>, | ||||
| <https://www.rfc-editor.org/errata/eid5474>) | ||||
| * In Section 3.4, explain that request/response correlation is | ||||
| version specific (<https://github.com/httpwg/http-core/ | ||||
| issues/145>) | ||||
| C.5. Since draft-ietf-httpbis-semantics-03 | C.5. Since draft-ietf-httpbis-semantics-03 | |||
| * In Section 15.4.9, include status code 308 from RFC 7538 | ||||
| (<https://github.com/httpwg/http-core/issues/3>) | ||||
| * In Section 8.3.1, clarify that the charset parameter value is | ||||
| case-insensitive due to the definition in RFC 2046 | ||||
| (<https://github.com/httpwg/http-core/issues/13>) | ||||
| * Define a separate registry for HTTP header field names | ||||
| (<https://github.com/httpwg/http-core/issues/42>) | ||||
| * In Section 12.1, refactor and clarify description of wildcard | ||||
| ("*") handling (<https://github.com/httpwg/http-core/issues/46>) | ||||
| * Deprecate Accept-Charset (<https://github.com/httpwg/http-core/ | ||||
| issues/61>) | ||||
| * In Section 13.2, mention Cache-Control: immutable | ||||
| (<https://github.com/httpwg/http-core/issues/69>) | ||||
| * In Section 5.3, clarify when header field combination is allowed | ||||
| (<https://github.com/httpwg/http-core/issues/74>) | ||||
| * In Section 18.4, instruct IANA to mark Content-MD5 as obsolete | ||||
| (<https://github.com/httpwg/http-core/issues/93>) | ||||
| * Use RFC 7405 ABNF notation for case-sensitive string constants | ||||
| (<https://github.com/httpwg/http-core/issues/133>) | ||||
| * Rework Section 3.4 to be more version-independent | ||||
| (<https://github.com/httpwg/http-core/issues/142>) | ||||
| * In Section 9.3.5, clarify that DELETE needs to be successful to | ||||
| invalidate cache (<https://github.com/httpwg/http-core/ | ||||
| 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 | |||
| * In Section 5.5, fix field-content ABNF | ||||
| (<https://github.com/httpwg/http-core/issues/19>, | ||||
| <https://www.rfc-editor.org/errata/eid4189>) | ||||
| * Move Section 5.6.6 into its own section | ||||
| (<https://github.com/httpwg/http-core/issues/45>) | ||||
| * In Section 8.3, reference MIME Sniffing | ||||
| (<https://github.com/httpwg/http-core/issues/51>) | ||||
| * In Section 5.6.1, simplify the #rule mapping for recipients | ||||
| (<https://github.com/httpwg/http-core/issues/164>, | ||||
| <https://www.rfc-editor.org/errata/eid5257>) | ||||
| * In Section 9.3.7, remove misleading text about "extension" of HTTP | ||||
| is needed to define method content (<https://github.com/httpwg/ | ||||
| http-core/issues/204>) | ||||
| * Fix editorial issue in Section 3.2 (<https://github.com/httpwg/ | ||||
| http-core/issues/223>) | ||||
| * In Section 15.5.21, rephrase language not to use "entity" anymore, | ||||
| and also avoid lowercase "may" (<https://github.com/httpwg/http- | ||||
| core/issues/224>) | ||||
| * Move discussion of retries from [HTTP/1.1] into Section 9.2.2 | ||||
| (<https://github.com/httpwg/http-core/issues/230>) | ||||
| C.7. Since draft-ietf-httpbis-semantics-05 | C.7. Since draft-ietf-httpbis-semantics-05 | |||
| * Moved transport-independent part of the description of trailers | ||||
| into Section 6.5 (<https://github.com/httpwg/http-core/issues/16>) | ||||
| * Loosen requirements on retries based upon implementation behavior | ||||
| (<https://github.com/httpwg/http-core/issues/27>) | ||||
| * In Section 18.9, update IANA port registry for TCP/UDP on ports 80 | ||||
| and 443 (<https://github.com/httpwg/http-core/issues/36>) | ||||
| * In Section 16.3.2.2, revise guidelines for new header field names | ||||
| (<https://github.com/httpwg/http-core/issues/47>) | ||||
| * In Section 9.2.3, remove concept of "cacheable methods" in favor | ||||
| of prose (<https://github.com/httpwg/http-core/issues/54>, | ||||
| <https://www.rfc-editor.org/errata/eid5300>) | ||||
| * In Section 17.1, mention that the concept of authority can be | ||||
| modified by protocol extensions (<https://github.com/httpwg/http- | ||||
| core/issues/143>) | ||||
| * Create new subsection on content in Section 6.4, taken from | ||||
| portions of message body (<https://github.com/httpwg/http-core/ | ||||
| issues/159>) | ||||
| * Moved definition of "Whitespace" into new container "Generic | ||||
| Syntax" (<https://github.com/httpwg/http-core/issues/162>) | ||||
| * In Section 3.1, recommend minimum URI size support for | ||||
| implementations (<https://github.com/httpwg/http-core/issues/169>) | ||||
| * In Section 14.1, refactored the range-unit and ranges-specifier | ||||
| grammars (<https://github.com/httpwg/http-core/issues/196>, | ||||
| <https://www.rfc-editor.org/errata/eid5620>) | ||||
| * In Section 9.3.1, caution against a request content more strongly | ||||
| (<https://github.com/httpwg/http-core/issues/202>) | ||||
| * Reorganized text in Section 16.3.2.2 (<https://github.com/httpwg/ | ||||
| http-core/issues/214>) | ||||
| * In Section 15.5.4, replace "authorize" with "fulfill" | ||||
| (<https://github.com/httpwg/http-core/issues/218>) | ||||
| * In Section 9.3.7, removed a misleading statement about Content- | ||||
| Length (<https://github.com/httpwg/http-core/issues/235>, | ||||
| <https://www.rfc-editor.org/errata/eid5806>) | ||||
| * In Section 17.1, add text from RFC 2818 | ||||
| (<https://github.com/httpwg/http-core/issues/236>) | ||||
| * Changed "cacheable by default" to "heuristically cacheable" | ||||
| 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 | |||
| * In Section 7.6.3, simplify received-by grammar (and disallow comma | ||||
| character) (<https://github.com/httpwg/http-core/issues/24>) | ||||
| * In Section 5.1, give guidance on interoperable field names | ||||
| (<https://github.com/httpwg/http-core/issues/30>) | ||||
| * In Section 5.6.3, define the semantics and possible replacement of | ||||
| whitespace when it is known to occur (<https://github.com/httpwg/ | ||||
| http-core/issues/53>, <https://www.rfc-editor.org/errata/eid5163>) | ||||
| * In Section 6.3, introduce field terminology and distinguish | ||||
| between field line values and field values; use terminology | ||||
| consistently throughout (<https://github.com/httpwg/http-core/ | ||||
| issues/111>) | ||||
| * Moved #rule definition into Section 5.5 and whitespace into | ||||
| Section 2.1 (<https://github.com/httpwg/http-core/issues/162>) | ||||
| * In Section 14.1, explicitly call out range unit names as case- | ||||
| insensitive, and encourage registration | ||||
| (<https://github.com/httpwg/http-core/issues/179>) | ||||
| * In Section 8.4.1, explicitly call out content codings as case- | ||||
| insensitive, and encourage registration | ||||
| (<https://github.com/httpwg/http-core/issues/179>) | ||||
| * In Section 5.1, explicitly call out field names as case- | ||||
| insensitive (<https://github.com/httpwg/http-core/issues/179>) | ||||
| * In Section 17.13, cite [Bujlow] (<https://github.com/httpwg/http- | ||||
| core/issues/185>) | ||||
| * In Section 15, formally define "final" and "interim" status codes | ||||
| (<https://github.com/httpwg/http-core/issues/245>) | ||||
| * In Section 9.3.5, caution against a request content more strongly | ||||
| (<https://github.com/httpwg/http-core/issues/258>) | ||||
| * In Section 8.8.3, note that Etag can be used in trailers | ||||
| (<https://github.com/httpwg/http-core/issues/262>) | ||||
| * In Section 18.4, consider reserved fields as well | ||||
| (<https://github.com/httpwg/http-core/issues/273>) | ||||
| * In Section 4.2.4, be more correct about what was deprecated by RFC | ||||
| 3986 (<https://github.com/httpwg/http-core/issues/278>, | ||||
| <https://www.rfc-editor.org/errata/eid5964>) | ||||
| * In Section 5.3, recommend comma SP when combining field lines | ||||
| (<https://github.com/httpwg/http-core/issues/148>) | ||||
| * In Section 7.2, make explicit requirements on origin server to use | ||||
| authority from absolute-form when available | ||||
| (<https://github.com/httpwg/http-core/issues/191>) | ||||
| * In Section 4.2.1, Section 4.2.2, Section 4.3.1, and Section 7.3.3, | ||||
| refactored schemes to define origin and authoritative access to an | ||||
| origin server for both "http" and "https" URIs to account for | ||||
| alternative services and secured connections that are not | ||||
| necessarily based on TCP (<https://github.com/httpwg/http-core/ | ||||
| issues/237>) | ||||
| * In Section 2.2, reference RFC 8174 as well | ||||
| (<https://github.com/httpwg/http-core/issues/303>) | ||||
| C.9. Since draft-ietf-httpbis-semantics-07 | C.9. Since draft-ietf-httpbis-semantics-07 | |||
| * In Section 14.2, explicitly reference the definition of | ||||
| representation data as including any content codings | ||||
| (<https://github.com/httpwg/http-core/issues/11>) | ||||
| * Move TE: trailers from [HTTP/1.1] into Section 6.5.1 | ||||
| (<https://github.com/httpwg/http-core/issues/18>) | ||||
| * In Section 8.6, adjust requirements for handling multiple content- | ||||
| length values (<https://github.com/httpwg/http-core/issues/59>) | ||||
| * In Section 13.1.1 and Section 13.1.2, clarified condition | ||||
| evaluation (<https://github.com/httpwg/http-core/issues/72>) | ||||
| * In Section 5.5, remove concept of obs-fold, as that is | ||||
| HTTP/1-specific (<https://github.com/httpwg/http-core/issues/116>) | ||||
| * In Section 12, introduce the concept of request content | ||||
| negotiation (Section 12.3) and define for Accept-Encoding | ||||
| (<https://github.com/httpwg/http-core/issues/119>) | ||||
| * In Section 15.3.6, Section 15.5.9, and Section 15.5.14, remove | ||||
| HTTP/1-specific, connection-related requirements | ||||
| (<https://github.com/httpwg/http-core/issues/144>) | ||||
| * In Section 9.3.6, correct language about what is forwarded | ||||
| (<https://github.com/httpwg/http-core/issues/170>) | ||||
| * Throughout, replace "effective request URI", "request-target" and | ||||
| similar with "target URI" (<https://github.com/httpwg/http-core/ | ||||
| issues/259>) | ||||
| * In Section 16.3.2.2 and Section 16.2.2, describe how extensions | ||||
| should consider scope of applicability | ||||
| (<https://github.com/httpwg/http-core/issues/265>) | ||||
| * In Section 3.4, don't rely on the HTTP/1.1 Messaging specification | ||||
| to define "message" (<https://github.com/httpwg/http-core/ | ||||
| issues/311>) | ||||
| * In Section 8.7 and Section 10.1.3, note that URL resolution is | ||||
| necessary (<https://github.com/httpwg/http-core/issues/321>) | ||||
| * In Section 3.2, explicitly reference 206 as one of the status | ||||
| codes that provide representation data | ||||
| (<https://github.com/httpwg/http-core/issues/325>) | ||||
| * In Section 13.1.4, refine requirements so that they don't apply to | ||||
| resources without a concept of modification time | ||||
| (<https://github.com/httpwg/http-core/issues/326>) | ||||
| * In Section 11.7.1, specify the scope as a request, not a target | ||||
| resource (<https://github.com/httpwg/http-core/issues/331>) | ||||
| * In Section 3.4, introduce concept of "complete" messages | ||||
| (<https://github.com/httpwg/http-core/issues/334>) | ||||
| * In Section 7.1, Section 9.3.6, and Section 9.3.7, refine use of | ||||
| "request target" (<https://github.com/httpwg/http-core/ | ||||
| issues/340>) | ||||
| * Throughout, remove "status-line" and "request-line", as these are | ||||
| HTTP/1.1-specific (<https://github.com/httpwg/http-core/ | ||||
| issues/361>) | ||||
| C.10. Since draft-ietf-httpbis-semantics-08 | C.10. Since draft-ietf-httpbis-semantics-08 | |||
| * In Section 15.5.17, remove duplicate definition of what makes a | ||||
| range satisfiable and refer instead to each range unit's | ||||
| definition (<https://github.com/httpwg/http-core/issues/12>) | ||||
| * In Section 14.1.2 and Section 14.2, clarify that a selected | ||||
| representation of zero length can only be satisfiable as a suffix | ||||
| range and that a server can still ignore Range for that case | ||||
| (<https://github.com/httpwg/http-core/issues/12>) | ||||
| * In Section 12.5.1 and Section 15.5.16, allow "Accept" as response | ||||
| field (<https://github.com/httpwg/http-core/issues/48>) | ||||
| * Appendix A now uses the sender variant of the "#" list expansion | ||||
| (<https://github.com/httpwg/http-core/issues/192>) | ||||
| * In Section 12.5.5, make the field list-based even when "*" is | ||||
| present (<https://github.com/httpwg/http-core/issues/272>) | ||||
| * In Section 16.3.1, add optional "Comments" entry | ||||
| (<https://github.com/httpwg/http-core/issues/273>) | ||||
| * In Section 18.4, reserve "*" as field name | ||||
| (<https://github.com/httpwg/http-core/issues/274>) | ||||
| * In Section 18.2, reserve "*" as method name | ||||
| (<https://github.com/httpwg/http-core/issues/274>) | ||||
| * In Section 13.1.1 and Section 13.1.2, state that multiple "*" is | ||||
| unlikely to be interoperable (<https://github.com/httpwg/http- | ||||
| core/issues/305>) | ||||
| * In Section 12.5.1, avoid use of obsolete media type parameter on | ||||
| text/html (<https://github.com/httpwg/http-core/issues/375>, | ||||
| <https://www.rfc-editor.org/errata/eid6149>) | ||||
| * Rephrase prose in Section 3.4 to become version-agnostic | ||||
| (<https://github.com/httpwg/http-core/issues/372>) | ||||
| * In Section 5.5, instruct recipients how to deal with control | ||||
| characters in field values (<https://github.com/httpwg/http-core/ | ||||
| issues/377>) | ||||
| * In Section 5.5, update note about field ABNF | ||||
| (<https://github.com/httpwg/http-core/issues/380>) | ||||
| * Add Section 16 about Extending and Versioning HTTP | ||||
| (<https://github.com/httpwg/http-core/issues/384>) | ||||
| * In Section 15.1, include status 308 in list of heuristically | ||||
| cacheable status codes (<https://github.com/httpwg/http-core/ | ||||
| issues/385>) | ||||
| * In Section 8.4, make it clearer that "identity" is not to be | ||||
| 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 | |||
| * Switch to xml2rfc v3 mode for draft generation | ||||
| (<https://github.com/httpwg/http-core/issues/394>) | ||||
| C.12. Since draft-ietf-httpbis-semantics-10 | C.12. Since draft-ietf-httpbis-semantics-10 | |||
| * In Section 17.6, mention compression attacks | ||||
| (<https://github.com/httpwg/http-core/issues/6>) | ||||
| * In Section 16.6.1, advise to make new content codings self- | ||||
| descriptive (<https://github.com/httpwg/http-core/issues/21>) | ||||
| * In Section 5.6.6, introduced the "parameters" ABNF rule, allowing | ||||
| empty parameters and trailing semicolons within media type, media | ||||
| range, and expectation (<https://github.com/httpwg/http-core/ | ||||
| issues/33>) | ||||
| * In Section 15.4, explain how to create a redirected request | ||||
| (<https://github.com/httpwg/http-core/issues/38>) | ||||
| * In Section 8.3, defined error handling for multiple members | ||||
| (<https://github.com/httpwg/http-core/issues/39>) | ||||
| * In Section 1, revise the introduction and introduce HTTP/2 and | ||||
| HTTP/3 (<https://github.com/httpwg/http-core/issues/64>) | ||||
| * In Section 8.6, added a definition for Content-Length that | ||||
| encompasses its various roles in describing message content or | ||||
| selected representation length; in Section 15.3.7, noted that | ||||
| Content-Length counts only the message content (not the selected | ||||
| representation) and that the representation length is in each | ||||
| Content-Range (<https://github.com/httpwg/http-core/issues/118>) | ||||
| * Noted that "WWW-Authenticate" with more than one value on a line | ||||
| is sometimes not interoperable [HTTP/1.1] | ||||
| (<https://github.com/httpwg/http-core/issues/136>) | ||||
| * In Section 13.1.1 and Section 13.1.4, removed requirement 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 | ||||
| applied (<https://github.com/httpwg/http-core/issues/166>) | ||||
| * Moved requirements specific to HTTP/1.1 from Section 7.2 to | ||||
| [HTTP/1.1] (<https://github.com/httpwg/http-core/issues/182>) | ||||
| * In Section 5.5, introduce the terms "singleton field" and "list- | ||||
| based field" (also - in various places - discuss what to do when a | ||||
| singleton field is received as a list) | ||||
| (<https://github.com/httpwg/http-core/issues/193>) | ||||
| * In Section 10.1.1, change the ABNF back to be a list of | ||||
| expectations, as defined in RFC 2616 (<https://github.com/httpwg/ | ||||
| http-core/issues/203>) | ||||
| * In Section 6.6.2 (Trailer), Section 7.6.3 (Via), Section 7.8 | ||||
| (Upgrade), Section 7.6.1 (Connection), Section 8.4 | ||||
| (Content-Encoding), Section 8.5 (Content-Language), Section 10.1.1 | ||||
| (Expect), Section 13.1.1 (If-Match), Section 13.1.2 | ||||
| (If-None-Match), Section 12.5.2 (Accept-Charset), Section 12.5.4 | ||||
| (Accept-Language), Section 12.5.5 (Vary), Section 11.6.1 | ||||
| (WWW-Authenticate), and Section 11.7.1 (Proxy-Authenticate), | ||||
| adjust ABNF to allow empty lists (<https://github.com/httpwg/http- | ||||
| core/issues/210>) | ||||
| * In Section 9.3.1 and Section 17.9, provide a more nuanced | ||||
| explanation of sensitive data in GET-based forms and describe | ||||
| workarounds (<https://github.com/httpwg/http-core/issues/277>) | ||||
| * In Section 13.2, allow preconditions to be evaluated before the | ||||
| request content (if any) is processed (<https://github.com/httpwg/ | ||||
| http-core/issues/261>) | ||||
| * In Section 6.3 and Section 6.5.2, allow for trailer fields in | ||||
| multiple trailer sections, depending on the HTTP version and | ||||
| framing in use, with processing being iterative as each section is | ||||
| received (<https://github.com/httpwg/http-core/issues/313>) | ||||
| * Moved definitions of "TE" and "Upgrade" from [HTTP/1.1] | ||||
| (<https://github.com/httpwg/http-core/issues/392>) | ||||
| * Moved 1.1-specific discussion of TLS to Messaging and rewrote | ||||
| Section 4.3.4 to refer to RFC6125 (<https://github.com/httpwg/ | ||||
| http-core/issues/404>) | ||||
| * Moved definition of "Connection" from [HTTP/1.1] | ||||
| (<https://github.com/httpwg/http-core/issues/407>) | ||||
| C.13. Since draft-ietf-httpbis-semantics-11 | C.13. Since draft-ietf-httpbis-semantics-11 | |||
| * The entire document has been reorganized, with no changes to | ||||
| content except editorial for the reorganization | ||||
| (<https://github.com/httpwg/http-core/issues/368>) | ||||
| * Move IANA Upgrade Token Registry instructions from [HTTP/1.1] | ||||
| (<https://github.com/httpwg/http-core/issues/450>) | ||||
| C.14. Since draft-ietf-httpbis-semantics-12 | C.14. Since draft-ietf-httpbis-semantics-12 | |||
| * In Appendix "Acknowledgements" (Appendix "Acknowledgements"), | ||||
| added acks for the work since 2014 (<https://github.com/httpwg/ | ||||
| http-core/issues/442>) | ||||
| * In Section 15.3.7, specifically require that a client check the | ||||
| 206 response header fields to determine what ranges are enclosed, | ||||
| since it cannot assume they exactly match those requested | ||||
| (<https://github.com/httpwg/http-core/issues/445>) | ||||
| * In Section 16.3, explain why new fields need to be backwards- | ||||
| compatible (<https://github.com/httpwg/http-core/issues/448>) | ||||
| * In Section 5.3, constrain field combination to be within a section | ||||
| (<https://github.com/httpwg/http-core/issues/454>) | ||||
| * In Section 5.6.7, mention that caching relaxes date sensitivity | ||||
| (<https://github.com/httpwg/http-core/issues/473>) | ||||
| * In Section 18.4, moved "*" field registration into main table | ||||
| (<https://github.com/httpwg/http-core/issues/476>) | ||||
| * In Section 1.2, reference HTTP/0.9 (<https://github.com/httpwg/ | ||||
| http-core/issues/497>) | ||||
| * In Section 9.3.4, clarify handling of unrecognized fields | ||||
| (<https://github.com/httpwg/http-core/issues/502>) | ||||
| * In Section 15.2, align language about bodies and trailers with 204 | ||||
| and 304 (<https://github.com/httpwg/http-core/issues/503>) | ||||
| * Moved table of content codings into Section 18.6, moved table of | ||||
| range units into Section 18.7 (<https://github.com/httpwg/http- | ||||
| core/issues/506>) | ||||
| * In Section 6, add an abstract data type for message to help define | ||||
| semantics without being dependent on the specific structure of | ||||
| HTTP/1.1 (<https://github.com/httpwg/http-core/issues/557>) | ||||
| * In Section 8.8.2.2, relax arbitrary 60-second comparison limit | ||||
| (<https://github.com/httpwg/http-core/issues/510>) | ||||
| * In Section 7.2, add ":authority" pseudo-header to Host discussion | ||||
| and make section applicable to both (<https://github.com/httpwg/ | ||||
| http-core/issues/511>) | ||||
| * In Section 18.4, note that this document updates [RFC3864] | ||||
| (<https://github.com/httpwg/http-core/issues/515>) | ||||
| * Moved transfer-coding ABNF from [HTTP/1.1] to Section 10.1.4 and | ||||
| replaced "t-ranking" ABNF by equivalent "weight" | ||||
| (<https://github.com/httpwg/http-core/issues/531>) | ||||
| * In Section 11.5, replace "canonical root URI" by "origin" | ||||
| (<https://github.com/httpwg/http-core/issues/542>) | ||||
| * In Section 10.1.1, remove obsolete note about a change in RFC 723x | ||||
| (<https://github.com/httpwg/http-core/issues/547>) | ||||
| * Changed to using "payload" when defining requirements about the | ||||
| data being conveyed within a message, instead of the terms | ||||
| "payload body" or "response body" or "representation body", since | ||||
| they often get confused with the HTTP/1.1 message body (which | ||||
| includes transfer coding) (<https://github.com/httpwg/http-core/ | ||||
| issues/553>) | ||||
| * Rewrite definition of HEAD method (<https://github.com/httpwg/ | ||||
| http-core/issues/559>) | ||||
| * In Section 13.1.5, fix an off-by-one bug about how many chars to | ||||
| consider when checking for etags (<https://github.com/httpwg/http- | ||||
| core/issues/570>) | ||||
| * In Section 15.1, clarify that "no reason phrase" is fine as well | ||||
| (<https://github.com/httpwg/http-core/issues/571>) | ||||
| * In Section 15.3.4, remove an obsolete reference to the Warning | ||||
| response header field (<https://github.com/httpwg/http-core/ | ||||
| issues/573>) | ||||
| * In Section 15.5.9, rephrase prose about connection re-use | ||||
| (<https://github.com/httpwg/http-core/issues/579>) | ||||
| * In Section 14.2, potentially allow Range handling on methods other | ||||
| than GET (<https://github.com/httpwg/http-core/issues/581>) | ||||
| * In Section 18.3, remove redundant text about status code 418 | ||||
| (<https://github.com/httpwg/http-core/issues/583>) | ||||
| * In Section 17.16.1, rewrite requirement to refer to "secured | ||||
| connection" (<https://github.com/httpwg/http-core/issues/587>) | ||||
| * Make reference to [TLS13] normative (<https://github.com/httpwg/ | ||||
| http-core/issues/589>) | ||||
| C.15. Since draft-ietf-httpbis-semantics-13 | C.15. Since draft-ietf-httpbis-semantics-13 | |||
| * In Section 12.5.1, remove the unused "accept parameters" | ||||
| (<https://github.com/httpwg/http-core/issues/568>) | ||||
| * In Section 1.2, mention that RFC 1945 describes HTTP/0.9 as well | ||||
| (<https://github.com/httpwg/http-core/issues/614>) | ||||
| * In Section 14.5, describe non-standard use of the Content-Range | ||||
| header field (Section 14.4) as a request modifier to perform a | ||||
| partial PUT (<https://github.com/httpwg/http-core/issues/618>) | ||||
| * In Section 15.5.20, import the 421 (Misdirected Request) status | ||||
| code from [HTTP/2] (<https://github.com/httpwg/http-core/ | ||||
| issues/622>) | ||||
| * In Section 2.3, rephrase the actual recipient parsing requirements | ||||
| (<https://github.com/httpwg/http-core/issues/634>) | ||||
| * In Section 16.1.2, mention request target forms in considerations | ||||
| for new methods (<https://github.com/httpwg/http-core/issues/636>) | ||||
| * Changed to using "content" instead of "payload" or "payload data" | ||||
| to avoid confusion with the payload of version-specific messaging | ||||
| frames (<https://github.com/httpwg/http-core/issues/654>) | ||||
| * In Section 13.1.3, Section 13.1.4, and Section 13.1.5, specify | ||||
| evaluation in a way similar to other conditional header fields | ||||
| (<https://github.com/httpwg/http-core/issues/665>) | ||||
| * In Section 6.6.1, specify that recipients can replace an invalid | ||||
| Date header field value with the time received | ||||
| (<https://github.com/httpwg/http-core/issues/669>) | ||||
| C.16. Since draft-ietf-httpbis-semantics-14 | C.16. Since draft-ietf-httpbis-semantics-14 | |||
| * In Section 5.5, relax prohibition of characters in field values to | ||||
| CR and NUL (<https://github.com/httpwg/http-core/issues/683>) | ||||
| * In Section 15, clarify that status code values outside the range | ||||
| 100..599 are invalid, and recommend error handling | ||||
| (<https://github.com/httpwg/http-core/issues/684>) | ||||
| * In Section 2.2, replaced requirement on semantic conformance with | ||||
| permission to ignore/workaround implementation-specific failures | ||||
| (<https://github.com/httpwg/http-core/issues/687>) | ||||
| * Avoid the term "whitelist" (<https://github.com/httpwg/http-core/ | ||||
| issues/688>) | ||||
| * In Section 9.3.8, remove the normative requirement to use the | ||||
| message/http media type (<https://github.com/httpwg/http-core/ | ||||
| issues/690>) | ||||
| * In Section 7.6, discuss extensibility (<https://github.com/httpwg/ | ||||
| http-core/issues/692>) | ||||
| * In Section 5.5, tighten the recommendation for characters in newly | ||||
| defined fields, making it consistent with obs-text | ||||
| (<https://github.com/httpwg/http-core/issues/696>) | ||||
| * In Section 5.5, leading/trailing whitespace removal is at time of | ||||
| use, not parsing (<https://github.com/httpwg/http-core/ | ||||
| issues/697>) | ||||
| * In Section 6, clarify that HTTP self-descriptive messages have an | ||||
| exception in that the request must be understood in order to parse | ||||
| and interpret the response (<https://github.com/httpwg/http-core/ | ||||
| issues/700>) | ||||
| * Remove "Canonicalization and Text Defaults" | ||||
| (<https://github.com/httpwg/http-core/issues/703>) | ||||
| * In Section 10.1.3, refine what can be sent in Referer, and when | ||||
| (<https://github.com/httpwg/http-core/issues/709>) | ||||
| * In Section 11.5, explain that the protection space is not defined | ||||
| without additional information (<https://github.com/httpwg/http- | ||||
| core/issues/710>) | ||||
| * Simplify description of reactive content negotiation in | ||||
| Section 12.2 (<https://github.com/httpwg/http-core/issues/712>) | ||||
| * In Section 8.3.2, remove the "charset" ABNF production, and | ||||
| clarify where charsets appear (<https://github.com/httpwg/http- | ||||
| core/issues/713>) | ||||
| * In Section 12.5.3, clarify that selection _between_ multiple | ||||
| acceptable codings is only relevant when they have the same | ||||
| purpose (<https://github.com/httpwg/http-core/issues/714>) | ||||
| * In Section 13, rewrite introduction, mentioning extensibility | ||||
| (<https://github.com/httpwg/http-core/issues/715>) | ||||
| * Throughout, be consistent about 'content coding' vs 'content- | ||||
| coding' (<https://github.com/httpwg/http-core/issues/719>) | ||||
| * In Section 9.3.6, clarify that the port is mandatory in a CONNECT | ||||
| request target (<https://github.com/httpwg/http-core/issues/736>) | ||||
| and that the tunnel begins after the header section | ||||
| (<https://github.com/httpwg/http-core/issues/737>) | ||||
| * In Section 6.5, remove mid-stream trailers | ||||
| (<https://github.com/httpwg/http-core/issues/740>) | ||||
| * In Section 3.3, clarify duplexing semantics | ||||
| (<https://github.com/httpwg/http-core/issues/741>) | ||||
| * In Section 3.3, explain the implications of statelessness more | ||||
| clearly (<https://github.com/httpwg/http-core/issues/743>) | ||||
| * In Section 8.6, be more explicit about invalid and incorrect | ||||
| values (<https://github.com/httpwg/http-core/issues/748> and | ||||
| <https://github.com/httpwg/http-core/issues/749>) | ||||
| * Move discussion of statelessness from Section 3.7 to Section 3.3 | ||||
| (<https://github.com/httpwg/http-core/issues/753>) | ||||
| * In Section 15.2.2, clarify that the upgraded protocol is in effect | ||||
| after the 101 response (<https://github.com/httpwg/http-core/ | ||||
| issues/776>) | ||||
| * In Section 9.3.6, state that data received after the headers of a | ||||
| CONNECT message is version-specific (<https://github.com/httpwg/ | ||||
| http-core/issues/780>) | ||||
| * In Section 4.2.3, clarify how normalization works, and align with | ||||
| RF3986 (<https://github.com/httpwg/http-core/issues/788>) | ||||
| * In Section 6.6.2, note that the Trailer field can be used to | ||||
| discover deleted trailers (<https://github.com/httpwg/http-core/ | ||||
| issues/793>) | ||||
| * Throughout, remove unneeded normative references to [HTTP/1.1] | ||||
| (<https://github.com/httpwg/http-core/issues/795>) | ||||
| * In Section 10.1.4, explicitly require listing in Connection | ||||
| (<https://github.com/httpwg/http-core/issues/809>) | ||||
| C.17. Since draft-ietf-httpbis-semantics-15 | C.17. Since draft-ietf-httpbis-semantics-15 | |||
| * For [HTTP/3], add an RFC Editor note to rename to "RFCnnn" before | ||||
| publication (<https://github.com/httpwg/http-core/issues/815>) | ||||
| * In Section 9.3.2, align prose about content in HEAD requests with | ||||
| description of GET (<https://github.com/httpwg/http-core/ | ||||
| issues/826>) | ||||
| * In Section 5.3, remove the restriction to non-empty field line | ||||
| values (<https://github.com/httpwg/http-core/issues/836>) | ||||
| * Add forward references to definition of OWS | ||||
| (<https://github.com/httpwg/http-core/issues/841>) | ||||
| * In Section 17.10, add a security consideration regarding | ||||
| application handling of field names (<https://github.com/httpwg/ | ||||
| http-core/issues/843>) | ||||
| C.18. Since draft-ietf-httpbis-semantics-16 | C.18. Since draft-ietf-httpbis-semantics-16 | |||
| This draft addresses mostly editorial issues raised during or past | ||||
| IETF Last Call; see <https://github.com/httpwg/http-core/ | ||||
| issues?q=label%3Asemantics+created%3A%3E2021-05-26> for a summary. | ||||
| Furthermore: | ||||
| * In Section 15.3.7, reinstate 'to a request' | ||||
| (<https://github.com/httpwg/http-core/issues/857>) | ||||
| * Align Section 16.3.1 with Section 16.3.2.1 | ||||
| (<https://github.com/httpwg/http-core/issues/857>) | ||||
| * In Section 14.3, clarify that Accept-Ranges can be sent by any | ||||
| server, remove "none" from the ABNF because it is now a reserved | ||||
| range unit, and allow the field to be sent in a trailer section | ||||
| while noting why that is much less useful than as a header field | ||||
| (<https://github.com/httpwg/http-core/issues/857>) | ||||
| * In Section 7.6.3, don't specify TCP (<https://github.com/httpwg/ | ||||
| http-core/issues/865>) | ||||
| * In Section 6.4, explain the "Content-" prefix | ||||
| (<https://github.com/httpwg/http-core/issues/878>) | ||||
| * In Section 7.4, check all target URIs for scheme semantic | ||||
| mismatches (<https://github.com/httpwg/http-core/issues/896>) | ||||
| * In Section 9.3.1, Section 9.3.2, and Section 9.3.5, clarify | ||||
| (again) that sending content in a request for a method that does | ||||
| not define such content will not interoperate without prior | ||||
| agreement, even if it is parsed correctly, and cannot be relied | ||||
| upon by an origin server unless they control the entire request | ||||
| chain (<https://github.com/httpwg/http-core/issues/904>) | ||||
| C.19. Since draft-ietf-httpbis-semantics-17 | C.19. Since draft-ietf-httpbis-semantics-17 | |||
| * Move ABNF for obs-text into Section 5.5 | ||||
| (<https://github.com/httpwg/http-core/issues/914>) | ||||
| * In Section 6.4.1, note that response metadata can be relevant as | ||||
| well (<https://github.com/httpwg/http-core/issues/914>) | ||||
| * In Section 6.6.2, use the term "signature" througout and lower | ||||
| expectations on what Trailer indicates without a trailer section | ||||
| (<https://github.com/httpwg/http-core/issues/914>) | ||||
| * In Section 8.3, cleanup mime sniffing discussion | ||||
| (<https://github.com/httpwg/http-core/issues/914>) | ||||
| * In Section 10.1.4, add a forward reference to "weight" | ||||
| (<https://github.com/httpwg/http-core/issues/914>) | ||||
| * In Section 12.5.3, clarify that the examples contains multiple | ||||
| values; also remove obsolete HTTP/1.0 note about qvalues | ||||
| (<https://github.com/httpwg/http-core/issues/914>) | ||||
| * In Section 15.4, remove incorrect mention of Etag as request field | ||||
| (<https://github.com/httpwg/http-core/issues/914>) | ||||
| * Move text about obs-fold in message/http to [HTTP/1.1]; also note | ||||
| that LF is forbidden in field values just as CR and NUL | ||||
| (<https://github.com/httpwg/http-core/issues/923>) | ||||
| * In Section 7.7, properly refer to text that has moved to | ||||
| [HTTP/1.1] (<https://github.com/httpwg/http-core/issues/930>) | ||||
| * Rewrite description of validators and move cache-related aspects | ||||
| into [CACHING] (<https://github.com/httpwg/http-core/issues/933>) | ||||
| * In Section 12.5.5, rephrase description to be more explanatory | ||||
| (<https://github.com/httpwg/http-core/issues/938>) | ||||
| * In Section 13.2.2, clarify that a false If-Range means ignore the | ||||
| Range (<https://github.com/httpwg/http-core/issues/940>) | ||||
| * In Section 13.1.3 and Section 13.1.4, restore text about missing | ||||
| modification date (<https://github.com/httpwg/http-core/ | ||||
| issues/942>) | ||||
| * In Section 5.6.1.1, avoid duplicate normative requirement | ||||
| (<https://github.com/httpwg/http-core/issues/943>) | ||||
| * In Section 8.8.2.1, reference 'Date' more visibly | ||||
| (<https://github.com/httpwg/http-core/issues/945>) | ||||
| * In Section 11.7.3, state that Proxy-Authentication-Info can be | ||||
| used as trailer (<https://github.com/httpwg/http-core/issues/946>) | ||||
| * In Section 15.4, slightly clarify history of redirect status codes | ||||
| (<https://github.com/httpwg/http-core/issues/947>) | ||||
| * In Section 16.3.1, fix requirements for provisional registrations | ||||
| (<https://github.com/httpwg/http-core/issues/950>) | ||||
| * In Section 4.3, explicitly refer to how this spec defines access | ||||
| to http or https resources (<https://github.com/httpwg/http-core/ | ||||
| issues/951>) | ||||
| * In Section 6.6.1, make clock a defined term and use that | ||||
| definition throughout the spec (<https://github.com/httpwg/http- | ||||
| core/issues/953>) | ||||
| * In Section 13.1, make preconditions consistent on when they are | ||||
| required to be evaluated (<https://github.com/httpwg/http-core/ | ||||
| issues/954>) | ||||
| * Throughout, disambiguate "selected representation" and "selected | ||||
| response" (now "chosen response") (<https://github.com/httpwg/ | ||||
| http-core/issues/958>) | ||||
| Acknowledgements | Acknowledgements | |||
| See Section 10 of [RFC7230]. | Aside from the current editors, the following individuals deserve | |||
| special recognition for their contributions to early aspects of HTTP | ||||
| and its core specifications: Marc Andreessen, Tim Berners-Lee, Robert | ||||
| Cailliau, Daniel W. Connolly, Bob Denny, John Franks, Jim Gettys, | ||||
| Jean-François Groff, Phillip M. Hallam-Baker, Koen Holtman, Jeffery | ||||
| L. Hostetler, Shel Kaphan, Dave Kristol, Yves Lafon, Scott | ||||
| D. Lawrence, Paul J. Leach, Håkon W. Lie, Ari Luotonen, Larry | ||||
| Masinter, Rob McCool, Jeffrey C. Mogul, Lou Montulli, David Morris, | ||||
| Henrik Frystyk Nielsen, Dave Raggett, Eric Rescorla, Tony Sanders, | ||||
| Lawrence C. Stewart, Marc VanHeyningen, and Steve Zilles. | ||||
| This specification takes over the definition of the HTTP | This edition builds on the many contributions that went into past | |||
| Authentication Framework, previously defined in RFC 2617. We thank | specifications of HTTP, including RFC 1945, RFC 2068, RFC 2145, RFC | |||
| John Franks, Phillip M. Hallam-Baker, Jeffery L. Hostetler, Scott D. | 2616, RFC 2617, RFC 2818, RFC 7230, RFC 7231, RFC 7232, RFC 7233, RFC | |||
| Lawrence, Paul J. Leach, Ari Luotonen, and Lawrence C. Stewart for | 7234, and RFC 7235. The acknowledgements within those documents | |||
| their work on that specification. See Section 6 of [RFC2617] for | still apply. | |||
| further acknowledgements. | ||||
| Since 2014, the following contributors have helped improve this | ||||
| specification by reporting bugs, asking smart questions, drafting or | ||||
| reviewing text, and evaluating open issues: | ||||
| Alan Egerton, Alex Rousskov, Amichai Rothman, Amos Jeffries, Anders | ||||
| Kaseorg, Andreas Gebhardt, Anne van Kesteren, Armin Abfalterer, Aron | ||||
| Duby, Asanka Herath, Asbjørn Ulsberg, Asta Olofsson, Attila Gulyas, | ||||
| Austin Wright, Barry Pollard, Ben Burkert, Benjamin Kaduk, Björn | ||||
| Höhrmann, Brad Fitzpatrick, Chris Pacejo, Colin Bendell, Cory | ||||
| Benfield, Cory Nelson, Daisuke Miyakawa, Dale Worley, Daniel | ||||
| Stenberg, Danil Suits, David Benjamin, David Matson, David Schinazi, | ||||
| Дилян Палаузов (Dilyan Palauzov), Eric Anderson, Eric Rescorla, Éric | ||||
| Vyncke, Erik Kline, Erwin Pe, Etan Kissling, Evert Pot, Evgeny | ||||
| Vrublevsky, Florian Best, Francesca Palombini, Igor Lubashev, James | ||||
| Callahan, James Peach, Jeffrey Yasskin, Kalin Gyokov, Kannan Goundan, | ||||
| 奥 一穂 (Kazuho Oku), Ken Murchison, Krzysztof Maczyński, Lars Eggert, | ||||
| Lucas Pardue, Martin Duke, Martin Dürst, Martin Thomson, Martynas | ||||
| Jusevičius, Matt Menke, Matthias Pigulla, Mattias Grenfeldt, Michael | ||||
| Osipov, Mike Bishop, Mike Pennisi, Mike Taylor, Mike West, Mohit | ||||
| Sethi, Murray Kucherawy, Nathaniel J. Smith, Nicholas Hurley, Nikita | ||||
| Prokhorov, Patrick McManus, Piotr Sikora, Poul-Henning Kamp, Rick van | ||||
| Rein, Robert Wilton, Roberto Polli, Roman Danyliw, Samuel Williams, | ||||
| Semyon Kholodnov, Simon Pieters, Simon Schüppel, Stefan Eissing, | ||||
| Taylor Hunt, Todd Greer, Tommy Pauly, Vasiliy Faronov, Vladimir | ||||
| Lashchev, Wenbo Zhu, William A. Rowe Jr., Willy Tarreau, Xingwei Liu, | ||||
| Yishuai Li, and Zaheduzzaman Sarker. | ||||
| Index | ||||
| 1 2 3 4 5 A B C D E F G H I L M N O P R S T U V W X | ||||
| 1 | ||||
| 100 Continue (status code) Section 15.2.1 | ||||
| 100-continue (expect value) Section 10.1.1 | ||||
| 101 Switching Protocols (status code) Section 15.2.2 | ||||
| 1xx Informational (status code class) Section 15.2 | ||||
| 2 | ||||
| 200 OK (status code) Section 15.3.1 | ||||
| 201 Created (status code) Section 15.3.2 | ||||
| 202 Accepted (status code) Section 15.3.3 | ||||
| 203 Non-Authoritative Information (status code) Section 15.3.4 | ||||
| 204 No Content (status code) Section 15.3.5 | ||||
| 205 Reset Content (status code) Section 15.3.6 | ||||
| 206 Partial Content (status code) Section 15.3.7 | ||||
| 2xx Successful (status code class) Section 15.3 | ||||
| 3 | ||||
| 300 Multiple Choices (status code) Section 15.4.1 | ||||
| 301 Moved Permanently (status code) Section 15.4.2 | ||||
| 302 Found (status code) Section 15.4.3 | ||||
| 303 See Other (status code) Section 15.4.4 | ||||
| 304 Not Modified (status code) Section 15.4.5 | ||||
| 305 Use Proxy (status code) Section 15.4.6 | ||||
| 306 (Unused) (status code) Section 15.4.7 | ||||
| 307 Temporary Redirect (status code) Section 15.4.8 | ||||
| 308 Permanent Redirect (status code) Section 15.4.9 | ||||
| 3xx Redirection (status code class) Section 15.4 | ||||
| 4 | ||||
| 400 Bad Request (status code) Section 15.5.1 | ||||
| 401 Unauthorized (status code) Section 15.5.2 | ||||
| 402 Payment Required (status code) Section 15.5.3 | ||||
| 403 Forbidden (status code) Section 15.5.4 | ||||
| 404 Not Found (status code) Section 15.5.5 | ||||
| 405 Method Not Allowed (status code) Section 15.5.6 | ||||
| 406 Not Acceptable (status code) Section 15.5.7 | ||||
| 407 Proxy Authentication Required (status code) Section 15.5.8 | ||||
| 408 Request Timeout (status code) Section 15.5.9 | ||||
| 409 Conflict (status code) Section 15.5.10 | ||||
| 410 Gone (status code) Section 15.5.11 | ||||
| 411 Length Required (status code) Section 15.5.12 | ||||
| 412 Precondition Failed (status code) Section 15.5.13 | ||||
| 413 Content Too Large (status code) Section 15.5.14 | ||||
| 414 URI Too Long (status code) Section 15.5.15 | ||||
| 415 Unsupported Media Type (status code) Section 15.5.16 | ||||
| 416 Range Not Satisfiable (status code) Section 15.5.17 | ||||
| 417 Expectation Failed (status code) Section 15.5.18 | ||||
| 418 (Unused) (status code) Section 15.5.19 | ||||
| 421 Misdirected Request (status code) Section 15.5.20 | ||||
| 422 Unprocessable Content (status code) Section 15.5.21 | ||||
| 426 Upgrade Required (status code) Section 15.5.22 | ||||
| 4xx Client Error (status code class) Section 15.5 | ||||
| 5 | ||||
| 500 Internal Server Error (status code) Section 15.6.1 | ||||
| 501 Not Implemented (status code) Section 15.6.2 | ||||
| 502 Bad Gateway (status code) Section 15.6.3 | ||||
| 503 Service Unavailable (status code) Section 15.6.4 | ||||
| 504 Gateway Timeout (status code) Section 15.6.5 | ||||
| 505 HTTP Version Not Supported (status code) Section 15.6.6 | ||||
| 5xx Server Error (status code class) Section 15.6 | ||||
| A | ||||
| Accept header field Section 12.5.1 | ||||
| Accept-Charset header field Section 12.5.2 | ||||
| Accept-Encoding header field Section 12.5.3 | ||||
| Accept-Language header field Section 12.5.4 | ||||
| Accept-Ranges header field Section 14.3 | ||||
| Allow header field Section 10.2.1 | ||||
| Authentication-Info header field Section 11.6.3 | ||||
| Authorization header field Section 11.6.2 | ||||
| accelerator Section 3.7, Paragraph 6 | ||||
| authoritative response Section 17.1 | ||||
| B | ||||
| browser Section 3.5 | ||||
| C | ||||
| CONNECT method Section 9.3.6 | ||||
| Connection header field Section 7.6.1 | ||||
| Content-Encoding header field Section 8.4 | ||||
| Content-Language header field Section 8.5 | ||||
| Content-Length header field Section 8.6 | ||||
| Content-Location header field Section 8.7 | ||||
| Content-MD5 header field Section 18.4, Paragraph 9 | ||||
| Content-Range header field Section 14.4; Section 14.5 | ||||
| Content-Type header field Section 8.3 | ||||
| cache Section 3.8 | ||||
| cacheable Section 3.8, Paragraph 4 | ||||
| client Section 3.3 | ||||
| clock Section 5.6.7 | ||||
| complete Section 6.1 | ||||
| compress (Coding Format) Section 8.4.1.1 | ||||
| compress (content coding) Section 8.4.1 | ||||
| conditional request Section 13 | ||||
| connection Section 3.3 | ||||
| content Section 6.4 | ||||
| content coding Section 8.4.1 | ||||
| content negotiation Section 1.3, Paragraph 4 | ||||
| control data Section 6.2 | ||||
| D | ||||
| DELETE method Section 9.3.5 | ||||
| Date header field Section 6.6.1 | ||||
| Delimiters Section 5.6.2, Paragraph 3 | ||||
| deflate (Coding Format) Section 8.4.1.2 | ||||
| deflate (content coding) Section 8.4.1 | ||||
| downstream Section 3.7, Paragraph 4 | ||||
| E | ||||
| ETag field Section 8.8.3 | ||||
| Expect header field Section 10.1.1 | ||||
| effective request URI Section 7.1, Paragraph 8.1 | ||||
| F | ||||
| Fields | ||||
| * Section 18.4, Paragraph 8 | ||||
| Accept Section 12.5.1 | ||||
| Accept-Charset Section 12.5.2 | ||||
| Accept-Encoding Section 12.5.3 | ||||
| Accept-Language Section 12.5.4 | ||||
| Accept-Ranges Section 14.3 | ||||
| Allow Section 10.2.1 | ||||
| Authentication-Info Section 11.6.3 | ||||
| Authorization Section 11.6.2 | ||||
| Connection Section 7.6.1 | ||||
| Content-Encoding Section 8.4 | ||||
| Content-Language Section 8.5 | ||||
| Content-Length Section 8.6 | ||||
| Content-Location Section 8.7 | ||||
| Content-MD5 Section 18.4, Paragraph 9 | ||||
| Content-Range Section 14.4; Section 14.5 | ||||
| Content-Type Section 8.3 | ||||
| Date Section 6.6.1 | ||||
| ETag Section 8.8.3 | ||||
| Expect Section 10.1.1 | ||||
| From Section 10.1.2 | ||||
| Host Section 7.2 | ||||
| If-Match Section 13.1.1 | ||||
| If-Modified-Since Section 13.1.3 | ||||
| If-None-Match Section 13.1.2 | ||||
| If-Range Section 13.1.5 | ||||
| If-Unmodified-Since Section 13.1.4 | ||||
| Last-Modified Section 8.8.2 | ||||
| Location Section 10.2.2 | ||||
| Max-Forwards Section 7.6.2 | ||||
| Proxy-Authenticate Section 11.7.1 | ||||
| Proxy-Authentication-Info Section 11.7.3 | ||||
| Proxy-Authorization Section 11.7.2 | ||||
| Range Section 14.2 | ||||
| Referer Section 10.1.3 | ||||
| Retry-After Section 10.2.3 | ||||
| Server Section 10.2.4 | ||||
| TE Section 10.1.4 | ||||
| Trailer Section 6.6.2 | ||||
| Upgrade Section 7.8 | ||||
| User-Agent Section 10.1.5 | ||||
| Vary Section 12.5.5 | ||||
| Via Section 7.6.3 | ||||
| WWW-Authenticate Section 11.6.1 | ||||
| Fragment Identifiers Section 4.2.5 | ||||
| From header field Section 10.1.2 | ||||
| field Section 5; Section 6.3 | ||||
| field line Section 5.2, Paragraph 1 | ||||
| field line value Section 5.2, Paragraph 1 | ||||
| field name Section 5.2, Paragraph 1 | ||||
| field value Section 5.2, Paragraph 2 | ||||
| G | ||||
| GET method Section 9.3.1 | ||||
| Grammar | ||||
| ALPHA Section 2.1 | ||||
| Accept Section 12.5.1 | ||||
| Accept-Charset Section 12.5.2 | ||||
| Accept-Encoding Section 12.5.3 | ||||
| Accept-Language Section 12.5.4 | ||||
| Accept-Ranges Section 14.3 | ||||
| Allow Section 10.2.1 | ||||
| Authentication-Info Section 11.6.3 | ||||
| Authorization Section 11.6.2 | ||||
| BWS Section 5.6.3 | ||||
| CR Section 2.1 | ||||
| CRLF Section 2.1 | ||||
| CTL Section 2.1 | ||||
| Connection Section 7.6.1 | ||||
| Content-Encoding Section 8.4 | ||||
| Content-Language Section 8.5 | ||||
| Content-Length Section 8.6 | ||||
| Content-Location Section 8.7 | ||||
| Content-Range Section 14.4 | ||||
| Content-Type Section 8.3 | ||||
| DIGIT Section 2.1 | ||||
| DQUOTE Section 2.1 | ||||
| Date Section 6.6.1 | ||||
| ETag Section 8.8.3 | ||||
| Expect Section 10.1.1 | ||||
| From Section 10.1.2 | ||||
| GMT Section 5.6.7 | ||||
| HEXDIG Section 2.1 | ||||
| HTAB Section 2.1 | ||||
| HTTP-date Section 5.6.7 | ||||
| Host Section 7.2 | ||||
| IMF-fixdate Section 5.6.7 | ||||
| If-Match Section 13.1.1 | ||||
| If-Modified-Since Section 13.1.3 | ||||
| If-None-Match Section 13.1.2 | ||||
| If-Range Section 13.1.5 | ||||
| If-Unmodified-Since Section 13.1.4 | ||||
| LF Section 2.1 | ||||
| Last-Modified Section 8.8.2 | ||||
| Location Section 10.2.2 | ||||
| Max-Forwards Section 7.6.2 | ||||
| OCTET Section 2.1 | ||||
| OWS Section 5.6.3 | ||||
| Proxy-Authenticate Section 11.7.1 | ||||
| Proxy-Authentication-Info Section 11.7.3 | ||||
| Proxy-Authorization Section 11.7.2 | ||||
| RWS Section 5.6.3 | ||||
| Range Section 14.2 | ||||
| Referer Section 10.1.3 | ||||
| Retry-After Section 10.2.3 | ||||
| SP Section 2.1 | ||||
| Server Section 10.2.4 | ||||
| TE Section 10.1.4 | ||||
| Trailer Section 6.6.2 | ||||
| URI-reference Section 4.1 | ||||
| Upgrade Section 7.8 | ||||
| User-Agent Section 10.1.5 | ||||
| VCHAR Section 2.1 | ||||
| Vary Section 12.5.5 | ||||
| Via Section 7.6.3 | ||||
| WWW-Authenticate Section 11.6.1 | ||||
| absolute-URI Section 4.1 | ||||
| absolute-path Section 4.1 | ||||
| acceptable-ranges Section 14.3 | ||||
| asctime-date Section 5.6.7 | ||||
| auth-param Section 11.2 | ||||
| auth-scheme Section 11.1 | ||||
| authority Section 4.1 | ||||
| challenge Section 11.3 | ||||
| codings Section 12.5.3 | ||||
| comment Section 5.6.5 | ||||
| complete-length Section 14.4 | ||||
| connection-option Section 7.6.1 | ||||
| content-coding Section 8.4.1 | ||||
| credentials Section 11.4 | ||||
| ctext Section 5.6.5 | ||||
| date1 Section 5.6.7 | ||||
| day Section 5.6.7 | ||||
| day-name Section 5.6.7 | ||||
| day-name-l Section 5.6.7 | ||||
| delay-seconds Section 10.2.3 | ||||
| entity-tag Section 8.8.3 | ||||
| etagc Section 8.8.3 | ||||
| field-content Section 5.5 | ||||
| field-name Section 5.1; Section 6.6.2 | ||||
| field-value Section 5.5 | ||||
| field-vchar Section 5.5 | ||||
| first-pos Section 14.1.1; Section 14.4 | ||||
| hour Section 5.6.7 | ||||
| http-URI Section 4.2.1 | ||||
| https-URI Section 4.2.2 | ||||
| incl-range Section 14.4 | ||||
| int-range Section 14.1.1 | ||||
| language-range Section 12.5.4 | ||||
| language-tag Section 8.5.1 | ||||
| last-pos Section 14.1.1; Section 14.4 | ||||
| media-range Section 12.5.1 | ||||
| media-type Section 8.3.1 | ||||
| method Section 9.1 | ||||
| minute Section 5.6.7 | ||||
| month Section 5.6.7 | ||||
| obs-date Section 5.6.7 | ||||
| obs-text Section 5.5 | ||||
| opaque-tag Section 8.8.3 | ||||
| other-range Section 14.1.1 | ||||
| parameter Section 5.6.6 | ||||
| parameter-name Section 5.6.6 | ||||
| parameter-value Section 5.6.6 | ||||
| parameters Section 5.6.6 | ||||
| partial-URI Section 4.1 | ||||
| port Section 4.1 | ||||
| product Section 10.1.5 | ||||
| product-version Section 10.1.5 | ||||
| protocol-name Section 7.6.3 | ||||
| protocol-version Section 7.6.3 | ||||
| pseudonym Section 7.6.3 | ||||
| qdtext Section 5.6.4 | ||||
| query Section 4.1 | ||||
| quoted-pair Section 5.6.4 | ||||
| quoted-string Section 5.6.4 | ||||
| qvalue Section 12.4.2 | ||||
| range-resp Section 14.4 | ||||
| range-set Section 14.1.1 | ||||
| range-spec Section 14.1.1 | ||||
| range-unit Section 14.1 | ||||
| ranges-specifier Section 14.1.1 | ||||
| received-by Section 7.6.3 | ||||
| received-protocol Section 7.6.3 | ||||
| rfc850-date Section 5.6.7 | ||||
| second Section 5.6.7 | ||||
| segment Section 4.1 | ||||
| subtype Section 8.3.1 | ||||
| suffix-length Section 14.1.1 | ||||
| suffix-range Section 14.1.1 | ||||
| t-codings Section 10.1.4 | ||||
| tchar Section 5.6.2 | ||||
| time-of-day Section 5.6.7 | ||||
| token Section 5.6.2 | ||||
| token68 Section 11.2 | ||||
| transfer-coding Section 10.1.4 | ||||
| transfer-parameter Section 10.1.4 | ||||
| type Section 8.3.1 | ||||
| unsatisfied-range Section 14.4 | ||||
| uri-host Section 4.1 | ||||
| weak Section 8.8.3 | ||||
| weight Section 12.4.2 | ||||
| year Section 5.6.7 | ||||
| gateway Section 3.7, Paragraph 6 | ||||
| gzip (Coding Format) Section 8.4.1.3 | ||||
| gzip (content coding) Section 8.4.1 | ||||
| H | ||||
| HEAD method Section 9.3.2 | ||||
| Header Fields | ||||
| Accept Section 12.5.1 | ||||
| Accept-Charset Section 12.5.2 | ||||
| Accept-Encoding Section 12.5.3 | ||||
| Accept-Language Section 12.5.4 | ||||
| Accept-Ranges Section 14.3 | ||||
| Allow Section 10.2.1 | ||||
| Authentication-Info Section 11.6.3 | ||||
| Authorization Section 11.6.2 | ||||
| Connection Section 7.6.1 | ||||
| Content-Encoding Section 8.4 | ||||
| Content-Language Section 8.5 | ||||
| Content-Length Section 8.6 | ||||
| Content-Location Section 8.7 | ||||
| Content-MD5 Section 18.4, Paragraph 9 | ||||
| Content-Range Section 14.4; Section 14.5 | ||||
| Content-Type Section 8.3 | ||||
| Date Section 6.6.1 | ||||
| ETag Section 8.8.3 | ||||
| Expect Section 10.1.1 | ||||
| From Section 10.1.2 | ||||
| Host Section 7.2 | ||||
| If-Match Section 13.1.1 | ||||
| If-Modified-Since Section 13.1.3 | ||||
| If-None-Match Section 13.1.2 | ||||
| If-Range Section 13.1.5 | ||||
| If-Unmodified-Since Section 13.1.4 | ||||
| Last-Modified Section 8.8.2 | ||||
| Location Section 10.2.2 | ||||
| Max-Forwards Section 7.6.2 | ||||
| Proxy-Authenticate Section 11.7.1 | ||||
| Proxy-Authentication-Info Section 11.7.3 | ||||
| Proxy-Authorization Section 11.7.2 | ||||
| Range Section 14.2 | ||||
| Referer Section 10.1.3 | ||||
| Retry-After Section 10.2.3 | ||||
| Server Section 10.2.4 | ||||
| TE Section 10.1.4 | ||||
| Trailer Section 6.6.2 | ||||
| Upgrade Section 7.8 | ||||
| User-Agent Section 10.1.5 | ||||
| Vary Section 12.5.5 | ||||
| Via Section 7.6.3 | ||||
| WWW-Authenticate Section 11.6.1 | ||||
| Host header field Section 7.2 | ||||
| header section Section 6.3 | ||||
| http URI scheme Section 4.2.1 | ||||
| https URI scheme Section 4.2.2 | ||||
| I | ||||
| If-Match header field Section 13.1.1 | ||||
| If-Modified-Since header field Section 13.1.3 | ||||
| If-None-Match header field Section 13.1.2 | ||||
| If-Range header field Section 13.1.5 | ||||
| If-Unmodified-Since header field Section 13.1.4 | ||||
| idempotent Section 9.2.2 | ||||
| inbound Section 3.7, Paragraph 4 | ||||
| incomplete Section 6.1 | ||||
| interception proxy Section 3.7, Paragraph 10 | ||||
| intermediary Section 3.7 | ||||
| L | ||||
| Last-Modified header field Section 8.8.2 | ||||
| Location header field Section 10.2.2 | ||||
| list-based field Section 5.5, Paragraph 7 | ||||
| M | ||||
| Max-Forwards header field Section 7.6.2 | ||||
| Media Type | ||||
| multipart/byteranges Section 14.6 | ||||
| multipart/x-byteranges Section 14.6, Paragraph 4, Item 3 | ||||
| Method | ||||
| * Section 18.2, Paragraph 3 | ||||
| CONNECT Section 9.3.6 | ||||
| DELETE Section 9.3.5 | ||||
| GET Section 9.3.1 | ||||
| HEAD Section 9.3.2 | ||||
| OPTIONS Section 9.3.7 | ||||
| POST Section 9.3.3 | ||||
| PUT Section 9.3.4 | ||||
| TRACE Section 9.3.8 | ||||
| message Section 3.4; Section 6 | ||||
| message abstraction Section 6 | ||||
| messages Section 3.4 | ||||
| metadata Section 8.8 | ||||
| multipart/byteranges Media Type Section 14.6 | ||||
| multipart/x-byteranges Media Type Section 14.6, Paragraph 4, | ||||
| Item 3 | ||||
| N | ||||
| non-transforming proxy Section 7.7 | ||||
| O | ||||
| OPTIONS method Section 9.3.7 | ||||
| Origin Section 11.5 | ||||
| origin Section 4.3.1 | ||||
| origin server Section 3.6 | ||||
| outbound Section 3.7, Paragraph 4 | ||||
| P | ||||
| POST method Section 9.3.3 | ||||
| PUT method Section 9.3.4 | ||||
| Protection Space Section 11.5 | ||||
| Proxy-Authenticate header field Section 11.7.1 | ||||
| Proxy-Authentication-Info header field Section 11.7.3 | ||||
| Proxy-Authorization header field Section 11.7.2 | ||||
| phishing Section 17.1 | ||||
| proxy Section 3.7, Paragraph 5 | ||||
| R | ||||
| Range header field Section 14.2 | ||||
| Realm Section 11.5 | ||||
| Referer header field Section 10.1.3 | ||||
| Retry-After header field Section 10.2.3 | ||||
| recipient Section 3.4 | ||||
| representation Section 3.2 | ||||
| request Section 3.4 | ||||
| request target Section 7.1 | ||||
| resource Section 3.1; Section 4 | ||||
| response Section 3.4 | ||||
| reverse proxy Section 3.7, Paragraph 6 | ||||
| S | ||||
| Server header field Section 10.2.4 | ||||
| Status Code Section 15 | ||||
| Status Codes | ||||
| Final Section 15, Paragraph 7 | ||||
| Informational Section 15, Paragraph 7 | ||||
| Interim Section 15, Paragraph 7 | ||||
| Status Codes Classes | ||||
| 1xx Informational Section 15.2 | ||||
| 2xx Successful Section 15.3 | ||||
| 3xx Redirection Section 15.4 | ||||
| 4xx Client Error Section 15.5 | ||||
| 5xx Server Error Section 15.6 | ||||
| safe Section 9.2.1 | ||||
| secured Section 4.2.2 | ||||
| selected representation Section 3.2, Paragraph 4; Section 8.8; | ||||
| Section 13.1 | ||||
| self-descriptive Section 6 | ||||
| sender Section 3.4 | ||||
| server Section 3.3 | ||||
| singleton field Section 5.5, Paragraph 6 | ||||
| spider Section 3.5 | ||||
| T | ||||
| TE header field Section 10.1.4 | ||||
| TRACE method Section 9.3.8 | ||||
| Trailer Fields | ||||
| ETag Section 8.8.3 | ||||
| Trailer header field Section 6.6.2 | ||||
| target URI Section 7.1 | ||||
| target resource Section 7.1 | ||||
| trailer fields Section 6.5 | ||||
| trailer section Section 6.5 | ||||
| trailers Section 6.5 | ||||
| transforming proxy Section 7.7 | ||||
| transparent proxy Section 3.7, Paragraph 10 | ||||
| tunnel Section 3.7, Paragraph 8 | ||||
| U | ||||
| URI Section 4 | ||||
| origin Section 4.3.1 | ||||
| URI reference Section 4.1 | ||||
| URI scheme | ||||
| http Section 4.2.1 | ||||
| https Section 4.2.2 | ||||
| Upgrade header field Section 7.8 | ||||
| User-Agent header field Section 10.1.5 | ||||
| upstream Section 3.7, Paragraph 4 | ||||
| user agent Section 3.5 | ||||
| V | ||||
| Vary header field Section 12.5.5 | ||||
| Via header field Section 7.6.3 | ||||
| validator Section 8.8 | ||||
| strong Section 8.8.1 | ||||
| weak Section 8.8.1 | ||||
| W | ||||
| WWW-Authenticate header field Section 11.6.1 | ||||
| X | ||||
| x-compress (content coding) Section 8.4.1 | ||||
| x-gzip (content coding) Section 8.4.1 | ||||
| Authors' Addresses | Authors' Addresses | |||
| Roy T. Fielding (editor) | Roy T. Fielding (editor) | |||
| Adobe Systems Incorporated | Adobe | |||
| 345 Park Ave | 345 Park Ave | |||
| San Jose, CA 95110 | San Jose, CA 95110 | |||
| USA | United States of America | |||
| EMail: fielding@gbiv.com | Email: fielding@gbiv.com | |||
| URI: http://roy.gbiv.com/ | URI: https://roy.gbiv.com/ | |||
| Julian F. Reschke (editor) | Mark Nottingham (editor) | |||
| Fastly | ||||
| Prahran VIC | ||||
| Australia | ||||
| Email: mnot@mnot.net | ||||
| URI: https://www.mnot.net/ | ||||
| Julian Reschke (editor) | ||||
| greenbytes GmbH | greenbytes GmbH | |||
| Hafenweg 16 | Hafenweg 16 | |||
| Muenster, NW 48155 | 48155 Münster | |||
| Germany | Germany | |||
| EMail: julian.reschke@greenbytes.de | Email: julian.reschke@greenbytes.de | |||
| URI: http://greenbytes.de/tech/webdav/ | URI: https://greenbytes.de/tech/webdav/ | |||
| End of changes. 1346 change blocks. | ||||
| 3825 lines changed or deleted | 6978 lines changed or added | |||
This html diff was produced by rfcdiff 1.46. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||