| draft-ietf-httpbis-messaging-16.txt | draft-ietf-httpbis-messaging-17.txt | |||
|---|---|---|---|---|
| HTTP Working Group R. Fielding, Ed. | HTTP Working Group R. Fielding, Ed. | |||
| Internet-Draft Adobe | Internet-Draft Adobe | |||
| Obsoletes: 7230 (if approved) M. Nottingham, Ed. | Obsoletes: 7230 (if approved) M. Nottingham, Ed. | |||
| Intended status: Standards Track Fastly | Intended status: Standards Track Fastly | |||
| Expires: 28 November 2021 J. Reschke, Ed. | Expires: 27 January 2022 J. Reschke, Ed. | |||
| greenbytes | greenbytes | |||
| 27 May 2021 | 26 July 2021 | |||
| HTTP/1.1 | HTTP/1.1 | |||
| draft-ietf-httpbis-messaging-16 | draft-ietf-httpbis-messaging-17 | |||
| 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 specifies the HTTP/1.1 message syntax, | systems. This document specifies the HTTP/1.1 message syntax, | |||
| message parsing, connection management, and related security | message parsing, connection management, and related security | |||
| concerns. | concerns. | |||
| This document obsoletes portions of RFC 7230. | This document obsoletes portions of RFC 7230. | |||
| skipping to change at page 1, line 36 ¶ | skipping to change at page 1, line 36 ¶ | |||
| This note is to be removed before publishing as an RFC. | This note is to be removed before publishing as an RFC. | |||
| Discussion of this draft takes place on the HTTP working group | Discussion of this draft takes place on the HTTP working group | |||
| mailing list (ietf-http-wg@w3.org), which is archived at | mailing list (ietf-http-wg@w3.org), which is archived at | |||
| <https://lists.w3.org/Archives/Public/ietf-http-wg/>. | <https://lists.w3.org/Archives/Public/ietf-http-wg/>. | |||
| Working Group information can be found at <https://httpwg.org/>; | Working Group information can be found at <https://httpwg.org/>; | |||
| source code and issues list for this draft can be found at | source code and issues list for this draft can be found at | |||
| <https://github.com/httpwg/http-core>. | <https://github.com/httpwg/http-core>. | |||
| The changes in this draft are summarized in Appendix D.17. | The changes in this draft are summarized in Appendix D.18. | |||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
| provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on 28 November 2021. | This Internet-Draft will expire on 27 January 2022. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2021 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 (https://trustee.ietf.org/ | Provisions Relating to IETF Documents (https://trustee.ietf.org/ | |||
| license-info) in effect on the date of publication of this document. | license-info) in effect on the date of publication of this document. | |||
| Please review these documents carefully, as they describe your rights | Please review these documents carefully, as they describe your rights | |||
| skipping to change at page 3, line 4 ¶ | skipping to change at page 3, line 4 ¶ | |||
| 2. Message . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 2. Message . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 2.1. Message Format . . . . . . . . . . . . . . . . . . . . . 6 | 2.1. Message Format . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 2.2. Message Parsing . . . . . . . . . . . . . . . . . . . . . 7 | 2.2. Message Parsing . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 2.3. HTTP Version . . . . . . . . . . . . . . . . . . . . . . 8 | 2.3. HTTP Version . . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 3. Request Line . . . . . . . . . . . . . . . . . . . . . . . . 9 | 3. Request Line . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 3.1. Method . . . . . . . . . . . . . . . . . . . . . . . . . 10 | 3.1. Method . . . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 3.2. Request Target . . . . . . . . . . . . . . . . . . . . . 10 | 3.2. Request Target . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 3.2.1. origin-form . . . . . . . . . . . . . . . . . . . . . 11 | 3.2.1. origin-form . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 3.2.2. absolute-form . . . . . . . . . . . . . . . . . . . . 11 | 3.2.2. absolute-form . . . . . . . . . . . . . . . . . . . . 11 | |||
| 3.2.3. authority-form . . . . . . . . . . . . . . . . . . . 12 | 3.2.3. authority-form . . . . . . . . . . . . . . . . . . . 12 | |||
| 3.2.4. asterisk-form . . . . . . . . . . . . . . . . . . . . 13 | 3.2.4. asterisk-form . . . . . . . . . . . . . . . . . . . . 12 | |||
| 3.3. Reconstructing the Target URI . . . . . . . . . . . . . . 13 | 3.3. Reconstructing the Target URI . . . . . . . . . . . . . . 13 | |||
| 4. Status Line . . . . . . . . . . . . . . . . . . . . . . . . . 15 | 4. Status Line . . . . . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 5. Field Syntax . . . . . . . . . . . . . . . . . . . . . . . . 16 | 5. Field Syntax . . . . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 5.1. Field Line Parsing . . . . . . . . . . . . . . . . . . . 16 | 5.1. Field Line Parsing . . . . . . . . . . . . . . . . . . . 16 | |||
| 5.2. Obsolete Line Folding . . . . . . . . . . . . . . . . . . 17 | 5.2. Obsolete Line Folding . . . . . . . . . . . . . . . . . . 17 | |||
| 6. Message Body . . . . . . . . . . . . . . . . . . . . . . . . 17 | 6. Message Body . . . . . . . . . . . . . . . . . . . . . . . . 17 | |||
| 6.1. Transfer-Encoding . . . . . . . . . . . . . . . . . . . . 18 | 6.1. Transfer-Encoding . . . . . . . . . . . . . . . . . . . . 18 | |||
| 6.2. Content-Length . . . . . . . . . . . . . . . . . . . . . 19 | 6.2. Content-Length . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 6.3. Message Body Length . . . . . . . . . . . . . . . . . . . 20 | 6.3. Message Body Length . . . . . . . . . . . . . . . . . . . 20 | |||
| 7. Transfer Codings . . . . . . . . . . . . . . . . . . . . . . 22 | 7. Transfer Codings . . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 7.1. Chunked Transfer Coding . . . . . . . . . . . . . . . . . 23 | 7.1. Chunked Transfer Coding . . . . . . . . . . . . . . . . . 23 | |||
| 7.1.1. Chunk Extensions . . . . . . . . . . . . . . . . . . 23 | 7.1.1. Chunk Extensions . . . . . . . . . . . . . . . . . . 24 | |||
| 7.1.2. Chunked Trailer Section . . . . . . . . . . . . . . . 24 | 7.1.2. Chunked Trailer Section . . . . . . . . . . . . . . . 25 | |||
| 7.1.3. Decoding Chunked . . . . . . . . . . . . . . . . . . 24 | 7.1.3. Decoding Chunked . . . . . . . . . . . . . . . . . . 25 | |||
| 7.2. Transfer Codings for Compression . . . . . . . . . . . . 25 | 7.2. Transfer Codings for Compression . . . . . . . . . . . . 26 | |||
| 7.3. Transfer Coding Registry . . . . . . . . . . . . . . . . 25 | 7.3. Transfer Coding Registry . . . . . . . . . . . . . . . . 26 | |||
| 7.4. Negotiating Transfer Codings . . . . . . . . . . . . . . 26 | 7.4. Negotiating Transfer Codings . . . . . . . . . . . . . . 27 | |||
| 8. Handling Incomplete Messages . . . . . . . . . . . . . . . . 27 | 8. Handling Incomplete Messages . . . . . . . . . . . . . . . . 27 | |||
| 9. Connection Management . . . . . . . . . . . . . . . . . . . . 28 | 9. Connection Management . . . . . . . . . . . . . . . . . . . . 28 | |||
| 9.1. Establishment . . . . . . . . . . . . . . . . . . . . . . 28 | 9.1. Establishment . . . . . . . . . . . . . . . . . . . . . . 29 | |||
| 9.2. Associating a Response to a Request . . . . . . . . . . . 28 | 9.2. Associating a Response to a Request . . . . . . . . . . . 29 | |||
| 9.3. Persistence . . . . . . . . . . . . . . . . . . . . . . . 29 | 9.3. Persistence . . . . . . . . . . . . . . . . . . . . . . . 29 | |||
| 9.3.1. Retrying Requests . . . . . . . . . . . . . . . . . . 30 | 9.3.1. Retrying Requests . . . . . . . . . . . . . . . . . . 30 | |||
| 9.3.2. Pipelining . . . . . . . . . . . . . . . . . . . . . 30 | 9.3.2. Pipelining . . . . . . . . . . . . . . . . . . . . . 31 | |||
| 9.4. Concurrency . . . . . . . . . . . . . . . . . . . . . . . 31 | 9.4. Concurrency . . . . . . . . . . . . . . . . . . . . . . . 31 | |||
| 9.5. Failures and Timeouts . . . . . . . . . . . . . . . . . . 31 | 9.5. Failures and Timeouts . . . . . . . . . . . . . . . . . . 32 | |||
| 9.6. Tear-down . . . . . . . . . . . . . . . . . . . . . . . . 32 | 9.6. Tear-down . . . . . . . . . . . . . . . . . . . . . . . . 33 | |||
| 9.7. TLS Connection Initiation . . . . . . . . . . . . . . . . 34 | 9.7. TLS Connection Initiation . . . . . . . . . . . . . . . . 34 | |||
| 9.8. TLS Connection Closure . . . . . . . . . . . . . . . . . 34 | 9.8. TLS Connection Closure . . . . . . . . . . . . . . . . . 35 | |||
| 10. Enclosing Messages as Data . . . . . . . . . . . . . . . . . 35 | 10. Enclosing Messages as Data . . . . . . . . . . . . . . . . . 36 | |||
| 10.1. Media Type message/http . . . . . . . . . . . . . . . . 35 | 10.1. Media Type message/http . . . . . . . . . . . . . . . . 36 | |||
| 10.2. Media Type application/http . . . . . . . . . . . . . . 36 | 10.2. Media Type application/http . . . . . . . . . . . . . . 37 | |||
| 11. Security Considerations . . . . . . . . . . . . . . . . . . . 37 | 11. Security Considerations . . . . . . . . . . . . . . . . . . . 38 | |||
| 11.1. Response Splitting . . . . . . . . . . . . . . . . . . . 37 | 11.1. Response Splitting . . . . . . . . . . . . . . . . . . . 38 | |||
| 11.2. Request Smuggling . . . . . . . . . . . . . . . . . . . 38 | 11.2. Request Smuggling . . . . . . . . . . . . . . . . . . . 39 | |||
| 11.3. Message Integrity . . . . . . . . . . . . . . . . . . . 39 | 11.3. Message Integrity . . . . . . . . . . . . . . . . . . . 39 | |||
| 11.4. Message Confidentiality . . . . . . . . . . . . . . . . 39 | 11.4. Message Confidentiality . . . . . . . . . . . . . . . . 40 | |||
| 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 40 | 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 40 | |||
| 12.1. Field Name Registration . . . . . . . . . . . . . . . . 40 | 12.1. Field Name Registration . . . . . . . . . . . . . . . . 40 | |||
| 12.2. Media Type Registration . . . . . . . . . . . . . . . . 40 | 12.2. Media Type Registration . . . . . . . . . . . . . . . . 41 | |||
| 12.3. Transfer Coding Registration . . . . . . . . . . . . . . 40 | 12.3. Transfer Coding Registration . . . . . . . . . . . . . . 41 | |||
| 12.4. ALPN Protocol ID Registration . . . . . . . . . . . . . 41 | 12.4. ALPN Protocol ID Registration . . . . . . . . . . . . . 42 | |||
| 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 42 | 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 42 | |||
| 13.1. Normative References . . . . . . . . . . . . . . . . . . 42 | 13.1. Normative References . . . . . . . . . . . . . . . . . . 42 | |||
| 13.2. Informative References . . . . . . . . . . . . . . . . . 43 | 13.2. Informative References . . . . . . . . . . . . . . . . . 43 | |||
| Appendix A. Collected ABNF . . . . . . . . . . . . . . . . . . . 44 | Appendix A. Collected ABNF . . . . . . . . . . . . . . . . . . . 44 | |||
| Appendix B. Differences between HTTP and MIME . . . . . . . . . 46 | Appendix B. Differences between HTTP and MIME . . . . . . . . . 46 | |||
| B.1. MIME-Version . . . . . . . . . . . . . . . . . . . . . . 46 | B.1. MIME-Version . . . . . . . . . . . . . . . . . . . . . . 46 | |||
| B.2. Conversion to Canonical Form . . . . . . . . . . . . . . 46 | B.2. Conversion to Canonical Form . . . . . . . . . . . . . . 47 | |||
| B.3. Conversion of Date Formats . . . . . . . . . . . . . . . 47 | B.3. Conversion of Date Formats . . . . . . . . . . . . . . . 47 | |||
| B.4. Conversion of Content-Encoding . . . . . . . . . . . . . 47 | B.4. Conversion of Content-Encoding . . . . . . . . . . . . . 47 | |||
| B.5. Conversion of Content-Transfer-Encoding . . . . . . . . . 47 | B.5. Conversion of Content-Transfer-Encoding . . . . . . . . . 47 | |||
| B.6. MHTML and Line Length Limitations . . . . . . . . . . . . 48 | B.6. MHTML and Line Length Limitations . . . . . . . . . . . . 48 | |||
| Appendix C. Changes from previous RFCs . . . . . . . . . . . . . 48 | Appendix C. Changes from previous RFCs . . . . . . . . . . . . . 48 | |||
| C.1. Changes from HTTP/0.9 . . . . . . . . . . . . . . . . . . 48 | C.1. Changes from HTTP/0.9 . . . . . . . . . . . . . . . . . . 48 | |||
| C.2. Changes from HTTP/1.0 . . . . . . . . . . . . . . . . . . 48 | C.2. Changes from HTTP/1.0 . . . . . . . . . . . . . . . . . . 48 | |||
| C.2.1. Multihomed Web Servers . . . . . . . . . . . . . . . 48 | C.2.1. Multihomed Web Servers . . . . . . . . . . . . . . . 48 | |||
| C.2.2. Keep-Alive Connections . . . . . . . . . . . . . . . 49 | C.2.2. Keep-Alive Connections . . . . . . . . . . . . . . . 49 | |||
| C.2.3. Introduction of Transfer-Encoding . . . . . . . . . . 49 | C.2.3. Introduction of Transfer-Encoding . . . . . . . . . . 49 | |||
| C.3. Changes from RFC 7230 . . . . . . . . . . . . . . . . . . 49 | C.3. Changes from RFC 7230 . . . . . . . . . . . . . . . . . . 50 | |||
| Appendix D. Change Log . . . . . . . . . . . . . . . . . . . . . 50 | Appendix D. Change Log . . . . . . . . . . . . . . . . . . . . . 50 | |||
| D.1. Between RFC7230 and draft 00 . . . . . . . . . . . . . . 50 | D.1. Between RFC7230 and draft 00 . . . . . . . . . . . . . . 50 | |||
| D.2. Since draft-ietf-httpbis-messaging-00 . . . . . . . . . . 51 | D.2. Since draft-ietf-httpbis-messaging-00 . . . . . . . . . . 51 | |||
| D.3. Since draft-ietf-httpbis-messaging-01 . . . . . . . . . . 51 | D.3. Since draft-ietf-httpbis-messaging-01 . . . . . . . . . . 51 | |||
| D.4. Since draft-ietf-httpbis-messaging-02 . . . . . . . . . . 52 | D.4. Since draft-ietf-httpbis-messaging-02 . . . . . . . . . . 52 | |||
| D.5. Since draft-ietf-httpbis-messaging-03 . . . . . . . . . . 52 | D.5. Since draft-ietf-httpbis-messaging-03 . . . . . . . . . . 52 | |||
| D.6. Since draft-ietf-httpbis-messaging-04 . . . . . . . . . . 52 | D.6. Since draft-ietf-httpbis-messaging-04 . . . . . . . . . . 52 | |||
| D.7. Since draft-ietf-httpbis-messaging-05 . . . . . . . . . . 52 | D.7. Since draft-ietf-httpbis-messaging-05 . . . . . . . . . . 53 | |||
| D.8. Since draft-ietf-httpbis-messaging-06 . . . . . . . . . . 53 | D.8. Since draft-ietf-httpbis-messaging-06 . . . . . . . . . . 53 | |||
| D.9. Since draft-ietf-httpbis-messaging-07 . . . . . . . . . . 53 | D.9. Since draft-ietf-httpbis-messaging-07 . . . . . . . . . . 53 | |||
| D.10. Since draft-ietf-httpbis-messaging-08 . . . . . . . . . . 54 | D.10. Since draft-ietf-httpbis-messaging-08 . . . . . . . . . . 54 | |||
| D.11. Since draft-ietf-httpbis-messaging-09 . . . . . . . . . . 54 | D.11. Since draft-ietf-httpbis-messaging-09 . . . . . . . . . . 54 | |||
| D.12. Since draft-ietf-httpbis-messaging-10 . . . . . . . . . . 54 | D.12. Since draft-ietf-httpbis-messaging-10 . . . . . . . . . . 54 | |||
| D.13. Since draft-ietf-httpbis-messaging-11 . . . . . . . . . . 54 | D.13. Since draft-ietf-httpbis-messaging-11 . . . . . . . . . . 55 | |||
| D.14. Since draft-ietf-httpbis-messaging-12 . . . . . . . . . . 55 | D.14. Since draft-ietf-httpbis-messaging-12 . . . . . . . . . . 55 | |||
| D.15. Since draft-ietf-httpbis-messaging-13 . . . . . . . . . . 55 | D.15. Since draft-ietf-httpbis-messaging-13 . . . . . . . . . . 55 | |||
| D.16. Since draft-ietf-httpbis-messaging-14 . . . . . . . . . . 55 | D.16. Since draft-ietf-httpbis-messaging-14 . . . . . . . . . . 55 | |||
| D.17. Since draft-ietf-httpbis-messaging-15 . . . . . . . . . . 56 | D.17. Since draft-ietf-httpbis-messaging-15 . . . . . . . . . . 56 | |||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 56 | D.18. Since draft-ietf-httpbis-messaging-16 . . . . . . . . . . 56 | |||
| Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 | Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 56 | |||
| Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 59 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 59 | |||
| 1. Introduction | 1. Introduction | |||
| The Hypertext Transfer Protocol (HTTP) is a stateless application- | The Hypertext Transfer Protocol (HTTP) is a stateless application- | |||
| level request/response protocol that uses extensible semantics and | level request/response protocol that uses extensible semantics and | |||
| self-descriptive messages for flexible interaction with network-based | self-descriptive messages for flexible interaction with network-based | |||
| hypertext information systems. HTTP/1.1 is defined by: | hypertext information systems. HTTP/1.1 is defined by: | |||
| * This document | * This document | |||
| * "HTTP Semantics" [Semantics] | * "HTTP Semantics" [HTTP] | |||
| * "HTTP Caching" [Caching] | * "HTTP Caching" [CACHING] | |||
| This document specifies how HTTP semantics are conveyed using the | This document specifies how HTTP semantics are conveyed using the | |||
| HTTP/1.1 message syntax, framing and connection management | HTTP/1.1 message syntax, framing and connection management | |||
| mechanisms. Its goal is to define the complete set of requirements | mechanisms. Its goal is to define the complete set of requirements | |||
| for HTTP/1.1 message parsers and message-forwarding intermediaries. | for HTTP/1.1 message parsers and message-forwarding intermediaries. | |||
| This document obsoletes the portions of RFC 7230 related to HTTP/1.1 | This document obsoletes the portions of RFC 7230 related to HTTP/1.1 | |||
| messaging and connection management, with the changes being | messaging and connection management, with the changes being | |||
| summarized in Appendix C.3. The other parts of RFC 7230 are | summarized in Appendix C.3. The other parts of RFC 7230 are | |||
| obsoleted by "HTTP Semantics" [Semantics]. | obsoleted by "HTTP Semantics" [HTTP]. | |||
| 1.1. Requirements Notation | 1.1. 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", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| "OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
| 14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
| capitals, as shown here. | capitals, as shown here. | |||
| Conformance criteria and considerations regarding error handling are | Conformance criteria and considerations regarding error handling are | |||
| defined in Section 2 of [Semantics]. | defined in Section 2 of [HTTP]. | |||
| 1.2. Syntax Notation | 1.2. Syntax Notation | |||
| This specification uses the Augmented Backus-Naur Form (ABNF) | This specification uses the Augmented Backus-Naur Form (ABNF) | |||
| notation of [RFC5234], extended with the notation for case- | notation of [RFC5234], extended with the notation for case- | |||
| sensitivity in strings defined in [RFC7405]. | sensitivity in strings defined in [RFC7405]. | |||
| It also uses a list extension, defined in Section 5.6.1 of | It also uses a list extension, defined in Section 5.6.1 of [HTTP], | |||
| [Semantics], that allows for compact definition of comma-separated | that allows for compact definition of comma-separated lists using a | |||
| lists using a '#' operator (similar to how the '*' operator indicates | '#' operator (similar to how the '*' operator indicates repetition). | |||
| repetition). Appendix A shows the collected grammar with all list | Appendix A shows the collected grammar with all list operators | |||
| operators expanded to standard ABNF notation. | 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 | |||
| [RFC5234], Appendix B.1: ALPHA (letters), CR (carriage return), CRLF | [RFC5234], Appendix B.1: ALPHA (letters), CR (carriage return), CRLF | |||
| (CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double quote), | (CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double quote), | |||
| HEXDIG (hexadecimal 0-9/A-F/a-f), HTAB (horizontal tab), LF (line | HEXDIG (hexadecimal 0-9/A-F/a-f), HTAB (horizontal tab), LF (line | |||
| feed), OCTET (any 8-bit sequence of data), SP (space), and VCHAR (any | feed), OCTET (any 8-bit sequence of data), SP (space), and VCHAR (any | |||
| visible [USASCII] character). | visible [USASCII] character). | |||
| The rules below are defined in [Semantics]: | The rules below are defined in [HTTP]: | |||
| BWS = <BWS, see [Semantics], Section 5.6.3> | BWS = <BWS, see [HTTP], Section 5.6.3> | |||
| OWS = <OWS, see [Semantics], Section 5.6.3> | OWS = <OWS, see [HTTP], Section 5.6.3> | |||
| RWS = <RWS, see [Semantics], Section 5.6.3> | RWS = <RWS, see [HTTP], Section 5.6.3> | |||
| absolute-path = <absolute-path, see [Semantics], Section 4> | absolute-path = <absolute-path, see [HTTP], Section 4> | |||
| field-name = <field-name, see [Semantics], Section 5.1> | field-name = <field-name, see [HTTP], Section 5.1> | |||
| field-value = <field-value, see [Semantics], Section 5.5> | field-value = <field-value, see [HTTP], Section 5.5> | |||
| obs-text = <obs-text, see [Semantics], Section 5.6.4> | obs-text = <obs-text, see [HTTP], Section 5.6.4> | |||
| quoted-string = <quoted-string, see [Semantics], Section 5.6.4> | quoted-string = <quoted-string, see [HTTP], Section 5.6.4> | |||
| token = <token, see [Semantics], Section 5.6.2> | token = <token, see [HTTP], Section 5.6.2> | |||
| transfer-coding = | transfer-coding = | |||
| <transfer-coding, see [Semantics], Section 10.1.4> | <transfer-coding, see [HTTP], Section 10.1.4> | |||
| The rules below are defined in [RFC3986]: | The rules below are defined in [URI]: | |||
| absolute-URI = <absolute-URI, see [RFC3986], Section 4.3> | absolute-URI = <absolute-URI, see [URI], Section 4.3> | |||
| authority = <authority, see [RFC3986], Section 3.2> | authority = <authority, see [URI], Section 3.2> | |||
| uri-host = <host, see [RFC3986], Section 3.2.2> | uri-host = <host, see [URI], Section 3.2.2> | |||
| port = <port, see [RFC3986], Section 3.2.3> | port = <port, see [URI], Section 3.2.3> | |||
| query = <query, see [RFC3986], Section 3.4> | query = <query, see [URI], Section 3.4> | |||
| 2. Message | 2. Message | |||
| HTTP/1.1 communication consists of sending stateless request and | ||||
| response messages across a connection. See Section 3 of [HTTP] for | ||||
| the general terminology and core concepts of HTTP. | ||||
| 2.1. Message Format | 2.1. Message Format | |||
| An HTTP/1.1 message consists of a start-line followed by a CRLF and a | An HTTP/1.1 message consists of a start-line followed by a CRLF and a | |||
| sequence of octets in a format similar to the Internet Message Format | sequence of octets in a format similar to the Internet Message Format | |||
| [RFC5322]: zero or more header field lines (collectively referred to | [RFC5322]: zero or more header field lines (collectively referred to | |||
| as the "headers" or the "header section"), an empty line indicating | as the "headers" or the "header section"), an empty line indicating | |||
| the end of the header section, and an optional message body. | the end of the header section, and an optional message body. | |||
| HTTP-message = start-line CRLF | HTTP-message = start-line CRLF | |||
| *( field-line CRLF ) | *( field-line CRLF ) | |||
| skipping to change at page 7, line 5 ¶ | skipping to change at page 7, line 11 ¶ | |||
| determining the length of the message body (Section 6). | determining the length of the message body (Section 6). | |||
| start-line = request-line / status-line | start-line = request-line / status-line | |||
| In theory, a client could receive requests and a server could receive | In theory, a client could receive requests and a server could receive | |||
| responses, distinguishing them by their different start-line formats. | responses, distinguishing them by their different start-line formats. | |||
| In practice, servers are implemented to only expect a request (a | In practice, servers are implemented to only expect a request (a | |||
| response is interpreted as an unknown or invalid request method) and | response is interpreted as an unknown or invalid request method) and | |||
| clients are implemented to only expect a response. | clients are implemented to only expect a response. | |||
| Although HTTP makes use of some protocol elements similar to the | HTTP makes use of some protocol elements similar to the Multipurpose | |||
| Multipurpose Internet Mail Extensions (MIME) [RFC2045], see | Internet Mail Extensions (MIME) [RFC2045]. See Appendix B for the | |||
| Appendix B for the differences between HTTP and MIME messages. | differences between HTTP and MIME messages. | |||
| 2.2. Message Parsing | 2.2. Message Parsing | |||
| The normal procedure for parsing an HTTP message is to read the | The normal procedure for parsing an HTTP message is to read the | |||
| start-line into a structure, read each header field line into a hash | start-line into a structure, read each header field line into a hash | |||
| table by field name until the empty line, and then use the parsed | table by field name until the empty line, and then use the parsed | |||
| data to determine if a message body is expected. If a message body | data to determine if a message body is expected. If a message body | |||
| has been indicated, then it is read as a stream until an amount of | has been indicated, then it is read as a stream until an amount of | |||
| octets equal to the message body length is read or the connection is | octets equal to the message body length is read or the connection is | |||
| closed. | closed. | |||
| skipping to change at page 8, line 32 ¶ | skipping to change at page 8, line 36 ¶ | |||
| what appears from the start-line to be an HTTP request message, | what appears from the start-line to be an HTTP request message, | |||
| receives a sequence of octets that does not match the HTTP-message | receives a sequence of octets that does not match the HTTP-message | |||
| grammar aside from the robustness exceptions listed above, the server | grammar aside from the robustness exceptions listed above, the server | |||
| SHOULD respond with a 400 (Bad Request) response and close the | SHOULD respond with a 400 (Bad Request) response and close the | |||
| connection. | connection. | |||
| 2.3. HTTP Version | 2.3. HTTP Version | |||
| HTTP uses a "<major>.<minor>" numbering scheme to indicate versions | HTTP uses a "<major>.<minor>" numbering scheme to indicate versions | |||
| of the protocol. This specification defines version "1.1". | of the protocol. This specification defines version "1.1". | |||
| Section 2.5 of [Semantics] specifies the semantics of HTTP version | Section 2.5 of [HTTP] specifies the semantics of HTTP version | |||
| numbers. | numbers. | |||
| The version of an HTTP/1.x message is indicated by an HTTP-version | The version of an HTTP/1.x message is indicated by an HTTP-version | |||
| field in the start-line. HTTP-version is case-sensitive. | field in the start-line. HTTP-version is case-sensitive. | |||
| HTTP-version = HTTP-name "/" DIGIT "." DIGIT | HTTP-version = HTTP-name "/" DIGIT "." DIGIT | |||
| HTTP-name = %s"HTTP" | HTTP-name = %s"HTTP" | |||
| When an HTTP/1.1 message is sent to an HTTP/1.0 recipient [RFC1945] | When an HTTP/1.1 message is sent to an HTTP/1.0 recipient [HTTP/1.0] | |||
| or a recipient whose version is unknown, the HTTP/1.1 message is | or a recipient whose version is unknown, the HTTP/1.1 message is | |||
| constructed such that it can be interpreted as a valid HTTP/1.0 | constructed such that it can be interpreted as a valid HTTP/1.0 | |||
| message if all of the newer features are ignored. This specification | message if all of the newer features are ignored. This specification | |||
| places recipient-version requirements on some new features so that a | places recipient-version requirements on some new features so that a | |||
| conformant sender will only use compatible features until it has | conformant sender will only use compatible features until it has | |||
| determined, through configuration or the receipt of a message, that | determined, through configuration or the receipt of a message, that | |||
| the recipient supports HTTP/1.1. | the recipient supports HTTP/1.1. | |||
| Intermediaries that process HTTP messages (i.e., all intermediaries | Intermediaries that process HTTP messages (i.e., all intermediaries | |||
| other than those acting as tunnels) MUST send their own HTTP-version | other than those acting as tunnels) MUST send their own HTTP-version | |||
| skipping to change at page 9, line 44 ¶ | skipping to change at page 9, line 48 ¶ | |||
| instead parse on whitespace-delimited word boundaries and, aside from | instead parse on whitespace-delimited word boundaries and, aside from | |||
| the CRLF terminator, treat any form of whitespace as the SP separator | the CRLF terminator, treat any form of whitespace as the SP separator | |||
| while ignoring preceding or trailing whitespace; such whitespace | while ignoring preceding or trailing whitespace; such whitespace | |||
| includes one or more of the following octets: SP, HTAB, VT (%x0B), FF | includes one or more of the following octets: SP, HTAB, VT (%x0B), FF | |||
| (%x0C), or bare CR. However, lenient parsing can result in request | (%x0C), or bare CR. However, lenient parsing can result in request | |||
| smuggling security vulnerabilities if there are multiple recipients | smuggling security vulnerabilities if there are multiple recipients | |||
| of the message and each has its own unique interpretation of | of the message and each has its own unique interpretation of | |||
| robustness (see Section 11.2). | robustness (see Section 11.2). | |||
| HTTP does not place a predefined limit on the length of a request- | HTTP does not place a predefined limit on the length of a request- | |||
| line, as described in Section 2 of [Semantics]. A server that | line, as described in Section 2 of [HTTP]. A server that receives a | |||
| receives a method longer than any that it implements SHOULD respond | method longer than any that it implements SHOULD respond with a 501 | |||
| with a 501 (Not Implemented) status code. A server that receives a | (Not Implemented) status code. A server that receives a request- | |||
| request-target longer than any URI it wishes to parse MUST respond | target longer than any URI it wishes to parse MUST respond with a 414 | |||
| with a 414 (URI Too Long) status code (see Section 15.5.15 of | (URI Too Long) status code (see Section 15.5.15 of [HTTP]). | |||
| [Semantics]). | ||||
| Various ad hoc limitations on request-line length are found in | Various ad hoc limitations on request-line length are found in | |||
| practice. It is RECOMMENDED that all HTTP senders and recipients | practice. It is RECOMMENDED that all HTTP senders and recipients | |||
| support, at a minimum, request-line lengths of 8000 octets. | support, at a minimum, request-line lengths of 8000 octets. | |||
| 3.1. Method | 3.1. Method | |||
| The method token indicates the request method to be performed on the | The method token indicates the request method to be performed on the | |||
| target resource. The request method is case-sensitive. | target resource. The request method is case-sensitive. | |||
| method = token | method = token | |||
| The request methods defined by this specification can be found in | The request methods defined by this specification can be found in | |||
| Section 9 of [Semantics], along with information regarding the HTTP | Section 9 of [HTTP], along with information regarding the HTTP method | |||
| method registry and considerations for defining new methods. | registry and considerations for defining new methods. | |||
| 3.2. Request Target | 3.2. Request Target | |||
| The request-target identifies the target resource upon which to apply | The request-target identifies the target resource upon which to apply | |||
| the request. The client derives a request-target from its desired | the request. The client derives a request-target from its desired | |||
| target URI. There are four distinct formats for the request-target, | target URI. There are four distinct formats for the request-target, | |||
| depending on both the method being requested and whether the request | depending on both the method being requested and whether the request | |||
| is to a proxy. | is to a proxy. | |||
| request-target = origin-form | request-target = origin-form | |||
| skipping to change at page 10, line 49 ¶ | skipping to change at page 10, line 49 ¶ | |||
| 400 (Bad Request) error or a 301 (Moved Permanently) redirect with | 400 (Bad Request) error or a 301 (Moved Permanently) redirect with | |||
| the request-target properly encoded. A recipient SHOULD NOT attempt | the request-target properly encoded. A recipient SHOULD NOT attempt | |||
| to autocorrect and then process the request without a redirect, since | to autocorrect and then process the request without a redirect, since | |||
| the invalid request-line might be deliberately crafted to bypass | the invalid request-line might be deliberately crafted to bypass | |||
| security filters along the request chain. | security filters along the request chain. | |||
| A client MUST send a Host header field in all HTTP/1.1 request | A client MUST send a Host header field in all HTTP/1.1 request | |||
| messages. If the target URI includes an authority component, then a | messages. If the target URI includes an authority component, then a | |||
| client MUST send a field value for Host that is identical to that | client MUST send a field value for Host that is identical to that | |||
| authority component, excluding any userinfo subcomponent and its "@" | authority component, excluding any userinfo subcomponent and its "@" | |||
| delimiter (Section 4.2.1 of [Semantics]). If the authority component | delimiter (Section 4.2.1 of [HTTP]). If the authority component is | |||
| is missing or undefined for the target URI, then a client MUST send a | missing or undefined for the target URI, then a client MUST send a | |||
| Host header field with an empty field value. | Host header field with an empty field value. | |||
| A server MUST respond with a 400 (Bad Request) status code to any | A server MUST respond with a 400 (Bad Request) status code to any | |||
| HTTP/1.1 request message that lacks a Host header field and to any | HTTP/1.1 request message that lacks a Host header field and to any | |||
| request message that contains more than one Host header field line or | request message that contains more than one Host header field line or | |||
| a Host header field with an invalid field value. | a Host header field with an invalid field value. | |||
| 3.2.1. origin-form | 3.2.1. origin-form | |||
| The most common form of request-target is the _origin-form_. | The most common form of request-target is the _origin-form_. | |||
| origin-form = absolute-path [ "?" query ] | origin-form = absolute-path [ "?" query ] | |||
| When making a request directly to an origin server, other than a | When making a request directly to an origin server, other than a | |||
| CONNECT or server-wide OPTIONS request (as detailed below), a client | CONNECT or server-wide OPTIONS request (as detailed below), a client | |||
| MUST send only the absolute path and query components of the target | MUST send only the absolute path and query components of the target | |||
| URI as the request-target. If the target URI's path component is | URI as the request-target. If the target URI's path component is | |||
| empty, the client MUST send "/" as the path within the origin-form of | empty, the client MUST send "/" as the path within the origin-form of | |||
| request-target. A Host header field is also sent, as defined in | request-target. A Host header field is also sent, as defined in | |||
| Section 7.2 of [Semantics]. | Section 7.2 of [HTTP]. | |||
| For example, a client wishing to retrieve a representation of the | For example, a client wishing to retrieve a representation of the | |||
| resource identified as | resource identified as | |||
| http://www.example.org/where?q=now | http://www.example.org/where?q=now | |||
| directly from the origin server would open (or reuse) a TCP | directly from the origin server would open (or reuse) a TCP | |||
| connection to port 80 of the host "www.example.org" and send the | connection to port 80 of the host "www.example.org" and send the | |||
| lines: | lines: | |||
| skipping to change at page 11, line 50 ¶ | skipping to change at page 11, line 50 ¶ | |||
| When making a request to a proxy, other than a CONNECT or server-wide | When making a request to a proxy, other than a CONNECT or server-wide | |||
| OPTIONS request (as detailed below), a client MUST send the target | OPTIONS request (as detailed below), a client MUST send the target | |||
| URI in _absolute-form_ as the request-target. | URI in _absolute-form_ as the request-target. | |||
| absolute-form = absolute-URI | absolute-form = absolute-URI | |||
| The proxy is requested to either service that request from a valid | The proxy is requested to either service that request from a valid | |||
| cache, if possible, or make the same request on the client's behalf | cache, if possible, or make the same request on the client's behalf | |||
| to either the next inbound proxy server or directly to the origin | to either the next inbound proxy server or directly to the origin | |||
| server indicated by the request-target. Requirements on such | server indicated by the request-target. Requirements on such | |||
| "forwarding" of messages are defined in Section 7.6 of [Semantics]. | "forwarding" of messages are defined in Section 7.6 of [HTTP]. | |||
| An example absolute-form of request-line would be: | An example absolute-form of request-line would be: | |||
| GET http://www.example.org/pub/WWW/TheProject.html HTTP/1.1 | GET http://www.example.org/pub/WWW/TheProject.html HTTP/1.1 | |||
| A client MUST send a Host header field in an HTTP/1.1 request even if | A client MUST send a Host header field in an HTTP/1.1 request even if | |||
| the request-target is in the absolute-form, since this allows the | the request-target is in the absolute-form, since this allows the | |||
| Host information to be forwarded through ancient HTTP/1.0 proxies | Host information to be forwarded through ancient HTTP/1.0 proxies | |||
| that might not have implemented Host. | that might not have implemented Host. | |||
| skipping to change at page 12, line 26 ¶ | skipping to change at page 12, line 26 ¶ | |||
| Host field value based on the received request-target rather than | Host field value based on the received request-target rather than | |||
| forward the received Host field value. | forward the received Host field value. | |||
| When an origin server receives a request with an absolute-form of | When an origin server receives a request with an absolute-form of | |||
| request-target, the origin server MUST ignore the received Host | request-target, the origin server MUST ignore the received Host | |||
| header field (if any) and instead use the host information of the | header field (if any) and instead use the host information of the | |||
| request-target. Note that if the request-target does not have an | request-target. Note that if the request-target does not have an | |||
| authority component, an empty Host header field will be sent in this | authority component, an empty Host header field will be sent in this | |||
| case. | case. | |||
| To allow for transition to the absolute-form for all requests in some | A server MUST accept the absolute-form in requests even though most | |||
| future version of HTTP, a server MUST accept the absolute-form in | HTTP/1.1 clients will only send the absolute-form to a proxy. | |||
| requests, even though HTTP/1.1 clients will only send them in | ||||
| requests to proxies. | ||||
| 3.2.3. authority-form | 3.2.3. authority-form | |||
| The _authority-form_ of request-target is only used for CONNECT | The _authority-form_ of request-target is only used for CONNECT | |||
| requests (Section 9.3.6 of [Semantics]). It consists of only the | requests (Section 9.3.6 of [HTTP]). It consists of only the uri-host | |||
| uri-host and port number of the tunnel destination, separated by a | and port number of the tunnel destination, separated by a colon | |||
| colon (":"). | (":"). | |||
| authority-form = uri-host ":" port | authority-form = uri-host ":" port | |||
| When making a CONNECT request to establish a tunnel through one or | When making a CONNECT request to establish a tunnel through one or | |||
| more proxies, a client MUST send only the host and port of the tunnel | more proxies, a client MUST send only the host and port of the tunnel | |||
| destination as the request-target. The client obtains the host and | destination as the request-target. The client obtains the host and | |||
| port from the target URI's authority component, except that it sends | port from the target URI's authority component, except that it sends | |||
| the scheme's default port if the target URI elides the port. For | the scheme's default port if the target URI elides the port. For | |||
| example, a CONNECT request to "http://www.example.com" looks like | example, a CONNECT request to "http://www.example.com" looks like | |||
| CONNECT www.example.com:80 HTTP/1.1 | CONNECT www.example.com:80 HTTP/1.1 | |||
| Host: www.example.com | Host: www.example.com | |||
| 3.2.4. asterisk-form | 3.2.4. asterisk-form | |||
| The _asterisk-form_ of request-target is only used for a server-wide | The _asterisk-form_ of request-target is only used for a server-wide | |||
| OPTIONS request (Section 9.3.7 of [Semantics]). | OPTIONS request (Section 9.3.7 of [HTTP]). | |||
| asterisk-form = "*" | asterisk-form = "*" | |||
| When a client wishes to request OPTIONS for the server as a whole, as | When a client wishes to request OPTIONS for the server as a whole, as | |||
| opposed to a specific named resource of that server, the client MUST | opposed to a specific named resource of that server, the client MUST | |||
| send only "*" (%x2A) as the request-target. For example, | send only "*" (%x2A) as the request-target. For example, | |||
| OPTIONS * HTTP/1.1 | OPTIONS * HTTP/1.1 | |||
| If a proxy receives an OPTIONS request with an absolute-form of | If a proxy receives an OPTIONS request with an absolute-form of | |||
| skipping to change at page 13, line 43 ¶ | skipping to change at page 13, line 38 ¶ | |||
| after connecting to port 8001 of host "www.example.org". | after connecting to port 8001 of host "www.example.org". | |||
| 3.3. Reconstructing the Target URI | 3.3. Reconstructing the Target URI | |||
| The target URI is the request-target when the request-target is in | The target URI is the request-target when the request-target is in | |||
| absolute-form. In that case, a server will parse the URI into its | absolute-form. In that case, a server will parse the URI into its | |||
| generic components for further evaluation. | generic components for further evaluation. | |||
| Otherwise, the server reconstructs the target URI from the connection | Otherwise, the server reconstructs the target URI from the connection | |||
| context and various parts of the request message in order to identify | context and various parts of the request message in order to identify | |||
| the target resource (Section 7.1 of [Semantics]): | the target resource (Section 7.1 of [HTTP]): | |||
| * If the server's configuration provides for a fixed URI scheme, or | * If the server's configuration provides for a fixed URI scheme, or | |||
| a scheme is provided by a trusted outbound gateway, that scheme is | a scheme is provided by a trusted outbound gateway, that scheme is | |||
| used for the target URI. This is common in large-scale | used for the target URI. This is common in large-scale | |||
| deployments because a gateway server will receive the client's | deployments because a gateway server will receive the client's | |||
| connection context and replace that with their own connection to | connection context and replace that with their own connection to | |||
| the inbound server. Otherwise, if the request is received over a | the inbound server. Otherwise, if the request is received over a | |||
| secured connection, the target URI's scheme is "https"; if not, | secured connection, the target URI's scheme is "https"; if not, | |||
| the scheme is "http". | the scheme is "http". | |||
| skipping to change at page 15, line 12 ¶ | skipping to change at page 15, line 12 ¶ | |||
| the user agent's intended authority might differ from the selected | the user agent's intended authority might differ from the selected | |||
| default. A server that can uniquely identify an authority from the | default. A server that can uniquely identify an authority from the | |||
| request context MAY use that identity as a default without this risk. | request context MAY use that identity as a default without this risk. | |||
| Alternatively, it might be better to redirect the request to a safe | Alternatively, it might be better to redirect the request to a safe | |||
| resource that explains how to obtain a new client. | resource that explains how to obtain a new client. | |||
| Note that reconstructing the client's target URI is only half of the | Note that reconstructing the client's target URI is only half of the | |||
| process for identifying a target resource. The other half is | process for identifying a target resource. The other half is | |||
| determining whether that target URI identifies a resource for which | determining whether that target URI identifies a resource for which | |||
| the server is willing and able to send a response, as defined in | the server is willing and able to send a response, as defined in | |||
| Section 7.4 of [Semantics]. | Section 7.4 of [HTTP]. | |||
| 4. Status Line | 4. Status Line | |||
| The first line of a response message is the status-line, consisting | The first line of a response message is the status-line, consisting | |||
| of the protocol version, a space (SP), the status code, another | of the protocol version, a space (SP), the status code, another | |||
| space, and ending with an OPTIONAL textual phrase describing the | space, and ending with an OPTIONAL textual phrase describing the | |||
| status code. | status code. | |||
| status-line = HTTP-version SP status-code SP [reason-phrase] | status-line = HTTP-version SP status-code SP [reason-phrase] | |||
| skipping to change at page 15, line 38 ¶ | skipping to change at page 15, line 38 ¶ | |||
| includes one or more of the following octets: SP, HTAB, VT (%x0B), FF | includes one or more of the following octets: SP, HTAB, VT (%x0B), FF | |||
| (%x0C), or bare CR. However, lenient parsing can result in response | (%x0C), or bare CR. However, lenient parsing can result in response | |||
| splitting security vulnerabilities if there are multiple recipients | splitting security vulnerabilities if there are multiple recipients | |||
| of the message and each has its own unique interpretation of | of the message and each has its own unique interpretation of | |||
| robustness (see Section 11.1). | robustness (see Section 11.1). | |||
| The status-code element is a 3-digit integer code describing the | The status-code element is a 3-digit integer code describing the | |||
| result of the server's attempt to understand and satisfy the client's | result of the server's attempt to understand and satisfy the client's | |||
| corresponding request. The rest of the response message is to be | corresponding request. The rest of the response message is to be | |||
| interpreted in light of the semantics defined for that status code. | interpreted in light of the semantics defined for that status code. | |||
| See Section 15 of [Semantics] for information about the semantics of | See Section 15 of [HTTP] for information about the semantics of | |||
| status codes, including the classes of status code (indicated by the | status codes, including the classes of status code (indicated by the | |||
| first digit), the status codes defined by this specification, | first digit), the status codes defined by this specification, | |||
| considerations for the definition of new status codes, and the IANA | considerations for the definition of new status codes, and the IANA | |||
| registry. | registry. | |||
| status-code = 3DIGIT | status-code = 3DIGIT | |||
| The reason-phrase element exists for the sole purpose of providing a | The reason-phrase element exists for the sole purpose of providing a | |||
| textual description associated with the numeric status code, mostly | textual description associated with the numeric status code, mostly | |||
| out of deference to earlier Internet application protocols that were | out of deference to earlier Internet application protocols that were | |||
| skipping to change at page 16, line 22 ¶ | skipping to change at page 16, line 22 ¶ | |||
| 5. Field Syntax | 5. Field Syntax | |||
| Each field line consists of a case-insensitive field name followed by | Each field line consists of a case-insensitive field name followed by | |||
| a colon (":"), optional leading whitespace, the field line value, and | a colon (":"), optional leading whitespace, the field line value, and | |||
| optional trailing whitespace. | optional trailing whitespace. | |||
| field-line = field-name ":" OWS field-value OWS | field-line = field-name ":" OWS field-value OWS | |||
| Most HTTP field names and the rules for parsing within field values | Most HTTP field names and the rules for parsing within field values | |||
| are defined in Section 6.3 of [Semantics]. This section covers the | are defined in Section 6.3 of [HTTP]. This section covers the | |||
| generic syntax for header field inclusion within, and extraction | generic syntax for header field inclusion within, and extraction | |||
| from, HTTP/1.1 messages. | from, HTTP/1.1 messages. | |||
| 5.1. Field Line Parsing | 5.1. Field Line Parsing | |||
| Messages are parsed using a generic algorithm, independent of the | Messages are parsed using a generic algorithm, independent of the | |||
| individual field names. The contents within a given field line value | individual field names. The contents within a given field line value | |||
| are not parsed until a later stage of message interpretation (usually | are not parsed until a later stage of message interpretation (usually | |||
| after the message's entire field section has been processed). | after the message's entire field section has been processed). | |||
| skipping to change at page 17, line 43 ¶ | skipping to change at page 17, line 43 ¶ | |||
| message downstream. | message downstream. | |||
| A user agent that receives an obs-fold in a response message that is | A user agent that receives an obs-fold in a response message that is | |||
| not within a message/http container MUST replace each received | not within a message/http container MUST replace each received | |||
| obs-fold with one or more SP octets prior to interpreting the field | obs-fold with one or more SP octets prior to interpreting the field | |||
| value. | value. | |||
| 6. Message Body | 6. Message Body | |||
| The message body (if any) of an HTTP/1.1 message is used to carry | The message body (if any) of an HTTP/1.1 message is used to carry | |||
| content (Section 6.4 of [Semantics]) for the request or response. | content (Section 6.4 of [HTTP]) for the request or response. The | |||
| The message body is identical to the content unless a transfer coding | message body is identical to the content unless a transfer coding has | |||
| has been applied, as described in Section 6.1. | been applied, as described in Section 6.1. | |||
| message-body = *OCTET | message-body = *OCTET | |||
| The rules for determining when a message body is present in an | The rules for determining when a message body is present in an | |||
| HTTP/1.1 message differ for requests and responses. | HTTP/1.1 message differ for requests and responses. | |||
| The presence of a message body in a request is signaled by a | The presence of a message body in a request is signaled by a | |||
| Content-Length or Transfer-Encoding header field. Request message | Content-Length or Transfer-Encoding header field. Request message | |||
| framing is independent of method semantics. | framing is independent of method semantics. | |||
| The presence of a message body in a response depends on both the | The presence of a message body in a response depends on both the | |||
| request method to which it is responding and the response status code | request method to which it is responding and the response status code | |||
| (Section 4), and corresponds to when content is allowed; see | (Section 4), and corresponds to when content is allowed; see | |||
| Section 6.4 of [Semantics]. | Section 6.4 of [HTTP]. | |||
| 6.1. Transfer-Encoding | 6.1. Transfer-Encoding | |||
| The Transfer-Encoding header field lists the transfer coding names | The Transfer-Encoding header field lists the transfer coding names | |||
| corresponding to the sequence of transfer codings that have been (or | corresponding to the sequence of transfer codings that have been (or | |||
| will be) applied to the content in order to form the message body. | will be) applied to the content in order to form the message body. | |||
| Transfer codings are defined in Section 7. | Transfer codings are defined in Section 7. | |||
| Transfer-Encoding = #transfer-coding | Transfer-Encoding = #transfer-coding | |||
| ; defined in [Semantics], Section 10.1.4 | ; defined in [HTTP], Section 10.1.4 | |||
| Transfer-Encoding is analogous to the Content-Transfer-Encoding field | Transfer-Encoding is analogous to the Content-Transfer-Encoding field | |||
| of MIME, which was designed to enable safe transport of binary data | of MIME, which was designed to enable safe transport of binary data | |||
| over a 7-bit transport service ([RFC2045], Section 6). However, safe | over a 7-bit transport service ([RFC2045], Section 6). However, safe | |||
| transport has a different focus for an 8bit-clean transfer protocol. | transport has a different focus for an 8bit-clean transfer protocol. | |||
| In HTTP's case, Transfer-Encoding is primarily intended to accurately | In HTTP's case, Transfer-Encoding is primarily intended to accurately | |||
| delimit dynamically generated content and to distinguish encodings | delimit dynamically generated content and to distinguish encodings | |||
| that are only applied for transport efficiency or security from those | that are only applied for transport efficiency or security from those | |||
| that are characteristics of the selected resource. | that are characteristics of the selected resource. | |||
| A recipient MUST be able to parse the chunked transfer coding | A recipient MUST be able to parse the chunked transfer coding | |||
| (Section 7.1) because it plays a crucial role in framing messages | (Section 7.1) because it plays a crucial role in framing messages | |||
| when the content size is not known in advance. A sender MUST NOT | when the content size is not known in advance. A sender MUST NOT | |||
| apply chunked more than once to a message body (i.e., chunking an | apply the chunked transfer coding more than once to a message body | |||
| already chunked message is not allowed). If any transfer coding | (i.e., chunking an already chunked message is not allowed). If any | |||
| other than chunked is applied to a request's content, the sender MUST | transfer coding other than chunked is applied to a request's content, | |||
| apply chunked as the final transfer coding to ensure that the message | the sender MUST apply chunked as the final transfer coding to ensure | |||
| is properly framed. If any transfer coding other than chunked is | that the message is properly framed. If any transfer coding other | |||
| applied to a response's content, the sender MUST either apply chunked | than chunked is applied to a response's content, the sender MUST | |||
| as the final transfer coding or terminate the message by closing the | either apply chunked as the final transfer coding or terminate the | |||
| connection. | message by closing the connection. | |||
| For example, | For example, | |||
| Transfer-Encoding: gzip, chunked | Transfer-Encoding: gzip, chunked | |||
| indicates that the content has been compressed using the gzip coding | indicates that the content has been compressed using the gzip coding | |||
| and then chunked using the chunked coding while forming the message | and then chunked using the chunked coding while forming the message | |||
| body. | body. | |||
| Unlike Content-Encoding (Section 8.4.1 of [Semantics]), Transfer- | Unlike Content-Encoding (Section 8.4.1 of [HTTP]), Transfer-Encoding | |||
| Encoding is a property of the message, not of the representation, and | is a property of the message, not of the representation, and any | |||
| any recipient along the request/response chain MAY decode the | recipient along the request/response chain MAY decode the received | |||
| received transfer coding(s) or apply additional transfer coding(s) to | transfer coding(s) or apply additional transfer coding(s) to the | |||
| the message body, assuming that corresponding changes are made to the | message body, assuming that corresponding changes are made to the | |||
| Transfer-Encoding field value. Additional information about the | Transfer-Encoding field value. Additional information about the | |||
| encoding parameters can be provided by other header fields not | encoding parameters can be provided by other header fields not | |||
| defined by this specification. | defined by this specification. | |||
| Transfer-Encoding MAY be sent in a response to a HEAD request or in a | Transfer-Encoding MAY be sent in a response to a HEAD request or in a | |||
| 304 (Not Modified) response (Section 15.4.5 of [Semantics]) to a GET | 304 (Not Modified) response (Section 15.4.5 of [HTTP]) to a GET | |||
| request, neither of which includes a message body, to indicate that | request, neither of which includes a message body, to indicate that | |||
| the origin server would have applied a transfer coding to the message | the origin server would have applied a transfer coding to the message | |||
| body if the request had been an unconditional GET. This indication | body if the request had been an unconditional GET. This indication | |||
| is not required, however, because any recipient on the response chain | is not required, however, because any recipient on the response chain | |||
| (including the origin server) can remove transfer codings when they | (including the origin server) can remove transfer codings when they | |||
| are not needed. | are not needed. | |||
| A server MUST NOT send a Transfer-Encoding header field in any | A server MUST NOT send a Transfer-Encoding header field in any | |||
| response with a status code of 1xx (Informational) or 204 (No | response with a status code of 1xx (Informational) or 204 (No | |||
| Content). A server MUST NOT send a Transfer-Encoding header field in | Content). A server MUST NOT send a Transfer-Encoding header field in | |||
| any 2xx (Successful) response to a CONNECT request (Section 9.3.6 of | any 2xx (Successful) response to a CONNECT request (Section 9.3.6 of | |||
| [Semantics]). | [HTTP]). | |||
| A server that receives a request message with a transfer coding it | ||||
| does not understand SHOULD respond with 501 (Not Implemented). | ||||
| Transfer-Encoding was added in HTTP/1.1. It is generally assumed | Transfer-Encoding was added in HTTP/1.1. It is generally assumed | |||
| that implementations advertising only HTTP/1.0 support will not | that implementations advertising only HTTP/1.0 support will not | |||
| understand how to process transfer-encoded content. A client MUST | understand how to process transfer-encoded content, and that an | |||
| NOT send a request containing Transfer-Encoding unless it knows the | HTTP/1.0 message received with a Transfer-Encoding is likely to have | |||
| server will handle HTTP/1.1 requests (or later minor revisions); such | been forwarded without proper handling of the chunked encoding in | |||
| knowledge might be in the form of specific user configuration or by | transit. | |||
| remembering the version of a prior received response. A server MUST | ||||
| NOT send a response containing Transfer-Encoding unless the | ||||
| corresponding request indicates HTTP/1.1 (or later minor revisions). | ||||
| A server that receives a request message with a transfer coding it | A client MUST NOT send a request containing Transfer-Encoding unless | |||
| does not understand SHOULD respond with 501 (Not Implemented). | it knows the server will handle HTTP/1.1 requests (or later minor | |||
| revisions); such knowledge might be in the form of specific user | ||||
| configuration or by remembering the version of a prior received | ||||
| response. A server MUST NOT send a response containing Transfer- | ||||
| Encoding unless the corresponding request indicates HTTP/1.1 (or | ||||
| later minor revisions). | ||||
| Early implementations of Transfer-Encoding would occasionally send | ||||
| both a chunked encoding for message framing and an estimated Content- | ||||
| Length header field for use by progress bars. This is why Transfer- | ||||
| Encoding is defined as overriding Content-Length, as opposed to them | ||||
| being mutually incompatible. Unfortunately, forwarding such a | ||||
| message can lead to vulnerabilities regarding request smuggling | ||||
| (Section 11.2) or response splitting (Section 11.1) attacks if any | ||||
| downstream recipient fails to parse the message according to this | ||||
| specification, particularly when a downstream recipient only | ||||
| implements HTTP/1.0. | ||||
| A server MAY reject a request that contains both Content-Length and | ||||
| Transfer-Encoding or process such a request in accordance with the | ||||
| Transfer-Encoding alone. Regardless, the server MUST close the | ||||
| connection after responding to such a request to avoid the potential | ||||
| attacks. | ||||
| A server or client that receives an HTTP/1.0 message containing a | ||||
| Transfer-Encoding header field MUST treat the message as if the | ||||
| framing is faulty, even if a Content-Length is present, and close the | ||||
| connection after processing the message. The message sender might | ||||
| have retained a portion of the message, in buffer, that could be | ||||
| misinterpreted by further use of the connection. | ||||
| 6.2. Content-Length | 6.2. Content-Length | |||
| When a message does not have a Transfer-Encoding header field, a | When a message does not have a Transfer-Encoding header field, a | |||
| Content-Length header field (Section 8.6 of [Semantics]) can provide | Content-Length header field (Section 8.6 of [HTTP]) can provide the | |||
| the anticipated size, as a decimal number of octets, for potential | anticipated size, as a decimal number of octets, for potential | |||
| content. For messages that do include content, the Content-Length | content. For messages that do include content, the Content-Length | |||
| field value provides the framing information necessary for | field value provides the framing information necessary for | |||
| determining where the data (and message) ends. For messages that do | determining where the data (and message) ends. For messages that do | |||
| not include content, the Content-Length indicates the size of the | not include content, the Content-Length indicates the size of the | |||
| selected representation (Section 8.6 of [Semantics]). | selected representation (Section 8.6 of [HTTP]). | |||
| A sender MUST NOT send a Content-Length header field in any message | A sender MUST NOT send a Content-Length header field in any message | |||
| that contains a Transfer-Encoding header field. | that contains a Transfer-Encoding header field. | |||
| | *Note:* HTTP's use of Content-Length for message framing | | *Note:* HTTP's use of Content-Length for message framing | |||
| | differs significantly from the same field's use in MIME, where | | differs significantly from the same field's use in MIME, where | |||
| | it is an optional field used only within the "message/external- | | it is an optional field used only within the "message/external- | |||
| | body" media-type. | | body" media-type. | |||
| 6.3. Message Body Length | 6.3. Message Body Length | |||
| skipping to change at page 21, line 15 ¶ | skipping to change at page 21, line 41 ¶ | |||
| If a Transfer-Encoding header field is present in a request and | If a Transfer-Encoding header field is present in a request and | |||
| the chunked transfer coding is not the final encoding, the | the chunked transfer coding is not the final encoding, the | |||
| message body length cannot be determined reliably; the server | message body length cannot be determined reliably; the server | |||
| MUST respond with the 400 (Bad Request) status code and then | MUST respond with the 400 (Bad Request) status code and then | |||
| close the connection. | close the connection. | |||
| 5. If a message is received without Transfer-Encoding and with an | 5. If a message is received without Transfer-Encoding and with an | |||
| invalid Content-Length header field, then the message framing is | invalid Content-Length header field, then the message framing is | |||
| invalid and the recipient MUST treat it as an unrecoverable | invalid and the recipient MUST treat it as an unrecoverable | |||
| error, unless the field value can be successfully parsed as a | error, unless the field value can be successfully parsed as a | |||
| comma-separated list (Section 5.6.1 of [Semantics]), all values | comma-separated list (Section 5.6.1 of [HTTP]), all values in the | |||
| in the list are valid, and all values in the list are the same. | list are valid, and all values in the list are the same (in which | |||
| If this is a request message, the server MUST respond with a 400 | case the message is processed with that single value used as the | |||
| (Bad Request) status code and then close the connection. If this | Content-Length field value). If the unrecoverable error is in a | |||
| is a response message received by a proxy, the proxy MUST close | request message, the server MUST respond with a 400 (Bad Request) | |||
| the connection to the server, discard the received response, and | status code and then close the connection. If it is in a | |||
| send a 502 (Bad Gateway) response to the client. If this is a | response message received by a proxy, the proxy MUST close the | |||
| connection to the server, discard the received response, and send | ||||
| a 502 (Bad Gateway) response to the client. If it is in a | ||||
| response message received by a user agent, the user agent MUST | response message received by a user agent, the user agent MUST | |||
| close the connection to the server and discard the received | close the connection to the server and discard the received | |||
| response. | response. | |||
| 6. If a valid Content-Length header field is present without | 6. If a valid Content-Length header field is present without | |||
| Transfer-Encoding, its decimal value defines the expected message | Transfer-Encoding, its decimal value defines the expected message | |||
| body length in octets. If the sender closes the connection or | body length in octets. If the sender closes the connection or | |||
| the recipient times out before the indicated number of octets are | the recipient times out before the indicated number of octets are | |||
| received, the recipient MUST consider the message to be | received, the recipient MUST consider the message to be | |||
| incomplete and close the connection. | incomplete and close the connection. | |||
| skipping to change at page 22, line 47 ¶ | skipping to change at page 23, line 26 ¶ | |||
| Transfer coding names are used to indicate an encoding transformation | Transfer coding names are used to indicate an encoding transformation | |||
| that has been, can be, or might need to be applied to a message's | that has been, can be, or might need to be applied to a message's | |||
| content in order to ensure "safe transport" through the network. | content in order to ensure "safe transport" through the network. | |||
| This differs from a content coding in that the transfer coding is a | This differs from a content coding in that the transfer coding is a | |||
| property of the message rather than a property of the representation | property of the message rather than a property of the representation | |||
| that is being transferred. | that is being transferred. | |||
| All transfer-coding names are case-insensitive and ought to be | All transfer-coding names are case-insensitive and ought to be | |||
| registered within the HTTP Transfer Coding registry, as defined in | registered within the HTTP Transfer Coding registry, as defined in | |||
| Section 7.3. They are used in the Transfer-Encoding (Section 6.1) | Section 7.3. They are used in the Transfer-Encoding (Section 6.1) | |||
| and TE (Section 10.1.4 of [Semantics]) header fields (the latter also | and TE (Section 10.1.4 of [HTTP]) header fields (the latter also | |||
| defining the "transfer-coding" grammar). | defining the "transfer-coding" grammar). | |||
| 7.1. Chunked Transfer Coding | 7.1. Chunked Transfer Coding | |||
| The chunked transfer coding wraps content in order to transfer it as | The chunked transfer coding wraps content in order to transfer it as | |||
| a series of chunks, each with its own size indicator, followed by an | a series of chunks, each with its own size indicator, followed by an | |||
| OPTIONAL trailer section containing trailer fields. Chunked enables | OPTIONAL trailer section containing trailer fields. Chunked enables | |||
| content streams of unknown size to be transferred as a sequence of | content streams of unknown size to be transferred as a sequence of | |||
| length-delimited buffers, which enables the sender to retain | length-delimited buffers, which enables the sender to retain | |||
| connection persistence and the recipient to know when it has received | connection persistence and the recipient to know when it has received | |||
| skipping to change at page 23, line 40 ¶ | skipping to change at page 24, line 18 ¶ | |||
| by a trailer section, and finally terminated by an empty line. | by a trailer section, and finally terminated by an empty line. | |||
| A recipient MUST be able to parse and decode the chunked transfer | A recipient MUST be able to parse and decode the chunked transfer | |||
| coding. | coding. | |||
| HTTP/1.1 does not define any means to limit the size of a chunked | HTTP/1.1 does not define any means to limit the size of a chunked | |||
| response such that an intermediary can be assured of buffering the | response such that an intermediary can be assured of buffering the | |||
| entire response. Additionally, very large chunk sizes may cause | entire response. Additionally, very large chunk sizes may cause | |||
| overflows or loss of precision if their values are not represented | overflows or loss of precision if their values are not represented | |||
| accurately in a receiving implementation. Therefore, recipients MUST | accurately in a receiving implementation. Therefore, recipients MUST | |||
| anticipate potentially large decimal numerals and prevent parsing | anticipate potentially large hexadecimal numerals and prevent parsing | |||
| errors due to integer conversion overflows or precision loss due to | errors due to integer conversion overflows or precision loss due to | |||
| integer representation. | integer representation. | |||
| The chunked encoding does not define any parameters. Their presence | The chunked encoding does not define any parameters. Their presence | |||
| SHOULD be treated as an error. | SHOULD be treated as an error. | |||
| 7.1.1. Chunk Extensions | 7.1.1. Chunk Extensions | |||
| The chunked encoding allows each chunk to include zero or more chunk | The chunked encoding allows each chunk to include zero or more chunk | |||
| extensions, immediately following the chunk-size, for the sake of | extensions, immediately following the chunk-size, for the sake of | |||
| skipping to change at page 24, line 33 ¶ | skipping to change at page 25, line 12 ¶ | |||
| parts of a message, and generate an appropriate 4xx (Client Error) | parts of a message, and generate an appropriate 4xx (Client Error) | |||
| response if that amount is exceeded. | response if that amount is exceeded. | |||
| 7.1.2. Chunked Trailer Section | 7.1.2. Chunked Trailer Section | |||
| A trailer section allows the sender to include additional fields at | A trailer section allows the sender to include additional fields at | |||
| the end of a chunked message in order to supply metadata that might | the end of a chunked message in order to supply metadata that might | |||
| be dynamically generated while the content is sent, such as a message | be dynamically generated while the content is sent, such as a message | |||
| integrity check, digital signature, or post-processing status. The | integrity check, digital signature, or post-processing status. The | |||
| proper use and limitations of trailer fields are defined in | proper use and limitations of trailer fields are defined in | |||
| Section 6.5 of [Semantics]. | Section 6.5 of [HTTP]. | |||
| trailer-section = *( field-line CRLF ) | trailer-section = *( field-line CRLF ) | |||
| A recipient that decodes and removes the chunked encoding from a | A recipient that decodes and removes the chunked encoding from a | |||
| message (e.g., for storage or forwarding to a non-HTTP/1.1 peer) MUST | message (e.g., for storage or forwarding to a non-HTTP/1.1 peer) MUST | |||
| discard any received trailer fields, store/forward them separately | discard any received trailer fields, store/forward them separately | |||
| from the header fields, or selectively merge into the header section | from the header fields, or selectively merge into the header section | |||
| only those trailer fields corresponding to header field definitions | only those trailer fields corresponding to header field definitions | |||
| that are understood by the recipient to explicitly permit and define | that are understood by the recipient to explicitly permit and define | |||
| how their corresponding trailer field value can be safely merged. | how their corresponding trailer field value can be safely merged. | |||
| skipping to change at page 25, line 35 ¶ | skipping to change at page 26, line 11 ¶ | |||
| } | } | |||
| Content-Length := length | Content-Length := length | |||
| Remove "chunked" from Transfer-Encoding | Remove "chunked" from Transfer-Encoding | |||
| 7.2. Transfer Codings for Compression | 7.2. Transfer Codings for Compression | |||
| The following transfer coding names for compression are defined by | The following transfer coding names for compression are defined by | |||
| the same algorithm as their corresponding content coding: | the same algorithm as their corresponding content coding: | |||
| compress (and x-compress) | compress (and x-compress) | |||
| See Section 8.4.1.1 of [Semantics]. | See Section 8.4.1.1 of [HTTP]. | |||
| deflate | deflate | |||
| See Section 8.4.1.2 of [Semantics]. | See Section 8.4.1.2 of [HTTP]. | |||
| gzip (and x-gzip) | gzip (and x-gzip) | |||
| See Section 8.4.1.3 of [Semantics]. | See Section 8.4.1.3 of [HTTP]. | |||
| The compression codings do not define any parameters. Their presence | The compression codings do not define any parameters. The presence | |||
| SHOULD be treated as an error. | of parameters with any of these compression codings SHOULD be treated | |||
| as an error. | ||||
| 7.3. Transfer Coding Registry | 7.3. Transfer Coding Registry | |||
| The "HTTP Transfer Coding Registry" defines the namespace for | The "HTTP Transfer Coding Registry" defines the namespace for | |||
| transfer coding names. It is maintained at | transfer coding names. It is maintained at | |||
| <https://www.iana.org/assignments/http-parameters>. | <https://www.iana.org/assignments/http-parameters>. | |||
| Registrations MUST include the following fields: | Registrations MUST include the following fields: | |||
| * Name | * Name | |||
| * Description | * Description | |||
| * Pointer to specification text | * Pointer to specification text | |||
| Names of transfer codings MUST NOT overlap with names of content | Names of transfer codings MUST NOT overlap with names of content | |||
| codings (Section 8.4.1 of [Semantics]) unless the encoding | codings (Section 8.4.1 of [HTTP]) unless the encoding transformation | |||
| transformation is identical, as is the case for the compression | is identical, as is the case for the compression codings defined in | |||
| codings defined in Section 7.2. | Section 7.2. | |||
| The TE header field (Section 10.1.4 of [Semantics]) uses a pseudo | The TE header field (Section 10.1.4 of [HTTP]) uses a pseudo | |||
| parameter named "q" as rank value when multiple transfer codings are | parameter named "q" as rank value when multiple transfer codings are | |||
| acceptable. Future registrations of transfer codings SHOULD NOT | acceptable. Future registrations of transfer codings SHOULD NOT | |||
| define parameters called "q" (case-insensitively) in order to avoid | define parameters called "q" (case-insensitively) in order to avoid | |||
| ambiguities. | ambiguities. | |||
| Values to be added to this namespace require IETF Review (see | Values to be added to this namespace require IETF Review (see | |||
| Section 4.8 of [RFC8126]), and MUST conform to the purpose of | Section 4.8 of [RFC8126]), and MUST conform to the purpose of | |||
| transfer coding defined in this specification. | transfer coding defined in this specification. | |||
| Use of program names for the identification of encoding formats is | Use of program names for the identification of encoding formats is | |||
| not desirable and is discouraged for future encodings. | not desirable and is discouraged for future encodings. | |||
| 7.4. Negotiating Transfer Codings | 7.4. Negotiating Transfer Codings | |||
| The TE field (Section 10.1.4 of [Semantics]) is used in HTTP/1.1 to | The TE field (Section 10.1.4 of [HTTP]) is used in HTTP/1.1 to | |||
| indicate what transfer-codings, besides chunked, the client is | indicate what transfer-codings, besides chunked, the client is | |||
| willing to accept in the response, and whether or not the client is | willing to accept in the response, and whether the client is willing | |||
| willing to preserve trailer fields in a chunked transfer coding. | to preserve trailer fields in a chunked transfer coding. | |||
| A client MUST NOT send the chunked transfer coding name in TE; | A client MUST NOT send the chunked transfer coding name in TE; | |||
| chunked is always acceptable for HTTP/1.1 recipients. | chunked is always acceptable for HTTP/1.1 recipients. | |||
| Three examples of TE use are below. | Three examples of TE use are below. | |||
| TE: deflate | TE: deflate | |||
| TE: | TE: | |||
| TE: trailers, deflate;q=0.5 | TE: trailers, deflate;q=0.5 | |||
| When multiple transfer codings are acceptable, the client MAY rank | When multiple transfer codings are acceptable, the client MAY rank | |||
| the codings by preference using a case-insensitive "q" parameter | the codings by preference using a case-insensitive "q" parameter | |||
| (similar to the qvalues used in content negotiation fields, | (similar to the qvalues used in content negotiation fields, | |||
| Section 12.4.2 of [Semantics]). The rank value is a real number in | Section 12.4.2 of [HTTP]). The rank value is a real number in the | |||
| the range 0 through 1, where 0.001 is the least preferred and 1 is | range 0 through 1, where 0.001 is the least preferred and 1 is the | |||
| the most preferred; a value of 0 means "not acceptable". | most preferred; a value of 0 means "not acceptable". | |||
| If the TE field value is empty or if no TE field is present, the only | If the TE field value is empty or if no TE field is present, the only | |||
| acceptable transfer coding is chunked. A message with no transfer | acceptable transfer coding is chunked. A message with no transfer | |||
| coding is always acceptable. | coding is always acceptable. | |||
| The keyword "trailers" indicates that the sender will not discard | The keyword "trailers" indicates that the sender will not discard | |||
| trailer fields, as described in Section 6.5 of [Semantics]. | trailer fields, as described in Section 6.5 of [HTTP]. | |||
| Since the TE header field only applies to the immediate connection, a | Since the TE header field only applies to the immediate connection, a | |||
| sender of TE MUST also send a "TE" connection option within the | sender of TE MUST also send a "TE" connection option within the | |||
| Connection header field (Section 7.6.1 of [Semantics]) in order to | Connection header field (Section 7.6.1 of [HTTP]) in order to prevent | |||
| prevent the TE header field from being forwarded by intermediaries | the TE header field from being forwarded by intermediaries that do | |||
| that do not support its semantics. | not support its semantics. | |||
| 8. Handling Incomplete Messages | 8. Handling Incomplete Messages | |||
| A server that receives an incomplete request message, usually due to | A server that receives an incomplete request message, usually due to | |||
| a canceled request or a triggered timeout exception, MAY send an | a canceled request or a triggered timeout exception, MAY send an | |||
| error response prior to closing the connection. | error response prior to closing the connection. | |||
| A client that receives an incomplete response message, which can | A client that receives an incomplete response message, which can | |||
| occur when a connection is closed prematurely or when decoding a | occur when a connection is closed prematurely or when decoding a | |||
| supposedly chunked transfer coding fails, MUST record the message as | supposedly chunked transfer coding fails, MUST record the message as | |||
| incomplete. Cache requirements for incomplete responses are defined | incomplete. Cache requirements for incomplete responses are defined | |||
| in Section 3 of [Caching]. | in Section 3 of [CACHING]. | |||
| If a response terminates in the middle of the header section (before | If a response terminates in the middle of the header section (before | |||
| the empty line is received) and the status code might rely on header | the empty line is received) and the status code might rely on header | |||
| fields to convey the full meaning of the response, then the client | fields to convey the full meaning of the response, then the client | |||
| cannot assume that meaning has been conveyed; the client might need | cannot assume that meaning has been conveyed; the client might need | |||
| to repeat the request in order to determine what action to take next. | to repeat the request in order to determine what action to take next. | |||
| A message body that uses the chunked transfer coding is incomplete if | A message body that uses the chunked transfer coding is incomplete if | |||
| the zero-sized chunk that terminates the encoding has not been | the zero-sized chunk that terminates the encoding has not been | |||
| received. A message that uses a valid Content-Length is incomplete | received. A message that uses a valid Content-Length is incomplete | |||
| skipping to change at page 28, line 14 ¶ | skipping to change at page 28, line 37 ¶ | |||
| 9. Connection Management | 9. Connection Management | |||
| HTTP messaging is independent of the underlying transport- or | HTTP messaging is independent of the underlying transport- or | |||
| session-layer connection protocol(s). HTTP only presumes a reliable | session-layer connection protocol(s). HTTP only presumes a reliable | |||
| transport with in-order delivery of requests and the corresponding | transport with in-order delivery of requests and the corresponding | |||
| in-order delivery of responses. The mapping of HTTP request and | in-order delivery of responses. The mapping of HTTP request and | |||
| response structures onto the data units of an underlying transport | response structures onto the data units of an underlying transport | |||
| protocol is outside the scope of this specification. | protocol is outside the scope of this specification. | |||
| As described in Section 7.3 of [Semantics], the specific connection | As described in Section 7.3 of [HTTP], the specific connection | |||
| protocols to be used for an HTTP interaction are determined by client | protocols to be used for an HTTP interaction are determined by client | |||
| configuration and the target URI. For example, the "http" URI scheme | configuration and the target URI. For example, the "http" URI scheme | |||
| (Section 4.2.1 of [Semantics]) indicates a default connection of TCP | (Section 4.2.1 of [HTTP]) indicates a default connection of TCP over | |||
| over IP, with a default TCP port of 80, but the client might be | IP, with a default TCP port of 80, but the client might be configured | |||
| configured to use a proxy via some other connection, port, or | to use a proxy via some other connection, port, or protocol. | |||
| protocol. | ||||
| HTTP implementations are expected to engage in connection management, | HTTP implementations are expected to engage in connection management, | |||
| which includes maintaining the state of current connections, | which includes maintaining the state of current connections, | |||
| establishing a new connection or reusing an existing connection, | establishing a new connection or reusing an existing connection, | |||
| processing messages received on a connection, detecting connection | processing messages received on a connection, detecting connection | |||
| failures, and closing each connection. Most clients maintain | failures, and closing each connection. Most clients maintain | |||
| multiple connections in parallel, including more than one connection | multiple connections in parallel, including more than one connection | |||
| per server endpoint. Most servers are designed to maintain thousands | per server endpoint. Most servers are designed to maintain thousands | |||
| of concurrent connections, while controlling request queues to enable | of concurrent connections, while controlling request queues to enable | |||
| fair use and detect denial-of-service attacks. | fair use and detect denial-of-service attacks. | |||
| 9.1. Establishment | 9.1. Establishment | |||
| It is beyond the scope of this specification to describe how | It is beyond the scope of this specification to describe how | |||
| connections are established via various transport- or session-layer | connections are established via various transport- or session-layer | |||
| protocols. Each connection applies to only one transport link. | protocols. Each HTTP connection maps to one underlying transport | |||
| connection. | ||||
| 9.2. Associating a Response to a Request | 9.2. Associating a Response to a Request | |||
| HTTP/1.1 does not include a request identifier for associating a | HTTP/1.1 does not include a request identifier for associating a | |||
| given request message with its corresponding one or more response | given request message with its corresponding one or more response | |||
| messages. Hence, it relies on the order of response arrival to | messages. Hence, it relies on the order of response arrival to | |||
| correspond exactly to the order in which requests are made on the | correspond exactly to the order in which requests are made on the | |||
| same connection. More than one response message per request only | same connection. More than one response message per request only | |||
| occurs when one or more informational responses (1xx, see | occurs when one or more informational responses (1xx, see | |||
| Section 15.2 of [Semantics]) precede a final response to the same | Section 15.2 of [HTTP]) precede a final response to the same request. | |||
| request. | ||||
| A client that has more than one outstanding request on a connection | A client that has more than one outstanding request on a connection | |||
| MUST maintain a list of outstanding requests in the order sent and | MUST maintain a list of outstanding requests in the order sent and | |||
| MUST associate each received response message on that connection to | MUST associate each received response message on that connection to | |||
| the highest ordered request that has not yet received a final (non- | the highest ordered request that has not yet received a final (non- | |||
| 1xx) response. | 1xx) response. | |||
| If an HTTP/1.1 client receives data on a connection that doesn't have | If an HTTP/1.1 client receives data on a connection that doesn't have | |||
| any outstanding requests, it MUST NOT consider them to be a response | any outstanding requests, it MUST NOT consider them to be a response | |||
| to a not-yet-issued request; it SHOULD close the connection, since | to a not-yet-issued request; it SHOULD close the connection, since | |||
| skipping to change at page 29, line 25 ¶ | skipping to change at page 29, line 42 ¶ | |||
| of one or more CRLF (which can be discarded, as per Section 2.2). | of one or more CRLF (which can be discarded, as per Section 2.2). | |||
| 9.3. Persistence | 9.3. Persistence | |||
| HTTP/1.1 defaults to the use of _persistent connections_, allowing | HTTP/1.1 defaults to the use of _persistent connections_, allowing | |||
| multiple requests and responses to be carried over a single | multiple requests and responses to be carried over a single | |||
| connection. HTTP implementations SHOULD support persistent | connection. HTTP implementations SHOULD support persistent | |||
| connections. | connections. | |||
| A recipient determines whether a connection is persistent or not | A recipient determines whether a connection is persistent or not | |||
| based on the most recently received message's protocol version and | based on the protocol version and Connection header field | |||
| Connection header field (Section 7.6.1 of [Semantics]), if any: | (Section 7.6.1 of [HTTP]) in the most recently received message, if | |||
| any: | ||||
| * If the close connection option is present (Section 9.6), the | * If the close connection option is present (Section 9.6), the | |||
| connection will not persist after the current response; else, | connection will not persist after the current response; else, | |||
| * If the received protocol is HTTP/1.1 (or later), the connection | * If the received protocol is HTTP/1.1 (or later), the connection | |||
| will persist after the current response; else, | will persist after the current response; else, | |||
| * If the received protocol is HTTP/1.0, the "keep-alive" connection | * If the received protocol is HTTP/1.0, the "keep-alive" connection | |||
| option is present, either the recipient is not a proxy or the | option is present, either the recipient is not a proxy or the | |||
| message is a response, and the recipient wishes to honor the | message is a response, and the recipient wishes to honor the | |||
| skipping to change at page 30, line 28 ¶ | skipping to change at page 30, line 47 ¶ | |||
| See Appendix C.2.2 for more information on backwards compatibility | See Appendix C.2.2 for more information on backwards compatibility | |||
| with HTTP/1.0 clients. | with HTTP/1.0 clients. | |||
| 9.3.1. Retrying Requests | 9.3.1. Retrying Requests | |||
| Connections can be closed at any time, with or without intention. | Connections can be closed at any time, with or without intention. | |||
| Implementations ought to anticipate the need to recover from | Implementations ought to anticipate the need to recover from | |||
| asynchronous close events. The conditions under which a client can | asynchronous close events. The conditions under which a client can | |||
| automatically retry a sequence of outstanding requests are defined in | automatically retry a sequence of outstanding requests are defined in | |||
| Section 9.2.2 of [Semantics]. | Section 9.2.2 of [HTTP]. | |||
| 9.3.2. Pipelining | 9.3.2. Pipelining | |||
| A client that supports persistent connections MAY _pipeline_ its | A client that supports persistent connections MAY _pipeline_ its | |||
| requests (i.e., send multiple requests without waiting for each | requests (i.e., send multiple requests without waiting for each | |||
| response). A server MAY process a sequence of pipelined requests in | response). A server MAY process a sequence of pipelined requests in | |||
| parallel if they all have safe methods (Section 9.2.1 of | parallel if they all have safe methods (Section 9.2.1 of [HTTP]), but | |||
| [Semantics]), but it MUST send the corresponding responses in the | it MUST send the corresponding responses in the same order that the | |||
| same order that the requests were received. | requests were received. | |||
| A client that pipelines requests SHOULD retry unanswered requests if | A client that pipelines requests SHOULD retry unanswered requests if | |||
| the connection closes before it receives all of the corresponding | the connection closes before it receives all of the corresponding | |||
| responses. When retrying pipelined requests after a failed | responses. When retrying pipelined requests after a failed | |||
| connection (a connection not explicitly closed by the server in its | connection (a connection not explicitly closed by the server in its | |||
| last complete response), a client MUST NOT pipeline immediately after | last complete response), a client MUST NOT pipeline immediately after | |||
| connection establishment, since the first remaining request in the | connection establishment, since the first remaining request in the | |||
| prior pipeline might have caused an error response that can be lost | prior pipeline might have caused an error response that can be lost | |||
| again if multiple requests are sent on a prematurely closed | again if multiple requests are sent on a prematurely closed | |||
| connection (see the TCP reset problem described in Section 9.6). | connection (see the TCP reset problem described in Section 9.6). | |||
| Idempotent methods (Section 9.2.2 of [Semantics]) are significant to | Idempotent methods (Section 9.2.2 of [HTTP]) are significant to | |||
| pipelining because they can be automatically retried after a | pipelining because they can be automatically retried after a | |||
| connection failure. A user agent SHOULD NOT pipeline requests after | connection failure. A user agent SHOULD NOT pipeline requests after | |||
| a non-idempotent method, until the final response status code for | a non-idempotent method, until the final response status code for | |||
| that method has been received, unless the user agent has a means to | that method has been received, unless the user agent has a means to | |||
| detect and recover from partial failure conditions involving the | detect and recover from partial failure conditions involving the | |||
| pipelined sequence. | pipelined sequence. | |||
| An intermediary that receives pipelined requests MAY pipeline those | An intermediary that receives pipelined requests MAY pipeline those | |||
| requests when forwarding them inbound, since it can rely on the | requests when forwarding them inbound, since it can rely on the | |||
| outbound user agent(s) to determine what requests can be safely | outbound user agent(s) to determine what requests can be safely | |||
| skipping to change at page 31, line 34 ¶ | skipping to change at page 32, line 9 ¶ | |||
| Previous revisions of HTTP gave a specific number of connections as a | Previous revisions of HTTP gave a specific number of connections as a | |||
| ceiling, but this was found to be impractical for many applications. | ceiling, but this was found to be impractical for many applications. | |||
| As a result, this specification does not mandate a particular maximum | As a result, this specification does not mandate a particular maximum | |||
| number of connections but, instead, encourages clients to be | number of connections but, instead, encourages clients to be | |||
| conservative when opening multiple connections. | conservative when opening multiple connections. | |||
| Multiple connections are typically used to avoid the "head-of-line | Multiple connections are typically used to avoid the "head-of-line | |||
| blocking" problem, wherein a request that takes significant server- | blocking" problem, wherein a request that takes significant server- | |||
| side processing and/or transfers very large content would block | side processing and/or transfers very large content would block | |||
| subsequent requests on the same connection. However, each connection | subsequent requests on the same connection. However, each connection | |||
| consumes server resources. Furthermore, using multiple connections | consumes server resources. | |||
| can cause undesirable side effects in congested networks. | ||||
| Furthermore, using multiple connections can cause undesirable side | ||||
| effects in congested networks. Using larger number of multiple | ||||
| connections can also cause side effects in otherwise uncongested | ||||
| networks, because their aggregate and initially synchronized sending | ||||
| behavior can cause congestion that would not have been present if | ||||
| fewer parallel connections had been used. | ||||
| Note that a server might reject traffic that it deems abusive or | Note that a server might reject traffic that it deems abusive or | |||
| characteristic of a denial-of-service attack, such as an excessive | characteristic of a denial-of-service attack, such as an excessive | |||
| number of open connections from a single client. | number of open connections from a single client. | |||
| 9.5. Failures and Timeouts | 9.5. Failures and Timeouts | |||
| Servers will usually have some timeout value beyond which they will | Servers will usually have some timeout value beyond which they will | |||
| no longer maintain an inactive connection. Proxy servers might make | no longer maintain an inactive connection. Proxy servers might make | |||
| this a higher value since it is likely that the client will be making | this a higher value since it is likely that the client will be making | |||
| skipping to change at page 32, line 36 ¶ | skipping to change at page 33, line 13 ¶ | |||
| client sees a response that indicates the server does not wish to | client sees a response that indicates the server does not wish to | |||
| receive the message body and is closing the connection, the client | receive the message body and is closing the connection, the client | |||
| SHOULD immediately cease transmitting the body and close its side of | SHOULD immediately cease transmitting the body and close its side of | |||
| the connection. | the connection. | |||
| 9.6. Tear-down | 9.6. Tear-down | |||
| The "close" connection option is defined as a signal that the sender | The "close" connection option is defined as a signal that the sender | |||
| will close this connection after completion of the response. A | will close this connection after completion of the response. A | |||
| sender SHOULD send a Connection header field (Section 7.6.1 of | sender SHOULD send a Connection header field (Section 7.6.1 of | |||
| [Semantics]) containing the close connection option when it intends | [HTTP]) containing the close connection option when it intends to | |||
| to close a connection. For example, | close a connection. For example, | |||
| Connection: close | Connection: close | |||
| as a request header field indicates that this is the last request | as a request header field indicates that this is the last request | |||
| that the client will send on this connection, while in a response the | that the client will send on this connection, while in a response the | |||
| same field indicates that the server is going to close this | same field indicates that the server is going to close this | |||
| connection after the response message is complete. | connection after the response message is complete. | |||
| Note that the field name "Close" is reserved, since using that name | Note that the field name "Close" is reserved, since using that name | |||
| as a header field might conflict with the close connection option. | as a header field might conflict with the close connection option. | |||
| skipping to change at page 34, line 8 ¶ | skipping to change at page 34, line 31 ¶ | |||
| Note that a TCP connection that is half-closed by the client does not | Note that a TCP connection that is half-closed by the client does not | |||
| delimit a request message, nor does it imply that the client is no | delimit a request message, nor does it imply that the client is no | |||
| longer interested in a response. In general, transport signals | longer interested in a response. In general, transport signals | |||
| cannot be relied upon to signal edge cases, since HTTP/1.1 is | cannot be relied upon to signal edge cases, since HTTP/1.1 is | |||
| independent of transport. | independent of transport. | |||
| 9.7. TLS Connection Initiation | 9.7. TLS Connection Initiation | |||
| Conceptually, HTTP/TLS is simply sending HTTP messages over a | Conceptually, HTTP/TLS is simply sending HTTP messages over a | |||
| connection secured via TLS [RFC8446]. | connection secured via TLS [TLS13]. | |||
| The HTTP client also acts as the TLS client. It initiates a | The HTTP client also acts as the TLS client. It initiates a | |||
| connection to the server on the appropriate port and sends the TLS | connection to the server on the appropriate port and sends the TLS | |||
| ClientHello to begin the TLS handshake. When the TLS handshake has | ClientHello to begin the TLS handshake. When the TLS handshake has | |||
| finished, the client may then initiate the first HTTP request. All | finished, the client may then initiate the first HTTP request. All | |||
| HTTP data MUST be sent as TLS "application data", but is otherwise | HTTP data MUST be sent as TLS "application data", but is otherwise | |||
| treated like a normal connection for HTTP (including potential reuse | treated like a normal connection for HTTP (including potential reuse | |||
| as a persistent connection). | as a persistent connection). | |||
| 9.8. TLS Connection Closure | 9.8. TLS Connection Closure | |||
| skipping to change at page 37, line 14 ¶ | skipping to change at page 38, line 4 ¶ | |||
| Applications that use this media type: N/A | Applications that use this media type: N/A | |||
| Fragment identifier considerations: N/A | Fragment identifier considerations: N/A | |||
| Additional information: Deprecated alias names for this type: N/A | Additional information: 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 Aut | Person and email address to contact for further information: See Aut | |||
| hors' 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 | |||
| 11. Security Considerations | 11. 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 considerations relevant to HTTP message | and users about known security considerations relevant to HTTP | |||
| syntax and parsing. Security considerations about HTTP semantics, | message syntax and parsing. Security considerations about HTTP | |||
| content, and routing are addressed in [Semantics]. | semantics, content, and routing are addressed in [HTTP]. | |||
| 11.1. Response Splitting | 11.1. Response Splitting | |||
| Response splitting (a.k.a, CRLF injection) is a common technique, | Response splitting (a.k.a., CRLF injection) is a common technique, | |||
| used in various attacks on Web usage, that exploits the line-based | used in various attacks on Web usage, that exploits the line-based | |||
| nature of HTTP message framing and the ordered association of | nature of HTTP message framing and the ordered association of | |||
| requests to responses on persistent connections [Klein]. This | requests to responses on persistent connections [Klein]. This | |||
| technique can be particularly damaging when the requests pass through | technique can be particularly damaging when the requests pass through | |||
| a shared cache. | a shared cache. | |||
| Response splitting exploits a vulnerability in servers (usually | Response splitting exploits a vulnerability in servers (usually | |||
| within an application server) where an attacker can send encoded data | within an application server) where an attacker can send encoded data | |||
| within some parameter of the request that is later decoded and echoed | within some parameter of the request that is later decoded and echoed | |||
| within any of the response header fields of the response. If the | within any of the response header fields of the response. If the | |||
| skipping to change at page 39, line 34 ¶ | skipping to change at page 40, line 10 ¶ | |||
| information is detected by the protocol to be incomplete, expired, or | information is detected by the protocol to be incomplete, expired, or | |||
| corrupted during transfer. Such mechanisms might be selectively | corrupted during transfer. Such mechanisms might be selectively | |||
| enabled via user agent extensions or the presence of message | enabled via user agent extensions or the presence of message | |||
| integrity metadata in a response. | integrity metadata in a response. | |||
| The "http" scheme provides no protection against accidental or | The "http" scheme provides no protection against accidental or | |||
| malicious modification of messages. | malicious modification of messages. | |||
| Extensions to the protocol might be used to mitigate the risk of | Extensions to the protocol might be used to mitigate the risk of | |||
| unwanted modification of messages by intermediaries, even when the | unwanted modification of messages by intermediaries, even when the | |||
| "https" scheme is used. Integrity might be assured by using hash | "https" scheme is used. Integrity might be assured by using message | |||
| functions or digital signatures that are selectively added to | authentication codes or digital signatures that are selectively added | |||
| messages via extensible metadata fields. | to messages via extensible metadata fields. | |||
| 11.4. Message Confidentiality | 11.4. Message Confidentiality | |||
| HTTP relies on underlying transport protocols to provide message | HTTP relies on underlying transport protocols to provide message | |||
| confidentiality when that is desired. HTTP has been specifically | confidentiality when that is desired. HTTP has been specifically | |||
| designed to be independent of the transport protocol, such that it | designed to be independent of the transport protocol, such that it | |||
| can be used over many different forms of encrypted connection, with | can be used over many forms of encrypted connection, with the | |||
| the selection of such transports being identified by the choice of | selection of such transports being identified by the choice of URI | |||
| URI scheme or within user agent configuration. | scheme or within user agent configuration. | |||
| The "https" scheme can be used to identify resources that require a | The "https" scheme can be used to identify resources that require a | |||
| confidential connection, as described in Section 4.2.2 of | confidential connection, as described in Section 4.2.2 of [HTTP]. | |||
| [Semantics]. | ||||
| 12. IANA Considerations | 12. IANA Considerations | |||
| The change controller for the following registrations is: "IETF | The change controller for the following registrations is: "IETF | |||
| (iesg@ietf.org) - Internet Engineering Task Force". | (iesg@ietf.org) - Internet Engineering Task Force". | |||
| 12.1. Field Name Registration | 12.1. Field Name Registration | |||
| First, introduce the new "Hypertext Transfer Protocol (HTTP) Field | First, introduce the new "Hypertext Transfer Protocol (HTTP) Field | |||
| Name Registry" at <https://www.iana.org/assignments/http-fields> as | Name Registry" at <https://www.iana.org/assignments/http-fields> as | |||
| described in Section 18.4 of [Semantics]. | described in Section 18.4 of [HTTP]. | |||
| Then, please update the registry with the field names listed in the | Then, please update the registry with the field names listed in the | |||
| table below: | table below: | |||
| +===================+==========+======+============+ | +===================+==========+======+============+ | |||
| | Field Name | Status | Ref. | Comments | | | Field Name | Status | Ref. | Comments | | |||
| +===================+==========+======+============+ | +===================+==========+======+============+ | |||
| | Close | standard | 9.6 | (reserved) | | | Close | standard | 9.6 | (reserved) | | |||
| +-------------------+----------+------+------------+ | +-------------------+----------+------+------------+ | |||
| | MIME-Version | standard | B.1 | | | | MIME-Version | standard | B.1 | | | |||
| skipping to change at page 41, line 35 ¶ | skipping to change at page 41, line 49 ¶ | |||
| | | compress) | 7.2 | | | | compress) | 7.2 | | |||
| +------------+-------------------------------+-----------+ | +------------+-------------------------------+-----------+ | |||
| | x-gzip | Deprecated (alias for gzip) | Section | | | x-gzip | Deprecated (alias for gzip) | Section | | |||
| | | | 7.2 | | | | | 7.2 | | |||
| +------------+-------------------------------+-----------+ | +------------+-------------------------------+-----------+ | |||
| Table 2 | Table 2 | |||
| | *Note:* the coding name "trailers" is reserved because its use | | *Note:* the coding name "trailers" is reserved because its use | |||
| | would conflict with the keyword "trailers" in the TE header | | would conflict with the keyword "trailers" in the TE header | |||
| | field (Section 10.1.4 of [Semantics]). | | field (Section 10.1.4 of [HTTP]). | |||
| 12.4. ALPN Protocol ID Registration | 12.4. ALPN Protocol ID Registration | |||
| Please update the "TLS Application-Layer Protocol Negotiation (ALPN) | Please update the "TLS Application-Layer Protocol Negotiation (ALPN) | |||
| Protocol IDs" registry at <https://www.iana.org/assignments/tls- | Protocol IDs" registry at <https://www.iana.org/assignments/tls- | |||
| extensiontype-values/tls-extensiontype-values.xhtml> with the | extensiontype-values/tls-extensiontype-values.xhtml> with the | |||
| registration below: | registration below: | |||
| +==========+=============================+================+ | +==========+=============================+================+ | |||
| | Protocol | Identification Sequence | Reference | | | Protocol | Identification Sequence | Reference | | |||
| skipping to change at page 42, line 9 ¶ | skipping to change at page 42, line 25 ¶ | |||
| | HTTP/1.1 | 0x68 0x74 0x74 0x70 0x2f | (this | | | HTTP/1.1 | 0x68 0x74 0x74 0x70 0x2f | (this | | |||
| | | 0x31 0x2e 0x31 ("http/1.1") | specification) | | | | 0x31 0x2e 0x31 ("http/1.1") | specification) | | |||
| +----------+-----------------------------+----------------+ | +----------+-----------------------------+----------------+ | |||
| Table 3 | Table 3 | |||
| 13. References | 13. References | |||
| 13.1. Normative References | 13.1. Normative References | |||
| [Caching] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | [CACHING] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
| Ed., "HTTP Caching", Work in Progress, Internet-Draft, | Ed., "HTTP Caching", Work in Progress, Internet-Draft, | |||
| draft-ietf-httpbis-cache-16, 27 May 2021, | draft-ietf-httpbis-cache-17, 26 July 2021, | |||
| <https://tools.ietf.org/html/draft-ietf-httpbis-cache-16>. | <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | |||
| cache-17>. | ||||
| [HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | ||||
| Ed., "HTTP Semantics", Work in Progress, Internet-Draft, | ||||
| draft-ietf-httpbis-semantics-17, 26 July 2021, | ||||
| <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | ||||
| semantics-17>. | ||||
| [RFC1950] Deutsch, L.P. and J-L. Gailly, "ZLIB Compressed Data | [RFC1950] Deutsch, L.P. and J-L. Gailly, "ZLIB Compressed Data | |||
| Format Specification version 3.3", RFC 1950, | Format Specification version 3.3", RFC 1950, | |||
| DOI 10.17487/RFC1950, May 1996, | DOI 10.17487/RFC1950, May 1996, | |||
| <https://www.rfc-editor.org/info/rfc1950>. | <https://www.rfc-editor.org/info/rfc1950>. | |||
| [RFC1951] Deutsch, P., "DEFLATE Compressed Data Format Specification | [RFC1951] Deutsch, P., "DEFLATE Compressed Data Format Specification | |||
| version 1.3", RFC 1951, DOI 10.17487/RFC1951, May 1996, | version 1.3", RFC 1951, DOI 10.17487/RFC1951, May 1996, | |||
| <https://www.rfc-editor.org/info/rfc1951>. | <https://www.rfc-editor.org/info/rfc1951>. | |||
| [RFC1952] Deutsch, P., Gailly, J-L., Adler, M., Deutsch, L.P., and | [RFC1952] Deutsch, P., Gailly, J-L., Adler, M., Deutsch, L.P., and | |||
| G. Randers-Pehrson, "GZIP file format specification | G. Randers-Pehrson, "GZIP file format specification | |||
| version 4.3", RFC 1952, DOI 10.17487/RFC1952, May 1996, | version 4.3", RFC 1952, DOI 10.17487/RFC1952, May 1996, | |||
| <https://www.rfc-editor.org/info/rfc1952>. | <https://www.rfc-editor.org/info/rfc1952>. | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | ||||
| Resource Identifier (URI): Generic Syntax", STD 66, | ||||
| RFC 3986, DOI 10.17487/RFC3986, January 2005, | ||||
| <https://www.rfc-editor.org/info/rfc3986>. | ||||
| [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | |||
| Specifications: ABNF", STD 68, RFC 5234, | Specifications: ABNF", STD 68, RFC 5234, | |||
| DOI 10.17487/RFC5234, January 2008, | DOI 10.17487/RFC5234, January 2008, | |||
| <https://www.rfc-editor.org/info/rfc5234>. | <https://www.rfc-editor.org/info/rfc5234>. | |||
| [RFC7405] Kyzivat, P., "Case-Sensitive String Support in ABNF", | [RFC7405] Kyzivat, P., "Case-Sensitive String Support in ABNF", | |||
| RFC 7405, DOI 10.17487/RFC7405, December 2014, | RFC 7405, DOI 10.17487/RFC7405, December 2014, | |||
| <https://www.rfc-editor.org/info/rfc7405>. | <https://www.rfc-editor.org/info/rfc7405>. | |||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [TLS13] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
| Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
| <https://www.rfc-editor.org/info/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
| [Semantics] | [URI] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | |||
| Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | Resource Identifier (URI): Generic Syntax", STD 66, | |||
| Ed., "HTTP Semantics", Work in Progress, Internet-Draft, | RFC 3986, DOI 10.17487/RFC3986, January 2005, | |||
| draft-ietf-httpbis-semantics-16, 27 May 2021, | <https://www.rfc-editor.org/info/rfc3986>. | |||
| <https://tools.ietf.org/html/draft-ietf-httpbis-semantics- | ||||
| 16>. | ||||
| [USASCII] American National Standards Institute, "Coded Character | [USASCII] American National Standards Institute, "Coded Character | |||
| Set -- 7-bit American Standard Code for Information | Set -- 7-bit American Standard Code for Information | |||
| Interchange", ANSI X3.4, 1986. | Interchange", ANSI X3.4, 1986. | |||
| [Welch] Welch, T. A., "A Technique for High-Performance Data | [Welch] Welch, T. A., "A Technique for High-Performance Data | |||
| Compression", IEEE Computer 17(6), June 1984. | Compression", IEEE Computer 17(6), June 1984. | |||
| 13.2. Informative References | 13.2. Informative References | |||
| [Err4667] RFC Errata, Erratum ID 4667, RFC 7230, | [Err4667] RFC Errata, Erratum ID 4667, RFC 7230, | |||
| <https://www.rfc-editor.org/errata/eid4667>. | <https://www.rfc-editor.org/errata/eid4667>. | |||
| [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>. | ||||
| [Klein] Klein, A., "Divide and Conquer - HTTP Response Splitting, | [Klein] Klein, A., "Divide and Conquer - HTTP Response Splitting, | |||
| Web Cache Poisoning Attacks, and Related Topics", March | Web Cache Poisoning Attacks, and Related Topics", March | |||
| 2004, <http://packetstormsecurity.com/papers/general/ | 2004, <https://packetstormsecurity.com/papers/general/ | |||
| whitepaper_httpresponse.pdf>. | whitepaper_httpresponse.pdf>. | |||
| [Linhart] Linhart, C., Klein, A., Heled, R., and S. Orrin, "HTTP | [Linhart] Linhart, C., Klein, A., Heled, R., and S. Orrin, "HTTP | |||
| Request Smuggling", June 2005, | Request Smuggling", June 2005, | |||
| <https://www.cgisecurity.com/lib/HTTP-Request- | <https://www.cgisecurity.com/lib/HTTP-Request- | |||
| Smuggling.pdf>. | Smuggling.pdf>. | |||
| [RFC1945] 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>. | ||||
| [RFC2045] Freed, N. and N.S. Borenstein, "Multipurpose Internet Mail | [RFC2045] Freed, N. and N.S. Borenstein, "Multipurpose Internet Mail | |||
| Extensions (MIME) Part One: Format of Internet Message | Extensions (MIME) Part One: Format of Internet Message | |||
| Bodies", RFC 2045, DOI 10.17487/RFC2045, November 1996, | Bodies", RFC 2045, DOI 10.17487/RFC2045, November 1996, | |||
| <https://www.rfc-editor.org/info/rfc2045>. | <https://www.rfc-editor.org/info/rfc2045>. | |||
| [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, | |||
| DOI 10.17487/RFC2046, November 1996, | DOI 10.17487/RFC2046, November 1996, | |||
| <https://www.rfc-editor.org/info/rfc2046>. | <https://www.rfc-editor.org/info/rfc2046>. | |||
| skipping to change at page 44, line 29 ¶ | skipping to change at page 44, line 44 ¶ | |||
| [RFC5322] Resnick, P., "Internet Message Format", RFC 5322, | [RFC5322] Resnick, P., "Internet Message Format", RFC 5322, | |||
| DOI 10.17487/RFC5322, October 2008, | DOI 10.17487/RFC5322, October 2008, | |||
| <https://www.rfc-editor.org/info/rfc5322>. | <https://www.rfc-editor.org/info/rfc5322>. | |||
| [RFC7230] Fielding, R., Ed. and J. F. Reschke, Ed., "Hypertext | [RFC7230] Fielding, R., Ed. and J. F. Reschke, Ed., "Hypertext | |||
| Transfer Protocol (HTTP/1.1): Message Syntax and Routing", | Transfer Protocol (HTTP/1.1): Message Syntax and Routing", | |||
| RFC 7230, DOI 10.17487/RFC7230, June 2014, | RFC 7230, DOI 10.17487/RFC7230, June 2014, | |||
| <https://www.rfc-editor.org/info/rfc7230>. | <https://www.rfc-editor.org/info/rfc7230>. | |||
| [RFC7231] Fielding, R., Ed. and J. F. Reschke, Ed., "Hypertext | ||||
| Transfer Protocol (HTTP/1.1): Semantics and Content", | ||||
| RFC 7231, DOI 10.17487/RFC7231, June 2014, | ||||
| <https://www.rfc-editor.org/info/rfc7231>. | ||||
| [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | |||
| Writing an IANA Considerations Section in RFCs", BCP 26, | Writing an IANA Considerations Section in RFCs", BCP 26, | |||
| RFC 8126, DOI 10.17487/RFC8126, June 2017, | RFC 8126, DOI 10.17487/RFC8126, June 2017, | |||
| <https://www.rfc-editor.org/info/rfc8126>. | <https://www.rfc-editor.org/info/rfc8126>. | |||
| Appendix A. Collected ABNF | Appendix A. Collected ABNF | |||
| In the collected ABNF below, list rules are expanded as per | In the collected ABNF below, list rules are expanded as per | |||
| Section 5.6.1.1 of [Semantics]. | Section 5.6.1.1 of [HTTP]. | |||
| BWS = <BWS, see [Semantics], Section 5.6.3> | BWS = <BWS, see [HTTP], Section 5.6.3> | |||
| HTTP-message = start-line CRLF *( field-line CRLF ) CRLF [ | HTTP-message = start-line CRLF *( field-line CRLF ) CRLF [ | |||
| message-body ] | message-body ] | |||
| HTTP-name = %x48.54.54.50 ; HTTP | HTTP-name = %x48.54.54.50 ; HTTP | |||
| HTTP-version = HTTP-name "/" DIGIT "." DIGIT | HTTP-version = HTTP-name "/" DIGIT "." DIGIT | |||
| OWS = <OWS, see [Semantics], Section 5.6.3> | OWS = <OWS, see [HTTP], Section 5.6.3> | |||
| RWS = <RWS, see [Semantics], Section 5.6.3> | ||||
| RWS = <RWS, see [HTTP], Section 5.6.3> | ||||
| Transfer-Encoding = [ transfer-coding *( OWS "," OWS transfer-coding | Transfer-Encoding = [ transfer-coding *( OWS "," OWS transfer-coding | |||
| ) ] | ) ] | |||
| absolute-URI = <absolute-URI, see [RFC3986], Section 4.3> | absolute-URI = <absolute-URI, see [URI], Section 4.3> | |||
| absolute-form = absolute-URI | absolute-form = absolute-URI | |||
| absolute-path = <absolute-path, see [Semantics], Section 4> | absolute-path = <absolute-path, see [HTTP], Section 4> | |||
| asterisk-form = "*" | asterisk-form = "*" | |||
| authority = <authority, see [RFC3986], Section 3.2> | authority = <authority, see [URI], Section 3.2> | |||
| authority-form = uri-host ":" port | authority-form = uri-host ":" port | |||
| chunk = chunk-size [ chunk-ext ] CRLF chunk-data CRLF | chunk = chunk-size [ chunk-ext ] CRLF chunk-data CRLF | |||
| chunk-data = 1*OCTET | chunk-data = 1*OCTET | |||
| chunk-ext = *( BWS ";" BWS chunk-ext-name [ BWS "=" BWS chunk-ext-val | chunk-ext = *( BWS ";" BWS chunk-ext-name [ BWS "=" BWS chunk-ext-val | |||
| ] ) | ] ) | |||
| chunk-ext-name = token | chunk-ext-name = token | |||
| chunk-ext-val = token / quoted-string | chunk-ext-val = token / quoted-string | |||
| chunk-size = 1*HEXDIG | chunk-size = 1*HEXDIG | |||
| chunked-body = *chunk last-chunk trailer-section CRLF | chunked-body = *chunk last-chunk trailer-section CRLF | |||
| field-line = field-name ":" OWS field-value OWS | field-line = field-name ":" OWS field-value OWS | |||
| field-name = <field-name, see [Semantics], Section 5.1> | field-name = <field-name, see [HTTP], Section 5.1> | |||
| field-value = <field-value, see [Semantics], Section 5.5> | field-value = <field-value, see [HTTP], Section 5.5> | |||
| last-chunk = 1*"0" [ chunk-ext ] CRLF | last-chunk = 1*"0" [ chunk-ext ] CRLF | |||
| message-body = *OCTET | message-body = *OCTET | |||
| method = token | method = token | |||
| obs-fold = OWS CRLF RWS | obs-fold = OWS CRLF RWS | |||
| obs-text = <obs-text, see [Semantics], Section 5.6.4> | obs-text = <obs-text, see [HTTP], Section 5.6.4> | |||
| origin-form = absolute-path [ "?" query ] | origin-form = absolute-path [ "?" query ] | |||
| port = <port, see [RFC3986], Section 3.2.3> | port = <port, see [URI], Section 3.2.3> | |||
| query = <query, see [RFC3986], Section 3.4> | ||||
| quoted-string = <quoted-string, see [Semantics], Section 5.6.4> | ||||
| query = <query, see [URI], Section 3.4> | ||||
| quoted-string = <quoted-string, see [HTTP], Section 5.6.4> | ||||
| reason-phrase = 1*( HTAB / SP / VCHAR / obs-text ) | reason-phrase = 1*( HTAB / SP / VCHAR / obs-text ) | |||
| request-line = method SP request-target SP HTTP-version | request-line = method SP request-target SP HTTP-version | |||
| request-target = origin-form / absolute-form / authority-form / | request-target = origin-form / absolute-form / authority-form / | |||
| asterisk-form | asterisk-form | |||
| start-line = request-line / status-line | start-line = request-line / status-line | |||
| status-code = 3DIGIT | status-code = 3DIGIT | |||
| status-line = HTTP-version SP status-code SP [ reason-phrase ] | status-line = HTTP-version SP status-code SP [ reason-phrase ] | |||
| token = <token, see [Semantics], Section 5.6.2> | ||||
| token = <token, see [HTTP], Section 5.6.2> | ||||
| trailer-section = *( field-line CRLF ) | trailer-section = *( field-line CRLF ) | |||
| transfer-coding = <transfer-coding, see [Semantics], Section 10.1.4> | transfer-coding = <transfer-coding, see [HTTP], Section 10.1.4> | |||
| uri-host = <host, see [RFC3986], Section 3.2.2> | uri-host = <host, see [URI], Section 3.2.2> | |||
| Appendix B. Differences between HTTP and MIME | Appendix B. Differences between HTTP and MIME | |||
| HTTP/1.1 uses many of the constructs defined for the Internet Message | HTTP/1.1 uses many of the constructs defined for the Internet Message | |||
| Format [RFC5322] and the Multipurpose Internet Mail Extensions (MIME) | Format [RFC5322] and the Multipurpose Internet Mail Extensions (MIME) | |||
| [RFC2045] to allow a message body to be transmitted in an open | [RFC2045] to allow a message body to be transmitted in an open | |||
| variety of representations and with extensible fields. However, RFC | variety of representations and with extensible fields. However, RFC | |||
| 2045 is focused only on email; applications of HTTP have many | 2045 is focused only on email; applications of HTTP have many | |||
| characteristics that differ from email; hence, HTTP has features that | characteristics that differ from email; hence, HTTP has features that | |||
| differ from MIME. These differences were carefully chosen to | differ from MIME. These differences were carefully chosen to | |||
| skipping to change at page 47, line 20 ¶ | skipping to change at page 47, line 29 ¶ | |||
| represent CR and LF, respectively. | represent CR and LF, respectively. | |||
| Conversion will break any cryptographic checksums applied to the | Conversion will break any cryptographic checksums applied to the | |||
| original content unless the original content is already in canonical | original content unless the original content is already in canonical | |||
| form. Therefore, the canonical form is recommended for any content | form. Therefore, the canonical form is recommended for any content | |||
| that uses such checksums in HTTP. | that uses such checksums in HTTP. | |||
| B.3. Conversion of Date Formats | B.3. Conversion of Date Formats | |||
| HTTP/1.1 uses a restricted set of date formats (Section 5.6.7 of | HTTP/1.1 uses a restricted set of date formats (Section 5.6.7 of | |||
| [Semantics]) to simplify the process of date comparison. Proxies and | [HTTP]) to simplify the process of date comparison. Proxies and | |||
| gateways from other protocols ought to ensure that any Date header | gateways from other protocols ought to ensure that any Date header | |||
| field present in a message conforms to one of the HTTP/1.1 formats | field present in a message conforms to one of the HTTP/1.1 formats | |||
| and rewrite the date if necessary. | and rewrite the date if necessary. | |||
| B.4. Conversion of Content-Encoding | B.4. Conversion of Content-Encoding | |||
| MIME does not include any concept equivalent to HTTP/1.1's Content- | MIME does not include any concept equivalent to HTTP/1.1's Content- | |||
| Encoding header field. Since this acts as a modifier on the media | Encoding header field. Since this acts as a modifier on the media | |||
| type, proxies and gateways from HTTP to MIME-compliant protocols | type, proxies and gateways from HTTP to MIME-compliant protocols | |||
| ought to either change the value of the Content-Type header field or | ought to either change the value of the Content-Type header field or | |||
| skipping to change at page 48, line 14 ¶ | skipping to change at page 48, line 22 ¶ | |||
| B.6. MHTML and Line Length Limitations | B.6. MHTML and Line Length Limitations | |||
| HTTP implementations that share code with MHTML [RFC2557] | HTTP implementations that share code with MHTML [RFC2557] | |||
| implementations need to be aware of MIME line length limitations. | implementations need to be aware of MIME line length limitations. | |||
| Since HTTP does not have this limitation, HTTP does not fold long | Since HTTP does not have this limitation, HTTP does not fold long | |||
| lines. MHTML messages being transported by HTTP follow all | lines. MHTML messages being transported by HTTP follow all | |||
| conventions of MHTML, including line length limitations and folding, | conventions of MHTML, including line length limitations and folding, | |||
| canonicalization, etc., since HTTP transfers message-bodies without | canonicalization, etc., since HTTP transfers message-bodies without | |||
| modification and, aside from the "multipart/byteranges" type | modification and, aside from the "multipart/byteranges" type | |||
| (Section 14.6 of [Semantics]), does not interpret the content or any | (Section 14.6 of [HTTP]), does not interpret the content or any MIME | |||
| MIME header lines that might be contained therein. | header lines that might be contained therein. | |||
| Appendix C. Changes from previous RFCs | Appendix C. Changes from previous RFCs | |||
| C.1. Changes from HTTP/0.9 | C.1. Changes from HTTP/0.9 | |||
| Since HTTP/0.9 did not support header fields in a request, there is | Since HTTP/0.9 did not support header fields in a request, there is | |||
| no mechanism for it to support name-based virtual hosts (selection of | no mechanism for it to support name-based virtual hosts (selection of | |||
| resource by inspection of the Host header field). Any server that | resource by inspection of the Host header field). Any server that | |||
| implements name-based virtual hosts ought to disable support for | implements name-based virtual hosts ought to disable support for | |||
| HTTP/0.9. Most requests that appear to be HTTP/0.9 are, in fact, | HTTP/0.9. Most requests that appear to be HTTP/0.9 are, in fact, | |||
| badly constructed HTTP/1.x requests caused by a client failing to | badly constructed HTTP/1.x requests caused by a client failing to | |||
| properly encode the request-target. | properly encode the request-target. | |||
| C.2. Changes from HTTP/1.0 | C.2. Changes from HTTP/1.0 | |||
| C.2.1. Multihomed Web Servers | C.2.1. Multihomed Web Servers | |||
| The requirements that clients and servers support the Host header | The requirements that clients and servers support the Host header | |||
| field (Section 7.2 of [Semantics]), report an error if it is missing | field (Section 7.2 of [HTTP]), report an error if it is missing from | |||
| from an HTTP/1.1 request, and accept absolute URIs (Section 3.2) are | an HTTP/1.1 request, and accept absolute URIs (Section 3.2) are among | |||
| among the most important changes defined by HTTP/1.1. | the most important changes defined by HTTP/1.1. | |||
| Older HTTP/1.0 clients assumed a one-to-one relationship of IP | Older HTTP/1.0 clients assumed a one-to-one relationship of IP | |||
| addresses and servers; there was no other established mechanism for | addresses and servers; there was no other established mechanism for | |||
| distinguishing the intended server of a request than the IP address | distinguishing the intended server of a request than the IP address | |||
| to which that request was directed. The Host header field was | to which that request was directed. The Host header field was | |||
| introduced during the development of HTTP/1.1 and, though it was | introduced during the development of HTTP/1.1 and, though it was | |||
| quickly implemented by most HTTP/1.0 browsers, additional | quickly implemented by most HTTP/1.0 browsers, additional | |||
| requirements were placed on all HTTP/1.1 requests in order to ensure | requirements were placed on all HTTP/1.1 requests in order to ensure | |||
| complete adoption. At the time of this writing, most HTTP-based | complete adoption. At the time of this writing, most HTTP-based | |||
| services are dependent upon the Host header field for targeting | services are dependent upon the Host header field for targeting | |||
| skipping to change at page 49, line 34 ¶ | skipping to change at page 49, line 37 ¶ | |||
| was also unworkable, because proxies are often deployed in multiple | was also unworkable, because proxies are often deployed in multiple | |||
| layers, bringing about the same problem discussed above. | layers, bringing about the same problem discussed above. | |||
| As a result, clients are encouraged not to send the Proxy-Connection | As a result, clients are encouraged not to send the Proxy-Connection | |||
| header field in any requests. | header field in any requests. | |||
| Clients are also encouraged to consider the use of Connection: keep- | Clients are also encouraged to consider the use of Connection: keep- | |||
| alive in requests carefully; while they can enable persistent | alive in requests carefully; while they can enable persistent | |||
| connections with HTTP/1.0 servers, clients using them will need to | connections with HTTP/1.0 servers, clients using them will need to | |||
| monitor the connection for "hung" requests (which indicate that the | monitor the connection for "hung" requests (which indicate that the | |||
| client ought stop sending the header field), and this mechanism ought | client ought to stop sending the header field), and this mechanism | |||
| not be used by clients at all when a proxy is being used. | ought not be used by clients at all when a proxy is being used. | |||
| C.2.3. Introduction of Transfer-Encoding | C.2.3. Introduction of Transfer-Encoding | |||
| HTTP/1.1 introduces the Transfer-Encoding header field (Section 6.1). | HTTP/1.1 introduces the Transfer-Encoding header field (Section 6.1). | |||
| Transfer codings need to be decoded prior to forwarding an HTTP | Transfer codings need to be decoded prior to forwarding an HTTP | |||
| message over a MIME-compliant protocol. | message over a MIME-compliant protocol. | |||
| C.3. Changes from RFC 7230 | C.3. Changes from RFC 7230 | |||
| Most of the sections introducing HTTP's design goals, history, | Most of the sections introducing HTTP's design goals, history, | |||
| architecture, conformance criteria, protocol versioning, URIs, | architecture, conformance criteria, protocol versioning, URIs, | |||
| message routing, and header fields have been moved to [Semantics]. | message routing, and header fields have been moved to [HTTP]. This | |||
| This document has been reduced to just the messaging syntax and | document has been reduced to just the messaging syntax and connection | |||
| connection management requirements specific to HTTP/1.1. | management requirements specific to HTTP/1.1. | |||
| Bare CRs have been prohibited outside of content. (Section 2.2) | ||||
| Prohibited generation of bare CRs outside of content. (Section 2.2) | ||||
| The ABNF definition of authority-form has changed from the more | The ABNF definition of authority-form has changed from the more | |||
| general authority component of a URI (in which port is optional) to | general authority component of a URI (in which port is optional) to | |||
| the specific host:port format that is required by CONNECT. | the specific host:port format that is required by CONNECT. | |||
| (Section 3.2.3) | (Section 3.2.3) | |||
| Required recipients to avoid smuggling/splitting attacks when | ||||
| processing an ambiguous message framing. (Section 6.1) | ||||
| In the ABNF for chunked extensions, re-introduced (bad) whitespace | In the ABNF for chunked extensions, re-introduced (bad) whitespace | |||
| around ";" and "=". Whitespace was removed in [RFC7230], but that | around ";" and "=". Whitespace was removed in [RFC7230], but that | |||
| change was found to break existing implementations (see [Err4667]). | change was found to break existing implementations (see [Err4667]). | |||
| (Section 7.1.1) | (Section 7.1.1) | |||
| Trailer field semantics now transcend the specifics of chunked | Trailer field semantics now transcend the specifics of chunked | |||
| encoding. The decoding algorithm for chunked (Section 7.1.3) has | encoding. The decoding algorithm for chunked (Section 7.1.3) has | |||
| been updated to encourage storage/forwarding of trailer fields | been updated to encourage storage/forwarding of trailer fields | |||
| separately from the header section, to only allow merging into the | separately from the header section, to only allow merging into the | |||
| header section if the recipient knows the corresponding field | header section if the recipient knows the corresponding field | |||
| skipping to change at page 51, line 8 ¶ | skipping to change at page 51, line 19 ¶ | |||
| * Replace sections listing changes from RFC 2616 by new empty | * Replace sections listing changes from RFC 2616 by new empty | |||
| sections referring to RFC 723x. | sections referring to RFC 723x. | |||
| * Remove acknowledgements specific to RFC 723x. | * Remove acknowledgements specific to RFC 723x. | |||
| * Move "Acknowledgements" to the very end and make them unnumbered. | * Move "Acknowledgements" to the very end and make them unnumbered. | |||
| D.2. Since draft-ietf-httpbis-messaging-00 | D.2. Since draft-ietf-httpbis-messaging-00 | |||
| The changes in this draft are editorial, with respect to HTTP as a | The changes in this draft are editorial, with respect to HTTP as a | |||
| whole, to move all core HTTP semantics into [Semantics]: | whole, to move all core HTTP semantics into [HTTP]: | |||
| * Moved introduction, architecture, conformance, and ABNF extensions | * Moved introduction, architecture, conformance, and ABNF extensions | |||
| from RFC 7230 (Messaging) to semantics [Semantics]. | from RFC 7230 (Messaging) to semantics [HTTP]. | |||
| * Moved discussion of MIME differences from RFC 7231 (Semantics) to | * Moved discussion of MIME differences from RFC 7231 (Semantics) to | |||
| Appendix B since they mostly cover transforming 1.1 messages. | Appendix B since they mostly cover transforming 1.1 messages. | |||
| * Moved all extensibility tips, registration procedures, and | * Moved all extensibility tips, registration procedures, and | |||
| registry tables from the IANA considerations to normative | registry tables from the IANA considerations to normative | |||
| sections, reducing the IANA considerations to just instructions | sections, reducing the IANA considerations to just instructions | |||
| that will be removed prior to publication as an RFC. | that will be removed prior to publication as an RFC. | |||
| D.3. Since draft-ietf-httpbis-messaging-01 | D.3. Since draft-ietf-httpbis-messaging-01 | |||
| skipping to change at page 52, line 35 ¶ | skipping to change at page 52, line 44 ¶ | |||
| * In Section 7, remove the predefined codings from the ABNF and make | * In Section 7, remove the predefined codings from the ABNF and make | |||
| it generic instead (<https://github.com/httpwg/http-core/ | it generic instead (<https://github.com/httpwg/http-core/ | |||
| issues/66>) | issues/66>) | |||
| * Use RFC 7405 ABNF notation for case-sensitive string constants | * Use RFC 7405 ABNF notation for case-sensitive string constants | |||
| (<https://github.com/httpwg/http-core/issues/133>) | (<https://github.com/httpwg/http-core/issues/133>) | |||
| D.6. Since draft-ietf-httpbis-messaging-04 | D.6. Since draft-ietf-httpbis-messaging-04 | |||
| * In Section 7.8 of [Semantics], clarify that protocol-name is to be | * In Section 7.8 of [HTTP], clarify that protocol-name is to be | |||
| matched case-insensitively (<https://github.com/httpwg/http-core/ | matched case-insensitively (<https://github.com/httpwg/http-core/ | |||
| issues/8>) | issues/8>) | |||
| * In Section 5.2, add leading optional whitespace to obs-fold ABNF | * In Section 5.2, add leading optional whitespace to obs-fold ABNF | |||
| (<https://github.com/httpwg/http-core/issues/19>, | (<https://github.com/httpwg/http-core/issues/19>, | |||
| <https://www.rfc-editor.org/errata/eid4189>) | <https://www.rfc-editor.org/errata/eid4189>) | |||
| * In Section 4, add clarifications about empty reason phrases | * In Section 4, add clarifications about empty reason phrases | |||
| (<https://github.com/httpwg/http-core/issues/197>) | (<https://github.com/httpwg/http-core/issues/197>) | |||
| * Move discussion of retries from Section 9.3.1 into [Semantics] | * Move discussion of retries from Section 9.3.1 into [HTTP] | |||
| (<https://github.com/httpwg/http-core/issues/230>) | (<https://github.com/httpwg/http-core/issues/230>) | |||
| D.7. Since draft-ietf-httpbis-messaging-05 | D.7. Since draft-ietf-httpbis-messaging-05 | |||
| * In Section 7.1.2, the trailer part has been renamed the trailer | * In Section 7.1.2, the trailer part has been renamed the trailer | |||
| section (for consistency with the header section) and trailers are | section (for consistency with the header section) and trailers are | |||
| no longer merged as header fields by default, but rather can be | no longer merged as header fields by default, but rather can be | |||
| discarded, kept separate from header fields, or merged with header | discarded, kept separate from header fields, or merged with header | |||
| fields only if understood and defined as being mergeable | fields only if understood and defined as being mergeable | |||
| (<https://github.com/httpwg/http-core/issues/16>) | (<https://github.com/httpwg/http-core/issues/16>) | |||
| * In Section 2.1 and related Sections, move the trailing CRLF from | * In Section 2.1 and related Sections, move the trailing CRLF from | |||
| the line grammars into the message format | the line grammars into the message format | |||
| (<https://github.com/httpwg/http-core/issues/62>) | (<https://github.com/httpwg/http-core/issues/62>) | |||
| * Moved Section 2.3 down (<https://github.com/httpwg/http-core/ | * Moved Section 2.3 down (<https://github.com/httpwg/http-core/ | |||
| issues/68>) | issues/68>) | |||
| * In Section 7.8 of [Semantics], use 'websocket' instead of | * In Section 7.8 of [HTTP], use 'websocket' instead of 'HTTP/2.0' in | |||
| 'HTTP/2.0' in examples (<https://github.com/httpwg/http-core/ | examples (<https://github.com/httpwg/http-core/issues/112>) | |||
| issues/112>) | ||||
| * Move version non-specific text from Section 6 into semantics as | * Move version non-specific text from Section 6 into semantics as | |||
| "payload" (<https://github.com/httpwg/http-core/issues/159>) | "payload" (<https://github.com/httpwg/http-core/issues/159>) | |||
| * In Section 9.8, add text from RFC 2818 | * In Section 9.8, add text from RFC 2818 | |||
| (<https://github.com/httpwg/http-core/issues/236>) | (<https://github.com/httpwg/http-core/issues/236>) | |||
| D.8. Since draft-ietf-httpbis-messaging-06 | D.8. Since draft-ietf-httpbis-messaging-06 | |||
| * In Section 12.4, update the APLN protocol id for HTTP/1.1 | * In Section 12.4, update the ALPN protocol ID for HTTP/1.1 | |||
| (<https://github.com/httpwg/http-core/issues/49>) | (<https://github.com/httpwg/http-core/issues/49>) | |||
| * In Section 5, align with updates to field terminology in semantics | * In Section 5, align with updates to field terminology in semantics | |||
| (<https://github.com/httpwg/http-core/issues/111>) | (<https://github.com/httpwg/http-core/issues/111>) | |||
| * In Section 7.6.1 of [Semantics], clarify that new connection | * In Section 7.6.1 of [HTTP], clarify that new connection options | |||
| options indeed need to be registered (<https://github.com/httpwg/ | indeed need to be registered (<https://github.com/httpwg/http- | |||
| http-core/issues/285>) | core/issues/285>) | |||
| * In Section 1.1, reference RFC 8174 as well | * In Section 1.1, reference RFC 8174 as well | |||
| (<https://github.com/httpwg/http-core/issues/303>) | (<https://github.com/httpwg/http-core/issues/303>) | |||
| D.9. Since draft-ietf-httpbis-messaging-07 | D.9. Since draft-ietf-httpbis-messaging-07 | |||
| * Move TE: trailers into [HTTP] (<https://github.com/httpwg/http- | ||||
| * Move TE: trailers into [Semantics] (<https://github.com/httpwg/ | core/issues/18>) | |||
| http-core/issues/18>) | ||||
| * In Section 6.3, adjust requirements for handling multiple content- | * In Section 6.3, adjust requirements for handling multiple content- | |||
| length values (<https://github.com/httpwg/http-core/issues/59>) | length values (<https://github.com/httpwg/http-core/issues/59>) | |||
| * Throughout, replace "effective request URI" with "target URI" | * Throughout, replace "effective request URI" with "target URI" | |||
| (<https://github.com/httpwg/http-core/issues/259>) | (<https://github.com/httpwg/http-core/issues/259>) | |||
| * In Section 6.1, don't claim Transfer-Encoding is supported by | * In Section 6.1, don't claim Transfer-Encoding is supported by | |||
| HTTP/2 or later (<https://github.com/httpwg/http-core/issues/297>) | HTTP/2 or later (<https://github.com/httpwg/http-core/issues/297>) | |||
| skipping to change at page 54, line 33 ¶ | skipping to change at page 54, line 38 ¶ | |||
| * Switch to xml2rfc v3 mode for draft generation | * Switch to xml2rfc v3 mode for draft generation | |||
| (<https://github.com/httpwg/http-core/issues/394>) | (<https://github.com/httpwg/http-core/issues/394>) | |||
| D.12. Since draft-ietf-httpbis-messaging-10 | D.12. Since draft-ietf-httpbis-messaging-10 | |||
| * In Section 6.3, note that TCP half-close does not delimit a | * In Section 6.3, note that TCP half-close does not delimit a | |||
| request; talk about corresponding server-side behaviour in | request; talk about corresponding server-side behaviour in | |||
| Section 9.6 (<https://github.com/httpwg/http-core/issues/22>) | Section 9.6 (<https://github.com/httpwg/http-core/issues/22>) | |||
| * Moved requirements specific to HTTP/1.1 from [Semantics] into | * Moved requirements specific to HTTP/1.1 from [HTTP] into | |||
| Section 3.2 (<https://github.com/httpwg/http-core/issues/182>) | Section 3.2 (<https://github.com/httpwg/http-core/issues/182>) | |||
| * In Section 6.1 (Transfer-Encoding), adjust ABNF to allow empty | * In Section 6.1 (Transfer-Encoding), adjust ABNF to allow empty | |||
| lists (<https://github.com/httpwg/http-core/issues/210>) | lists (<https://github.com/httpwg/http-core/issues/210>) | |||
| * In Section 9.7, add text from RFC 2818 | * In Section 9.7, add text from RFC 2818 | |||
| (<https://github.com/httpwg/http-core/issues/236>) | (<https://github.com/httpwg/http-core/issues/236>) | |||
| * Moved definitions of "TE" and "Upgrade" into [Semantics] | * Moved definitions of "TE" and "Upgrade" into [HTTP] | |||
| (<https://github.com/httpwg/http-core/issues/392>) | (<https://github.com/httpwg/http-core/issues/392>) | |||
| * Moved definition of "Connection" into [Semantics] | * Moved definition of "Connection" into [HTTP] | |||
| (<https://github.com/httpwg/http-core/issues/407>) | (<https://github.com/httpwg/http-core/issues/407>) | |||
| D.13. Since draft-ietf-httpbis-messaging-11 | D.13. Since draft-ietf-httpbis-messaging-11 | |||
| * Move IANA Upgrade Token Registry instructions to [Semantics] | * Move IANA Upgrade Token Registry instructions to [HTTP] | |||
| (<https://github.com/httpwg/http-core/issues/450>) | (<https://github.com/httpwg/http-core/issues/450>) | |||
| D.14. Since draft-ietf-httpbis-messaging-12 | D.14. Since draft-ietf-httpbis-messaging-12 | |||
| * Moved content of history appendix to Semantics | * Moved content of history appendix to Semantics | |||
| (<https://github.com/httpwg/http-core/issues/451>) | (<https://github.com/httpwg/http-core/issues/451>) | |||
| * Moved note about "close" being reserved as field name to | * Moved note about "close" being reserved as field name to | |||
| Section 9.3 (<https://github.com/httpwg/http-core/issues/500>) | Section 9.3 (<https://github.com/httpwg/http-core/issues/500>) | |||
| * Moved table of transfer codings into Section 12.3 | * Moved table of transfer codings into Section 12.3 | |||
| (<https://github.com/httpwg/http-core/issues/506>) | (<https://github.com/httpwg/http-core/issues/506>) | |||
| * In Section 13.2, updated the URI for the [Linhart] paper | * In Section 13.2, updated the URI for the [Linhart] paper | |||
| (<https://github.com/httpwg/http-core/issues/517>) | (<https://github.com/httpwg/http-core/issues/517>) | |||
| * Changed document title to just "HTTP/1.1" | * Changed document title to just "HTTP/1.1" | |||
| (<https://github.com/httpwg/http-core/issues/524>) | (<https://github.com/httpwg/http-core/issues/524>) | |||
| * In Section 7, moved transfer-coding ABNF to Section 10.1.4 of | * In Section 7, moved transfer-coding ABNF to Section 10.1.4 of | |||
| [Semantics] (<https://github.com/httpwg/http-core/issues/531>) | [HTTP] (<https://github.com/httpwg/http-core/issues/531>) | |||
| * Changed to using "payload data" when defining requirements about | * Changed to using "payload data" when defining requirements about | |||
| the data being conveyed within a message, instead of the terms | the data being conveyed within a message, instead of the terms | |||
| "payload body" or "response body" or "representation body", since | "payload body" or "response body" or "representation body", since | |||
| they often get confused with the HTTP/1.1 message body (which | they often get confused with the HTTP/1.1 message body (which | |||
| includes transfer coding) (<https://github.com/httpwg/http-core/ | includes transfer coding) (<https://github.com/httpwg/http-core/ | |||
| issues/553>) | issues/553>) | |||
| D.15. Since draft-ietf-httpbis-messaging-13 | D.15. Since draft-ietf-httpbis-messaging-13 | |||
| skipping to change at page 56, line 31 ¶ | skipping to change at page 56, line 34 ¶ | |||
| * In Section 3.2.3, changed the ABNF definition of authority-form | * In Section 3.2.3, changed the ABNF definition of authority-form | |||
| from the authority component (in which port is optional) to the | from the authority component (in which port is optional) to the | |||
| host:port format that has always been required by CONNECT | host:port format that has always been required by CONNECT | |||
| (<https://github.com/httpwg/http-core/issues/806>) | (<https://github.com/httpwg/http-core/issues/806>) | |||
| D.17. Since draft-ietf-httpbis-messaging-15 | D.17. Since draft-ietf-httpbis-messaging-15 | |||
| * None. | * None. | |||
| Acknowledgments | D.18. Since draft-ietf-httpbis-messaging-16 | |||
| See Appendix "Acknowledgments" of [Semantics]. | This draft addresses mostly editorial issues raised during or past | |||
| IETF Last Call; see <https://github.com/httpwg/http-core/ | ||||
| issues?q=label%3Ah1-messaging+created%3A%3E2021-05-26> for a summary. | ||||
| Furthermore: | ||||
| * In Section 6.1, require recipients to avoid smuggling/splitting | ||||
| attacks when processing an ambiguous message framing | ||||
| (<https://github.com/httpwg/http-core/issues/879>) | ||||
| Acknowledgements | ||||
| See Appendix "Acknowledgements" of [HTTP]. | ||||
| Index | Index | |||
| A C D F G H M O R T X | A C D F G H M O R T X | |||
| A | A | |||
| absolute-form (of request-target) Section 3.2.2 | absolute-form (of request-target) Section 3.2.2 | |||
| application/http Media Type Section 10.2 | application/http Media Type Section 10.2 | |||
| asterisk-form (of request-target) Section 3.2.4 | asterisk-form (of request-target) Section 3.2.4 | |||
| End of changes. 137 change blocks. | ||||
| 264 lines changed or deleted | 313 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||