draft-ietf-httpbis-messaging-05.txt | draft-ietf-httpbis-messaging-06.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: January 9, 2020 J. Reschke, Ed. | Expires: May 7, 2020 J. Reschke, Ed. | |||
greenbytes | greenbytes | |||
July 8, 2019 | November 4, 2019 | |||
HTTP/1.1 Messaging | HTTP/1.1 Messaging | |||
draft-ietf-httpbis-messaging-05 | draft-ietf-httpbis-messaging-06 | |||
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.6. | The changes in this draft are summarized in Appendix D.7. | |||
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 January 9, 2020. | This Internet-Draft will expire on May 7, 2020. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2019 IETF Trust and the persons identified as the | Copyright (c) 2019 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
skipping to change at page 2, line 43 ¶ | skipping to change at page 2, line 43 ¶ | |||
it for publication as an RFC or to translate it into languages other | it for publication as an RFC or to translate it into languages other | |||
than English. | than English. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
1.1. Requirements Notation . . . . . . . . . . . . . . . . . . 5 | 1.1. Requirements Notation . . . . . . . . . . . . . . . . . . 5 | |||
1.2. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 5 | 1.2. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 5 | |||
2. Message . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 2. Message . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
2.1. Message Format . . . . . . . . . . . . . . . . . . . . . 6 | 2.1. Message Format . . . . . . . . . . . . . . . . . . . . . 6 | |||
2.2. HTTP Version . . . . . . . . . . . . . . . . . . . . . . 7 | 2.2. Message Parsing . . . . . . . . . . . . . . . . . . . . . 7 | |||
2.3. Message Parsing . . . . . . . . . . . . . . . . . . . . . 8 | 2.3. HTTP Version . . . . . . . . . . . . . . . . . . . . . . 8 | |||
3. Request Line . . . . . . . . . . . . . . . . . . . . . . . . 9 | 3. Request Line . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
3.1. Method . . . . . . . . . . . . . . . . . . . . . . . . . 9 | 3.1. Method . . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
3.2. Request Target . . . . . . . . . . . . . . . . . . . . . 10 | 3.2. Request Target . . . . . . . . . . . . . . . . . . . . . 10 | |||
3.2.1. origin-form . . . . . . . . . . . . . . . . . . . . . 10 | 3.2.1. origin-form . . . . . . . . . . . . . . . . . . . . . 10 | |||
3.2.2. absolute-form . . . . . . . . . . . . . . . . . . . . 11 | 3.2.2. absolute-form . . . . . . . . . . . . . . . . . . . . 11 | |||
3.2.3. authority-form . . . . . . . . . . . . . . . . . . . 11 | 3.2.3. authority-form . . . . . . . . . . . . . . . . . . . 11 | |||
3.2.4. asterisk-form . . . . . . . . . . . . . . . . . . . . 12 | 3.2.4. asterisk-form . . . . . . . . . . . . . . . . . . . . 11 | |||
3.3. Effective Request URI . . . . . . . . . . . . . . . . . . 12 | 3.3. Effective Request URI . . . . . . . . . . . . . . . . . . 12 | |||
4. Status Line . . . . . . . . . . . . . . . . . . . . . . . . . 14 | 4. Status Line . . . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
5. Header Fields . . . . . . . . . . . . . . . . . . . . . . . . 15 | 5. Header Field Syntax . . . . . . . . . . . . . . . . . . . . . 14 | |||
5.1. Header Field Parsing . . . . . . . . . . . . . . . . . . 15 | 5.1. Header Field Parsing . . . . . . . . . . . . . . . . . . 15 | |||
5.2. Obsolete Line Folding . . . . . . . . . . . . . . . . . . 16 | 5.2. Obsolete Line Folding . . . . . . . . . . . . . . . . . . 16 | |||
6. Message Body . . . . . . . . . . . . . . . . . . . . . . . . 17 | 6. Message Body . . . . . . . . . . . . . . . . . . . . . . . . 16 | |||
6.1. Transfer-Encoding . . . . . . . . . . . . . . . . . . . . 17 | 6.1. Transfer-Encoding . . . . . . . . . . . . . . . . . . . . 17 | |||
6.2. Content-Length . . . . . . . . . . . . . . . . . . . . . 19 | 6.2. Content-Length . . . . . . . . . . . . . . . . . . . . . 18 | |||
6.3. Message Body Length . . . . . . . . . . . . . . . . . . . 19 | 6.3. Message Body Length . . . . . . . . . . . . . . . . . . . 19 | |||
7. Transfer Codings . . . . . . . . . . . . . . . . . . . . . . 21 | 7. Transfer Codings . . . . . . . . . . . . . . . . . . . . . . 21 | |||
7.1. Chunked Transfer Coding . . . . . . . . . . . . . . . . . 22 | 7.1. Chunked Transfer Coding . . . . . . . . . . . . . . . . . 22 | |||
7.1.1. Chunk Extensions . . . . . . . . . . . . . . . . . . 23 | 7.1.1. Chunk Extensions . . . . . . . . . . . . . . . . . . 23 | |||
7.1.2. Chunked Trailer Part . . . . . . . . . . . . . . . . 24 | 7.1.2. Chunked Trailer Section . . . . . . . . . . . . . . . 23 | |||
7.1.3. Decoding Chunked . . . . . . . . . . . . . . . . . . 25 | 7.1.3. Decoding Chunked . . . . . . . . . . . . . . . . . . 24 | |||
7.2. Transfer Codings for Compression . . . . . . . . . . . . 25 | 7.2. Transfer Codings for Compression . . . . . . . . . . . . 24 | |||
7.3. Transfer Coding Registry . . . . . . . . . . . . . . . . 26 | 7.3. Transfer Coding Registry . . . . . . . . . . . . . . . . 25 | |||
7.4. TE . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 | 7.4. TE . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 | |||
8. Handling Incomplete Messages . . . . . . . . . . . . . . . . 27 | 8. Handling Incomplete Messages . . . . . . . . . . . . . . . . 27 | |||
9. Connection Management . . . . . . . . . . . . . . . . . . . . 28 | 9. Connection Management . . . . . . . . . . . . . . . . . . . . 27 | |||
9.1. Connection . . . . . . . . . . . . . . . . . . . . . . . 29 | 9.1. Connection . . . . . . . . . . . . . . . . . . . . . . . 28 | |||
9.2. Establishment . . . . . . . . . . . . . . . . . . . . . . 30 | 9.2. Establishment . . . . . . . . . . . . . . . . . . . . . . 29 | |||
9.3. Associating a Response to a Request . . . . . . . . . . . 30 | 9.3. Associating a Response to a Request . . . . . . . . . . . 29 | |||
9.4. Persistence . . . . . . . . . . . . . . . . . . . . . . . 31 | 9.4. Persistence . . . . . . . . . . . . . . . . . . . . . . . 30 | |||
9.4.1. Retrying Requests . . . . . . . . . . . . . . . . . . 32 | 9.4.1. Retrying Requests . . . . . . . . . . . . . . . . . . 31 | |||
9.4.2. Pipelining . . . . . . . . . . . . . . . . . . . . . 32 | 9.4.2. Pipelining . . . . . . . . . . . . . . . . . . . . . 31 | |||
9.5. Concurrency . . . . . . . . . . . . . . . . . . . . . . . 33 | 9.5. Concurrency . . . . . . . . . . . . . . . . . . . . . . . 32 | |||
9.6. Failures and Timeouts . . . . . . . . . . . . . . . . . . 33 | 9.6. Failures and Timeouts . . . . . . . . . . . . . . . . . . 32 | |||
9.7. Tear-down . . . . . . . . . . . . . . . . . . . . . . . . 34 | 9.7. Tear-down . . . . . . . . . . . . . . . . . . . . . . . . 33 | |||
9.8. Upgrade . . . . . . . . . . . . . . . . . . . . . . . . . 35 | 9.8. TLS Connection Closure . . . . . . . . . . . . . . . . . 34 | |||
9.8.1. Upgrade Protocol Names . . . . . . . . . . . . . . . 37 | 9.9. Upgrade . . . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
9.8.2. Upgrade Token Registry . . . . . . . . . . . . . . . 38 | 9.9.1. Upgrade Protocol Names . . . . . . . . . . . . . . . 37 | |||
9.9.2. Upgrade Token Registry . . . . . . . . . . . . . . . 38 | ||||
10. Enclosing Messages as Data . . . . . . . . . . . . . . . . . 38 | 10. Enclosing Messages as Data . . . . . . . . . . . . . . . . . 38 | |||
10.1. Media Type message/http . . . . . . . . . . . . . . . . 38 | 10.1. Media Type message/http . . . . . . . . . . . . . . . . 38 | |||
10.2. Media Type application/http . . . . . . . . . . . . . . 40 | 10.2. Media Type application/http . . . . . . . . . . . . . . 40 | |||
11. Security Considerations . . . . . . . . . . . . . . . . . . . 41 | 11. Security Considerations . . . . . . . . . . . . . . . . . . . 41 | |||
11.1. Response Splitting . . . . . . . . . . . . . . . . . . . 41 | 11.1. Response Splitting . . . . . . . . . . . . . . . . . . . 41 | |||
11.2. Request Smuggling . . . . . . . . . . . . . . . . . . . 42 | 11.2. Request Smuggling . . . . . . . . . . . . . . . . . . . 42 | |||
11.3. Message Integrity . . . . . . . . . . . . . . . . . . . 42 | 11.3. Message Integrity . . . . . . . . . . . . . . . . . . . 42 | |||
11.4. Message Confidentiality . . . . . . . . . . . . . . . . 43 | 11.4. Message Confidentiality . . . . . . . . . . . . . . . . 43 | |||
12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 43 | 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 43 | |||
12.1. Header Field Registration . . . . . . . . . . . . . . . 43 | 12.1. Header Field Registration . . . . . . . . . . . . . . . 43 | |||
skipping to change at page 4, line 21 ¶ | skipping to change at page 4, line 23 ¶ | |||
Appendix C. HTTP Version History . . . . . . . . . . . . . . . . 50 | Appendix C. HTTP Version History . . . . . . . . . . . . . . . . 50 | |||
C.1. Changes from HTTP/1.0 . . . . . . . . . . . . . . . . . . 51 | C.1. Changes from HTTP/1.0 . . . . . . . . . . . . . . . . . . 51 | |||
C.1.1. Multihomed Web Servers . . . . . . . . . . . . . . . 51 | C.1.1. Multihomed Web Servers . . . . . . . . . . . . . . . 51 | |||
C.1.2. Keep-Alive Connections . . . . . . . . . . . . . . . 52 | C.1.2. Keep-Alive Connections . . . . . . . . . . . . . . . 52 | |||
C.1.3. Introduction of Transfer-Encoding . . . . . . . . . . 52 | C.1.3. Introduction of Transfer-Encoding . . . . . . . . . . 52 | |||
C.2. Changes from RFC 7230 . . . . . . . . . . . . . . . . . . 52 | C.2. Changes from RFC 7230 . . . . . . . . . . . . . . . . . . 52 | |||
Appendix D. Change Log . . . . . . . . . . . . . . . . . . . . . 53 | Appendix D. Change Log . . . . . . . . . . . . . . . . . . . . . 53 | |||
D.1. Between RFC7230 and draft 00 . . . . . . . . . . . . . . 53 | D.1. Between RFC7230 and draft 00 . . . . . . . . . . . . . . 53 | |||
D.2. Since draft-ietf-httpbis-messaging-00 . . . . . . . . . . 53 | D.2. Since draft-ietf-httpbis-messaging-00 . . . . . . . . . . 53 | |||
D.3. Since draft-ietf-httpbis-messaging-01 . . . . . . . . . . 54 | D.3. Since draft-ietf-httpbis-messaging-01 . . . . . . . . . . 54 | |||
D.4. Since draft-ietf-httpbis-messaging-02 . . . . . . . . . . 54 | D.4. Since draft-ietf-httpbis-messaging-02 . . . . . . . . . . 55 | |||
D.5. Since draft-ietf-httpbis-messaging-03 . . . . . . . . . . 55 | D.5. Since draft-ietf-httpbis-messaging-03 . . . . . . . . . . 55 | |||
D.6. Since draft-ietf-httpbis-messaging-04 . . . . . . . . . . 55 | D.6. Since draft-ietf-httpbis-messaging-04 . . . . . . . . . . 55 | |||
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 | D.7. Since draft-ietf-httpbis-messaging-05 . . . . . . . . . . 55 | |||
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 57 | Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 57 | Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 58 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 58 | ||||
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 is defined by a series of | hypertext information systems. HTTP is defined by a series of | |||
documents that collectively form the HTTP/1.1 specification: | documents that collectively form the HTTP/1.1 specification: | |||
o "HTTP Semantics" [Semantics] | o "HTTP Semantics" [Semantics] | |||
skipping to change at page 5, line 22 ¶ | skipping to change at page 5, line 25 ¶ | |||
Conformance criteria and considerations regarding error handling are | Conformance criteria and considerations regarding error handling are | |||
defined in Section 3 of [Semantics]. | defined in Section 3 of [Semantics]. | |||
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 11 of [Semantics], | It also uses a list extension, defined in Section 12 of [Semantics], | |||
that allows for compact definition of comma-separated lists using a | that allows for compact definition of comma-separated lists using a | |||
'#' operator (similar to how the '*' operator indicates repetition). | '#' operator (similar to how the '*' operator indicates repetition). | |||
Appendix A shows the collected grammar with all list operators | Appendix A shows the collected grammar with all list 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 [Semantics]: | |||
BWS = <BWS, see [Semantics], Section 4.3> | BWS = <BWS, see [Semantics], Section 11.1> | |||
OWS = <OWS, see [Semantics], Section 4.3> | OWS = <OWS, see [Semantics], Section 11.1> | |||
RWS = <RWS, see [Semantics], Section 4.3> | RWS = <RWS, see [Semantics], Section 11.1> | |||
absolute-URI = <absolute-URI, see [RFC3986], Section 4.3> | absolute-URI = <absolute-URI, see [RFC3986], Section 4.3> | |||
absolute-path = <absolute-path, see [Semantics], Section 2.4> | absolute-path = <absolute-path, see [Semantics], Section 2.4> | |||
authority = <authority, see [RFC3986], Section 3.2> | authority = <authority, see [RFC3986], Section 3.2> | |||
comment = <comment, see [Semantics], Section 4.2.3> | comment = <comment, see [Semantics], Section 4.2.3.3> | |||
field-name = <field-name, see [Semantics], Section 4.2> | field-name = <field-name, see [Semantics], Section 4.1> | |||
field-value = <field-value, see [Semantics], Section 4.2> | field-value = <field-value, see [Semantics], Section 4.2> | |||
obs-text = <obs-text, see [Semantics], Section 4.2.3> | obs-text = <obs-text, see [Semantics], Section 4.2.3.2> | |||
port = <port, see [RFC3986], Section 3.2.3> | port = <port, see [RFC3986], Section 3.2.3> | |||
query = <query, see [RFC3986], Section 3.4> | query = <query, see [RFC3986], Section 3.4> | |||
quoted-string = <quoted-string, see [Semantics], Section 4.2.3> | quoted-string = <quoted-string, see [Semantics], Section 4.2.3.2> | |||
token = <token, see [Semantics], Section 4.2.3> | token = <token, see [Semantics], Section 4.2.3.1> | |||
uri-host = <host, see [RFC3986], Section 3.2.2> | uri-host = <host, see [RFC3986], Section 3.2.2> | |||
2. Message | 2. Message | |||
2.1. Message Format | 2.1. Message Format | |||
All HTTP/1.1 messages consist of a start-line followed by a sequence | An HTTP/1.1 message consists of a start-line followed by a CRLF and a | |||
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 fields (collectively referred to as | [RFC5322]: zero or more header fields (collectively referred to as | |||
the "headers" or the "header section"), an empty line indicating the | the "headers" or the "header section"), an empty line indicating the | |||
end of the header section, and an optional message body. | end of the header section, and an optional message body. | |||
HTTP-message = start-line | HTTP-message = start-line CRLF | |||
*( header-field CRLF ) | *( header-field CRLF ) | |||
CRLF | CRLF | |||
[ message-body ] | [ message-body ] | |||
An HTTP message can be either a request from client to server or a | A message can be either a request from client to server or a response | |||
response from server to client. Syntactically, the two types of | from server to client. Syntactically, the two types of message | |||
message differ only in the start-line, which is either a request-line | differ only in the start-line, which is either a request-line (for | |||
(for requests) or a status-line (for responses), and in the algorithm | requests) or a status-line (for responses), and in the algorithm for | |||
for 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 | Although HTTP makes use of some protocol elements similar to the | |||
Multipurpose Internet Mail Extensions (MIME) [RFC2045], see | Multipurpose Internet Mail Extensions (MIME) [RFC2045], see | |||
Appendix B for the differences between HTTP and MIME messages. | Appendix B for the differences between HTTP and MIME messages. | |||
2.2. HTTP Version | 2.2. Message Parsing | |||
HTTP uses a "<major>.<minor>" numbering scheme to indicate versions | ||||
of the protocol. This specification defines version "1.1". | ||||
Section 3.5 of [Semantics] specifies the semantics of HTTP version | ||||
numbers. | ||||
The version of an HTTP/1.x message is indicated by an HTTP-version | ||||
field in the start-line. HTTP-version is case-sensitive. | ||||
HTTP-version = HTTP-name "/" DIGIT "." DIGIT | ||||
HTTP-name = %s"HTTP" | ||||
When an HTTP/1.1 message is sent to an HTTP/1.0 recipient [RFC1945] | ||||
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 | ||||
message if all of the newer features are ignored. This specification | ||||
places recipient-version requirements on some new features so that a | ||||
conformant sender will only use compatible features until it has | ||||
determined, through configuration or the receipt of a message, that | ||||
the recipient supports HTTP/1.1. | ||||
Intermediaries that process HTTP messages (i.e., all intermediaries | ||||
other than those acting as tunnels) MUST send their own HTTP-version | ||||
in forwarded messages. In other words, they are not allowed to | ||||
blindly forward the start-line without ensuring that the protocol | ||||
version in that message matches a version to which that intermediary | ||||
is conformant for both the receiving and sending of messages. | ||||
Forwarding an HTTP message without rewriting the HTTP-version might | ||||
result in communication errors when downstream recipients use the | ||||
message sender's version to determine what features are safe to use | ||||
for later communication with that sender. | ||||
A server MAY send an HTTP/1.0 response to an HTTP/1.1 request if it | ||||
is known or suspected that the client incorrectly implements the HTTP | ||||
specification and is incapable of correctly processing later version | ||||
responses, such as when a client fails to parse the version number | ||||
correctly or when an intermediary is known to blindly forward the | ||||
HTTP-version even when it doesn't conform to the given minor version | ||||
of the protocol. Such protocol downgrades SHOULD NOT be performed | ||||
unless triggered by specific client attributes, such as when one or | ||||
more of the request header fields (e.g., User-Agent) uniquely match | ||||
the values sent by a client known to be in error. | ||||
2.3. 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 into a hash table | start-line into a structure, read each header field into a hash table | |||
by field name until the empty line, and then use the parsed data to | 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 has been | 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 octets | 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 closed. | equal to the message body length is read or the connection is closed. | |||
A recipient MUST parse an HTTP message as a sequence of octets in an | A recipient MUST parse an HTTP message as a sequence of octets in an | |||
encoding that is a superset of US-ASCII [USASCII]. Parsing an HTTP | encoding that is a superset of US-ASCII [USASCII]. Parsing an HTTP | |||
skipping to change at page 9, line 14 ¶ | skipping to change at page 8, line 14 ¶ | |||
interpret the same message differently. Likewise, the presence of | interpret the same message differently. Likewise, the presence of | |||
such whitespace in a response might be ignored by some clients or | such whitespace in a response might be ignored by some clients or | |||
cause others to cease parsing. | cause others to cease parsing. | |||
When a server listening only for HTTP request messages, or processing | When a server listening only for HTTP request messages, or processing | |||
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. | SHOULD respond with a 400 (Bad Request) response. | |||
2.3. HTTP Version | ||||
HTTP uses a "<major>.<minor>" numbering scheme to indicate versions | ||||
of the protocol. This specification defines version "1.1". | ||||
Section 3.5 of [Semantics] specifies the semantics of HTTP version | ||||
numbers. | ||||
The version of an HTTP/1.x message is indicated by an HTTP-version | ||||
field in the start-line. HTTP-version is case-sensitive. | ||||
HTTP-version = HTTP-name "/" DIGIT "." DIGIT | ||||
HTTP-name = %s"HTTP" | ||||
When an HTTP/1.1 message is sent to an HTTP/1.0 recipient [RFC1945] | ||||
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 | ||||
message if all of the newer features are ignored. This specification | ||||
places recipient-version requirements on some new features so that a | ||||
conformant sender will only use compatible features until it has | ||||
determined, through configuration or the receipt of a message, that | ||||
the recipient supports HTTP/1.1. | ||||
Intermediaries that process HTTP messages (i.e., all intermediaries | ||||
other than those acting as tunnels) MUST send their own HTTP-version | ||||
in forwarded messages. In other words, they are not allowed to | ||||
blindly forward the start-line without ensuring that the protocol | ||||
version in that message matches a version to which that intermediary | ||||
is conformant for both the receiving and sending of messages. | ||||
Forwarding an HTTP message without rewriting the HTTP-version might | ||||
result in communication errors when downstream recipients use the | ||||
message sender's version to determine what features are safe to use | ||||
for later communication with that sender. | ||||
A server MAY send an HTTP/1.0 response to an HTTP/1.1 request if it | ||||
is known or suspected that the client incorrectly implements the HTTP | ||||
specification and is incapable of correctly processing later version | ||||
responses, such as when a client fails to parse the version number | ||||
correctly or when an intermediary is known to blindly forward the | ||||
HTTP-version even when it doesn't conform to the given minor version | ||||
of the protocol. Such protocol downgrades SHOULD NOT be performed | ||||
unless triggered by specific client attributes, such as when one or | ||||
more of the request header fields (e.g., User-Agent) uniquely match | ||||
the values sent by a client known to be in error. | ||||
3. Request Line | 3. Request Line | |||
A request-line begins with a method token, followed by a single space | A request-line begins with a method token, followed by a single space | |||
(SP), the request-target, another single space (SP), the protocol | (SP), the request-target, another single space (SP), and ends with | |||
version, and ends with CRLF. | the protocol version. | |||
request-line = method SP request-target SP HTTP-version CRLF | request-line = method SP request-target SP HTTP-version | |||
Although the request-line grammar rule requires that each of the | Although the request-line grammar rule requires that each of the | |||
component elements be separated by a single SP octet, recipients MAY | component elements be separated by a single SP octet, recipients MAY | |||
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 | |||
skipping to change at page 14, line 9 ¶ | skipping to change at page 13, line 47 ¶ | |||
Recipients of an HTTP/1.0 request that lacks a Host header field | Recipients of an HTTP/1.0 request that lacks a Host header field | |||
might need to use heuristics (e.g., examination of the URI path for | might need to use heuristics (e.g., examination of the URI path for | |||
something unique to a particular host) in order to guess the | something unique to a particular host) in order to guess the | |||
effective request URI's authority component. | effective request URI's authority component. | |||
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, an OPTIONAL textual phrase describing the status code, and | space, and ending with an OPTIONAL textual phrase describing the | |||
ending with CRLF. | status code. | |||
status-line = HTTP-version SP status-code SP [reason-phrase] CRLF | status-line = HTTP-version SP status-code SP [reason-phrase] | |||
Although the status-line grammar rule requires that each of the | Although the status-line grammar rule requires that each of the | |||
component elements be separated by a single SP octet, recipients MAY | component elements be separated by a single SP octet, recipients MAY | |||
instead parse on whitespace-delimited word boundaries and, aside from | instead parse on whitespace-delimited word boundaries and, aside from | |||
the line terminator, treat any form of whitespace as the SP separator | the line 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 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 | |||
skipping to change at page 15, line 5 ¶ | skipping to change at page 14, line 43 ¶ | |||
reason-phrase = 1*( HTAB / SP / VCHAR / obs-text ) | reason-phrase = 1*( HTAB / SP / VCHAR / obs-text ) | |||
A client SHOULD ignore the reason-phrase content because it is not a | A client SHOULD ignore the reason-phrase content because it is not a | |||
reliable channel for information (it might be translated for a given | reliable channel for information (it might be translated for a given | |||
locale, overwritten by intermediaries, or discarded when the message | locale, overwritten by intermediaries, or discarded when the message | |||
is forwarded via other versions of HTTP). A server MUST send the | is forwarded via other versions of HTTP). A server MUST send the | |||
space that separates status-code from the reason-phrase even when the | space that separates status-code from the reason-phrase even when the | |||
reason-phrase is absent (i.e., the status-line would end with the | reason-phrase is absent (i.e., the status-line would end with the | |||
three octets SP CR LF). | three octets SP CR LF). | |||
5. Header Fields | 5. Header Field Syntax | |||
Each header field consists of a case-insensitive field name followed | Each header field consists of a case-insensitive field name followed | |||
by a colon (":"), optional leading whitespace, the field value, and | by a colon (":"), optional leading whitespace, the field value, and | |||
optional trailing whitespace. | optional trailing whitespace. | |||
header-field = field-name ":" OWS field-value OWS | header-field = 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 4 of [Semantics]. This section covers the | are defined in Section 4 of [Semantics]. This section covers the | |||
generic syntax for header field inclusion within, and extraction | generic syntax for header field inclusion within, and extraction | |||
skipping to change at page 15, line 27 ¶ | skipping to change at page 15, line 16 ¶ | |||
are defined by this document because they are specific to HTTP/1.1 | are defined by this document because they are specific to HTTP/1.1 | |||
message processing: | message processing: | |||
+-------------------+----------+---------------+ | +-------------------+----------+---------------+ | |||
| Header Field Name | Status | Reference | | | Header Field Name | Status | Reference | | |||
+-------------------+----------+---------------+ | +-------------------+----------+---------------+ | |||
| Connection | standard | Section 9.1 | | | Connection | standard | Section 9.1 | | |||
| MIME-Version | standard | Appendix B.1 | | | MIME-Version | standard | Appendix B.1 | | |||
| TE | standard | Section 7.4 | | | TE | standard | Section 7.4 | | |||
| Transfer-Encoding | standard | Section 6.1 | | | Transfer-Encoding | standard | Section 6.1 | | |||
| Upgrade | standard | Section 9.8 | | | Upgrade | standard | Section 9.9 | | |||
+-------------------+----------+---------------+ | +-------------------+----------+---------------+ | |||
Table 1 | Table 1 | |||
Furthermore, the field name "Close" is reserved, since using that | Furthermore, the field name "Close" is reserved, since using that | |||
name as an HTTP header field might conflict with the "close" | name as an HTTP header field might conflict with the "close" | |||
connection option of the Connection header field (Section 9.1). | connection option of the Connection header field (Section 9.1). | |||
+-------------------+----------+----------+------------+ | +-------------------+----------+----------+------------+ | |||
| Header Field Name | Protocol | Status | Reference | | | Header Field Name | Protocol | Status | Reference | | |||
skipping to change at page 17, line 10 ¶ | skipping to change at page 16, line 47 ¶ | |||
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 obs- | not within a message/http container MUST replace each received obs- | |||
fold with one or more SP octets prior to interpreting the field | 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 message is used to carry the | The message body (if any) of an HTTP message is used to carry the | |||
payload body of that request or response. The message body is | payload body (Section 6.3.3 of [Semantics]) of that request or | |||
identical to the payload body unless a transfer coding has been | response. The message body is identical to the payload body unless a | |||
applied, as described in Section 6.1. | transfer coding has been applied, as described in Section 6.1. | |||
message-body = *OCTET | message-body = *OCTET | |||
The rules for when a message body is allowed in a message differ for | The rules for determining when a message body is present in an | |||
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 Content- | The presence of a message body in a request is signaled by a Content- | |||
Length or Transfer-Encoding header field. Request message framing is | Length or Transfer-Encoding header field. Request message framing is | |||
independent of method semantics, even if the method does not define | independent of method semantics, even if the method does not define | |||
any use for a message body. | any use for a message body. | |||
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). Responses to the HEAD request method (Section 7.3.2 of | (Section 4), and corresponds to when a payload body is allowed; see | |||
[Semantics]) never include a message body because the associated | Section 6.3.3 of [Semantics]. | |||
response header fields (e.g., Transfer-Encoding, Content-Length, | ||||
etc.), if present, indicate only what their values would have been if | ||||
the request method had been GET (Section 7.3.1 of [Semantics]). 2xx | ||||
(Successful) responses to a CONNECT request method (Section 7.3.6 of | ||||
[Semantics]) switch to tunnel mode instead of having a message body. | ||||
All 1xx (Informational), 204 (No Content), and 304 (Not Modified) | ||||
responses do not include a message body. All other responses do | ||||
include a message body, although the body might be of zero length. | ||||
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 payload body in order to form the message | will be) applied to the payload body in order to form the message | |||
body. Transfer codings are defined in Section 7. | body. Transfer codings are defined in Section 7. | |||
Transfer-Encoding = 1#transfer-coding | Transfer-Encoding = 1#transfer-coding | |||
skipping to change at page 22, line 15 ¶ | skipping to change at page 22, line 8 ¶ | |||
transfer-parameter = token BWS "=" BWS ( token / quoted-string ) | transfer-parameter = token BWS "=" BWS ( token / quoted-string ) | |||
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 TE (Section 7.4) and Transfer- | Section 7.3. They are used in the TE (Section 7.4) and Transfer- | |||
Encoding (Section 6.1) header fields. | Encoding (Section 6.1) header fields. | |||
+------------+------------------------------------------+-----------+ | +------------+------------------------------------------+-----------+ | |||
| Name | Description | Reference | | | Name | Description | Reference | | |||
+------------+------------------------------------------+-----------+ | +------------+------------------------------------------+-----------+ | |||
| chunked | Transfer in a series of chunks | Section | | | chunked | Transfer in a series of chunks | Section 7 | | |||
| | | 7.1 | | | | | .1 | | |||
| compress | UNIX "compress" data format [Welch] | Section | | | compress | UNIX "compress" data format [Welch] | Section 7 | | |||
| | | 7.2 | | | | | .2 | | |||
| deflate | "deflate" compressed data ([RFC1951]) | Section | | | deflate | "deflate" compressed data ([RFC1951]) | Section 7 | | |||
| | inside the "zlib" data format | 7.2 | | | | inside the "zlib" data format | .2 | | |||
| | ([RFC1950]) | | | | | ([RFC1950]) | | | |||
| gzip | GZIP file format [RFC1952] | Section | | | gzip | GZIP file format [RFC1952] | Section 7 | | |||
| | | 7.2 | | | | | .2 | | |||
| trailers | (reserved) | Section 7 | | | trailers | (reserved) | Section 7 | | |||
| x-compress | Deprecated (alias for compress) | Section | | | x-compress | Deprecated (alias for compress) | Section 7 | | |||
| | | 7.2 | | | | | .2 | | |||
| x-gzip | Deprecated (alias for gzip) | Section | | | x-gzip | Deprecated (alias for gzip) | Section 7 | | |||
| | | 7.2 | | | | | .2 | | |||
+------------+------------------------------------------+-----------+ | +------------+------------------------------------------+-----------+ | |||
Table 2 | Table 2 | |||
Note: the coding name "trailers" is reserved because it would | Note: the coding name "trailers" is reserved because its use would | |||
clash with the use of the keyword "trailers" in the TE header | conflict with the keyword "trailers" in the TE header field | |||
field (Section 7.4). | (Section 7.4). | |||
7.1. Chunked Transfer Coding | 7.1. Chunked Transfer Coding | |||
The chunked transfer coding wraps the payload body in order to | The chunked transfer coding wraps the payload body in order to | |||
transfer it as a series of chunks, each with its own size indicator, | transfer it as a series of chunks, each with its own size indicator, | |||
followed by an OPTIONAL trailer containing header fields. Chunked | followed by an OPTIONAL trailer section containing trailer fields. | |||
enables content streams of unknown size to be transferred as a | Chunked enables content streams of unknown size to be transferred as | |||
sequence of length-delimited buffers, which enables the sender to | a sequence of length-delimited buffers, which enables the sender to | |||
retain connection persistence and the recipient to know when it has | retain connection persistence and the recipient to know when it has | |||
received the entire message. | received the entire message. | |||
chunked-body = *chunk | chunked-body = *chunk | |||
last-chunk | last-chunk | |||
trailer-part | trailer-section | |||
CRLF | CRLF | |||
chunk = chunk-size [ chunk-ext ] CRLF | chunk = chunk-size [ chunk-ext ] CRLF | |||
chunk-data CRLF | chunk-data CRLF | |||
chunk-size = 1*HEXDIG | chunk-size = 1*HEXDIG | |||
last-chunk = 1*("0") [ chunk-ext ] CRLF | last-chunk = 1*("0") [ chunk-ext ] CRLF | |||
chunk-data = 1*OCTET ; a sequence of chunk-size octets | chunk-data = 1*OCTET ; a sequence of chunk-size octets | |||
The chunk-size field is a string of hex digits indicating the size of | The chunk-size field is a string of hex digits indicating the size of | |||
the chunk-data in octets. The chunked transfer coding is complete | the chunk-data in octets. The chunked transfer coding is complete | |||
when a chunk with a chunk-size of zero is received, possibly followed | when a chunk with a chunk-size of zero is received, possibly followed | |||
by a trailer, 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. | |||
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 | |||
skipping to change at page 24, line 7 ¶ | skipping to change at page 23, line 44 ¶ | |||
server can have shared expectations regarding the use of chunk | server can have shared expectations regarding the use of chunk | |||
extensions) or for padding within an end-to-end secured connection. | extensions) or for padding within an end-to-end secured connection. | |||
A recipient MUST ignore unrecognized chunk extensions. A server | A recipient MUST ignore unrecognized chunk extensions. A server | |||
ought to limit the total length of chunk extensions received in a | ought to limit the total length of chunk extensions received in a | |||
request to an amount reasonable for the services provided, in the | request to an amount reasonable for the services provided, in the | |||
same way that it applies length limitations and timeouts for other | same way that it applies length limitations and timeouts for other | |||
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 Part | 7.1.2. Chunked Trailer Section | |||
A trailer allows the sender to include additional fields at the end | A trailer section allows the sender to include additional fields at | |||
of a chunked message in order to supply metadata that might be | the end of a chunked message in order to supply metadata that might | |||
dynamically generated while the message body is sent, such as a | be dynamically generated while the message body is sent, such as a | |||
message integrity check, digital signature, or post-processing | message integrity check, digital signature, or post-processing | |||
status. The trailer fields are identical to header fields, except | status. The proper use and limitations of trailer fields are defined | |||
they are sent in a chunked trailer instead of the message's header | in Section 4.3 of [Semantics]. | |||
section. | ||||
trailer-part = *( header-field CRLF ) | ||||
A sender MUST NOT generate a trailer that contains a field necessary | ||||
for message framing (e.g., Transfer-Encoding and Content-Length), | ||||
routing (e.g., Host), request modifiers (e.g., controls and | ||||
conditionals in Section 8 of [Semantics]), authentication (e.g., see | ||||
Section 8.5 of [Semantics] and [RFC6265]), response control data | ||||
(e.g., see Section 10.1 of [Semantics]), or determining how to | ||||
process the payload (e.g., Content-Encoding, Content-Type, Content- | ||||
Range, and Trailer). | ||||
When a chunked message containing a non-empty trailer is received, | ||||
the recipient MAY process the fields (aside from those forbidden | ||||
above) as if they were appended to the message's header section. A | ||||
recipient MUST ignore (or consider as an error) any fields that are | ||||
forbidden to be sent in a trailer, since processing them as if they | ||||
were present in the header section might bypass external security | ||||
filters. | ||||
Unless the request includes a TE header field indicating "trailers" | trailer-section = *( header-field CRLF ) | |||
is acceptable, as described in Section 7.4, a server SHOULD NOT | ||||
generate trailer fields that it believes are necessary for the user | ||||
agent to receive. Without a TE containing "trailers", the server | ||||
ought to assume that the trailer fields might be silently discarded | ||||
along the path to the user agent. This requirement allows | ||||
intermediaries to forward a de-chunked message to an HTTP/1.0 | ||||
recipient without buffering the entire response. | ||||
When a message includes a message body encoded with the chunked | A recipient that decodes and removes the chunked encoding from a | |||
transfer coding and the sender desires to send metadata in the form | message (e.g., for storage or forwarding to a non-HTTP/1.1 peer) MUST | |||
of trailer fields at the end of the message, the sender SHOULD | discard any received trailer fields, store/forward them separately | |||
generate a Trailer header field before the message body to indicate | from the header fields, or selectively merge into the header section | |||
which fields will be present in the trailers. This allows the | only those trailer fields corresponding to header field definitions | |||
recipient to prepare for receipt of that metadata before it starts | that are understood by the recipient to explicitly permit and define | |||
processing the body, which is useful if the message is being streamed | how their corresponding trailer field value can be safely merged. | |||
and the recipient wishes to confirm an integrity check on the fly. | ||||
7.1.3. Decoding Chunked | 7.1.3. Decoding Chunked | |||
A process for decoding the chunked transfer coding can be represented | A process for decoding the chunked transfer coding can be represented | |||
in pseudo-code as: | in pseudo-code as: | |||
length := 0 | length := 0 | |||
read chunk-size, chunk-ext (if any), and CRLF | read chunk-size, chunk-ext (if any), and CRLF | |||
while (chunk-size > 0) { | while (chunk-size > 0) { | |||
read chunk-data and CRLF | read chunk-data and CRLF | |||
append chunk-data to decoded-body | append chunk-data to decoded-body | |||
length := length + chunk-size | length := length + chunk-size | |||
read chunk-size, chunk-ext (if any), and CRLF | read chunk-size, chunk-ext (if any), and CRLF | |||
} | } | |||
read trailer field | read trailer field | |||
while (trailer field is not empty) { | while (trailer field is not empty) { | |||
if (trailer field is allowed to be sent in a trailer) { | if (trailer fields are stored/forwarded separately) { | |||
append trailer field to existing header fields | append trailer field to existing trailer fields | |||
} | } | |||
read trailer-field | else if (trailer field is understood and defined as mergeable) { | |||
merge trailer field with existing header fields | ||||
} | ||||
else { | ||||
discard trailer field | ||||
} | ||||
read trailer field | ||||
} | } | |||
Content-Length := length | Content-Length := length | |||
Remove "chunked" from Transfer-Encoding | Remove "chunked" from Transfer-Encoding | |||
Remove Trailer from existing header fields | Remove Trailer from existing header fields | |||
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: | |||
skipping to change at page 31, line 5 ¶ | skipping to change at page 30, line 12 ¶ | |||
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 | |||
message delimitation is now ambiguous, unless the data consists only | message delimitation is now ambiguous, unless the data consists only | |||
of one or more CRLF (which can be discarded, as per Section 2.3). | of one or more CRLF (which can be discarded, as per Section 2.2). | |||
9.4. Persistence | 9.4. 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. The "close" connection option is used to signal that a | connection. The "close" connection option is used to signal that a | |||
connection will not persist after the current request/response. HTTP | connection will not persist after the current request/response. HTTP | |||
implementations SHOULD support persistent connections. | implementations SHOULD support persistent connections. | |||
A recipient determines whether a connection is persistent or not | A recipient determines whether a connection is persistent or not | |||
skipping to change at page 32, line 12 ¶ | skipping to change at page 31, line 17 ¶ | |||
discussion of the problems with the Keep-Alive header field | discussion of the problems with the Keep-Alive header field | |||
implemented by many HTTP/1.0 clients). | implemented by many HTTP/1.0 clients). | |||
See Appendix C.1.2 for more information on backwards compatibility | See Appendix C.1.2 for more information on backwards compatibility | |||
with HTTP/1.0 clients. | with HTTP/1.0 clients. | |||
9.4.1. Retrying Requests | 9.4.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. | asynchronous close events. The conditions under which a client can | |||
automatically retry a sequence of outstanding requests are defined in | ||||
When an inbound connection is closed prematurely, a client MAY open a | Section 7.2.2 of [Semantics]. | |||
new connection and automatically retransmit an aborted sequence of | ||||
requests if all of those requests have idempotent methods | ||||
(Section 7.2.2 of [Semantics]). | ||||
9.4.2. Pipelining | 9.4.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 7.2.1 of | parallel if they all have safe methods (Section 7.2.1 of | |||
[Semantics]), but it MUST send the corresponding responses in the | [Semantics]), but it MUST send the corresponding responses in the | |||
same order that the requests were received. | same order that the requests were received. | |||
skipping to change at page 35, line 20 ¶ | skipping to change at page 34, line 23 ¶ | |||
the write side of the read/write connection. The server then | the write side of the read/write connection. The server then | |||
continues to read from the connection until it receives a | continues to read from the connection until it receives a | |||
corresponding close by the client, or until the server is reasonably | corresponding close by the client, or until the server is reasonably | |||
certain that its own TCP stack has received the client's | certain that its own TCP stack has received the client's | |||
acknowledgement of the packet(s) containing the server's last | acknowledgement of the packet(s) containing the server's last | |||
response. Finally, the server fully closes the connection. | response. Finally, the server fully closes the connection. | |||
It is unknown whether the reset problem is exclusive to TCP or might | It is unknown whether the reset problem is exclusive to TCP or might | |||
also be found in other transport connection protocols. | also be found in other transport connection protocols. | |||
9.8. Upgrade | 9.8. TLS Connection Closure | |||
TLS provides a facility for secure connection closure. When a valid | ||||
closure alert is received, an implementation can be assured that no | ||||
further data will be received on that connection. TLS | ||||
implementations MUST initiate an exchange of closure alerts before | ||||
closing a connection. A TLS implementation MAY, after sending a | ||||
closure alert, close the connection without waiting for the peer to | ||||
send its closure alert, generating an "incomplete close". Note that | ||||
an implementation which does this MAY choose to reuse the session. | ||||
This SHOULD only be done when the application knows (typically | ||||
through detecting HTTP message boundaries) that it has received all | ||||
the message data that it cares about. | ||||
As specified in [RFC8446], any implementation which receives a | ||||
connection close without first receiving a valid closure alert (a | ||||
"premature close") MUST NOT reuse that session. Note that a | ||||
premature close does not call into question the security of the data | ||||
already received, but simply indicates that subsequent data might | ||||
have been truncated. Because TLS is oblivious to HTTP request/ | ||||
response boundaries, it is necessary to examine the HTTP data itself | ||||
(specifically the Content-Length header) to determine whether the | ||||
truncation occurred inside a message or between messages. | ||||
When encountering a premature close, a client SHOULD treat as | ||||
completed all requests for which it has received as much data as | ||||
specified in the Content-Length header. | ||||
A client detecting an incomplete close SHOULD recover gracefully. It | ||||
MAY resume a TLS session closed in this fashion. | ||||
Clients MUST send a closure alert before closing the connection. | ||||
Clients which are unprepared to receive any more data MAY choose not | ||||
to wait for the server's closure alert and simply close the | ||||
connection, thus generating an incomplete close on the server side. | ||||
Servers SHOULD be prepared to receive an incomplete close from the | ||||
client, since the client can often determine when the end of server | ||||
data is. Servers SHOULD be willing to resume TLS sessions closed in | ||||
this fashion. | ||||
Servers MUST attempt to initiate an exchange of closure alerts with | ||||
the client before closing the connection. Servers MAY close the | ||||
connection after sending the closure alert, thus generating an | ||||
incomplete close on the client side. | ||||
9.9. Upgrade | ||||
The "Upgrade" header field is intended to provide a simple mechanism | The "Upgrade" header field is intended to provide a simple mechanism | |||
for transitioning from HTTP/1.1 to some other protocol on the same | for transitioning from HTTP/1.1 to some other protocol on the same | |||
connection. | connection. | |||
A client MAY send a list of protocol names in the Upgrade header | A client MAY send a list of protocol names in the Upgrade header | |||
field of a request to invite the server to switch to one or more of | field of a request to invite the server to switch to one or more of | |||
the named protocols, in order of descending preference, before | the named protocols, in order of descending preference, before | |||
sending the final response. A server MAY ignore a received Upgrade | sending the final response. A server MAY ignore a received Upgrade | |||
header field if it wishes to continue using the current protocol on | header field if it wishes to continue using the current protocol on | |||
skipping to change at page 36, line 18 ¶ | skipping to change at page 36, line 19 ¶ | |||
Upgrade header field to indicate the acceptable protocols, in order | Upgrade header field to indicate the acceptable protocols, in order | |||
of descending preference. | of descending preference. | |||
A server MAY send an Upgrade header field in any other response to | A server MAY send an Upgrade header field in any other response to | |||
advertise that it implements support for upgrading to the listed | advertise that it implements support for upgrading to the listed | |||
protocols, in order of descending preference, when appropriate for a | protocols, in order of descending preference, when appropriate for a | |||
future request. | future request. | |||
The following is a hypothetical example sent by a client: | The following is a hypothetical example sent by a client: | |||
GET /hello.txt HTTP/1.1 | GET /hello HTTP/1.1 | |||
Host: www.example.com | Host: www.example.com | |||
Connection: upgrade | Connection: upgrade | |||
Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 | Upgrade: websocket, IRC/6.9, RTA/x11 | |||
The capabilities and nature of the application-level communication | The capabilities and nature of the application-level communication | |||
after the protocol change is entirely dependent upon the new | after the protocol change is entirely dependent upon the new | |||
protocol(s) chosen. However, immediately after sending the 101 | protocol(s) chosen. However, immediately after sending the 101 | |||
(Switching Protocols) response, the server is expected to continue | (Switching Protocols) response, the server is expected to continue | |||
responding to the original request as if it had received its | responding to the original request as if it had received its | |||
equivalent within the new protocol (i.e., the server still has an | equivalent within the new protocol (i.e., the server still has an | |||
outstanding request to satisfy after the protocol has been changed, | outstanding request to satisfy after the protocol has been changed, | |||
and is expected to do so without requiring the request to be | and is expected to do so without requiring the request to be | |||
repeated). | repeated). | |||
skipping to change at page 37, line 7 ¶ | skipping to change at page 37, line 7 ¶ | |||
to protocols with the same semantics as HTTP without the latency cost | to protocols with the same semantics as HTTP without the latency cost | |||
of an additional round trip. A server MUST NOT switch protocols | of an additional round trip. A server MUST NOT switch protocols | |||
unless the received message semantics can be honored by the new | unless the received message semantics can be honored by the new | |||
protocol; an OPTIONS request can be honored by any protocol. | protocol; an OPTIONS request can be honored by any protocol. | |||
The following is an example response to the above hypothetical | The following is an example response to the above hypothetical | |||
request: | request: | |||
HTTP/1.1 101 Switching Protocols | HTTP/1.1 101 Switching Protocols | |||
Connection: upgrade | Connection: upgrade | |||
Upgrade: HTTP/2.0 | Upgrade: websocket | |||
[... data stream switches to HTTP/2.0 with an appropriate response | [... data stream switches to websocket with an appropriate response | |||
(as defined by new protocol) to the "GET /hello.txt" request ...] | (as defined by new protocol) to the "GET /hello" request ...] | |||
When Upgrade is sent, the sender MUST also send a Connection header | When Upgrade is sent, the sender MUST also send a Connection header | |||
field (Section 9.1) that contains an "upgrade" connection option, in | field (Section 9.1) that contains an "upgrade" connection option, in | |||
order to prevent Upgrade from being accidentally forwarded by | order to prevent Upgrade from being accidentally forwarded by | |||
intermediaries that might not implement the listed protocols. A | intermediaries that might not implement the listed protocols. A | |||
server MUST ignore an Upgrade header field that is received in an | server MUST ignore an Upgrade header field that is received in an | |||
HTTP/1.0 request. | HTTP/1.0 request. | |||
A client cannot begin using an upgraded protocol on the connection | A client cannot begin using an upgraded protocol on the connection | |||
until it has completely sent the request message (i.e., the client | until it has completely sent the request message (i.e., the client | |||
skipping to change at page 37, line 34 ¶ | skipping to change at page 37, line 34 ¶ | |||
server MUST send a 100 (Continue) response before sending a 101 | server MUST send a 100 (Continue) response before sending a 101 | |||
(Switching Protocols) response. | (Switching Protocols) response. | |||
The Upgrade header field only applies to switching protocols on top | The Upgrade header field only applies to switching protocols on top | |||
of the existing connection; it cannot be used to switch the | of the existing connection; it cannot be used to switch the | |||
underlying connection (transport) protocol, nor to switch the | underlying connection (transport) protocol, nor to switch the | |||
existing communication to a different connection. For those | existing communication to a different connection. For those | |||
purposes, it is more appropriate to use a 3xx (Redirection) response | purposes, it is more appropriate to use a 3xx (Redirection) response | |||
(Section 9.4 of [Semantics]). | (Section 9.4 of [Semantics]). | |||
9.8.1. Upgrade Protocol Names | 9.9.1. Upgrade Protocol Names | |||
This specification only defines the protocol name "HTTP" for use by | This specification only defines the protocol name "HTTP" for use by | |||
the family of Hypertext Transfer Protocols, as defined by the HTTP | the family of Hypertext Transfer Protocols, as defined by the HTTP | |||
version rules of Section 3.5 of [Semantics] and future updates to | version rules of Section 3.5 of [Semantics] and future updates to | |||
this specification. Additional protocol names ought to be registered | this specification. Additional protocol names ought to be registered | |||
using the registration procedure defined in Section 9.8.2. | using the registration procedure defined in Section 9.9.2. | |||
+------+-------------------+--------------------+-------------------+ | +------+-------------------+--------------------+-------------------+ | |||
| Name | Description | Expected Version | Reference | | | Name | Description | Expected Version | Reference | | |||
| | | Tokens | | | | | | Tokens | | | |||
+------+-------------------+--------------------+-------------------+ | +------+-------------------+--------------------+-------------------+ | |||
| HTTP | Hypertext | any DIGIT.DIGIT | Section 3.5 of | | | HTTP | Hypertext | any DIGIT.DIGIT | Section 3.5 of | | |||
| | Transfer Protocol | (e.g, "2.0") | [Semantics] | | | | Transfer Protocol | (e.g, "2.0") | [Semantics] | | |||
+------+-------------------+--------------------+-------------------+ | +------+-------------------+--------------------+-------------------+ | |||
9.8.2. Upgrade Token Registry | 9.9.2. Upgrade Token Registry | |||
The "Hypertext Transfer Protocol (HTTP) Upgrade Token Registry" | The "Hypertext Transfer Protocol (HTTP) Upgrade Token Registry" | |||
defines the namespace for protocol-name tokens used to identify | defines the namespace for protocol-name tokens used to identify | |||
protocols in the Upgrade header field. The registry is maintained at | protocols in the Upgrade header field. The registry is maintained at | |||
<https://www.iana.org/assignments/http-upgrade-tokens>. | <https://www.iana.org/assignments/http-upgrade-tokens>. | |||
Each registered protocol name is associated with contact information | Each registered protocol name is associated with contact information | |||
and an optional set of specifications that details how the connection | and an optional set of specifications that details how the connection | |||
will be processed after it has been upgraded. | will be processed after it has been upgraded. | |||
skipping to change at page 43, line 50 ¶ | skipping to change at page 43, line 50 ¶ | |||
Please update the "HTTP Transfer Coding Registry" at | Please update the "HTTP Transfer Coding Registry" at | |||
<https://www.iana.org/assignments/http-parameters/> with the | <https://www.iana.org/assignments/http-parameters/> with the | |||
registration procedure of Section 7.3 and the content coding names | registration procedure of Section 7.3 and the content coding names | |||
summarized in the table of Section 7. | summarized in the table of Section 7. | |||
12.4. Upgrade Token Registration | 12.4. Upgrade Token Registration | |||
Please update the "Hypertext Transfer Protocol (HTTP) Upgrade Token | Please update the "Hypertext Transfer Protocol (HTTP) Upgrade Token | |||
Registry" at <https://www.iana.org/assignments/http-upgrade-tokens> | Registry" at <https://www.iana.org/assignments/http-upgrade-tokens> | |||
with the registration procedure of Section 9.8.2 and the upgrade | with the registration procedure of Section 9.9.2 and the upgrade | |||
token names summarized in the table of Section 9.8.1. | token names summarized in the table of Section 9.9.1. | |||
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", draft-ietf-httpbis-cache-05 (work in | Ed., "HTTP Caching", draft-ietf-httpbis-cache-06 (work in | |||
progress), July 2019. | progress), November 2019. | |||
[RFC1950] Deutsch, L. and J-L. Gailly, "ZLIB Compressed Data Format | [RFC1950] Deutsch, L. and J-L. Gailly, "ZLIB Compressed Data Format | |||
Specification version 3.3", RFC 1950, | 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>. | |||
skipping to change at page 44, line 46 ¶ | skipping to change at page 44, line 46 ¶ | |||
[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>. | |||
[RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | ||||
Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | ||||
<https://www.rfc-editor.org/info/rfc8446>. | ||||
[Semantics] | [Semantics] | |||
Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
Ed., "HTTP Semantics", draft-ietf-httpbis-semantics-05 | Ed., "HTTP Semantics", draft-ietf-httpbis-semantics-06 | |||
(work in progress), July 2019. | (work in progress), November 2019. | |||
[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 Technique for High-Performance Data | [Welch] Welch, T., "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 | |||
skipping to change at page 46, line 14 ¶ | skipping to change at page 46, line 19 ¶ | |||
[RFC2557] Palme, F., Hopmann, A., Shelness, N., and E. Stefferud, | [RFC2557] Palme, F., Hopmann, A., Shelness, N., and E. Stefferud, | |||
"MIME Encapsulation of Aggregate Documents, such as HTML | "MIME Encapsulation of Aggregate Documents, such as HTML | |||
(MHTML)", RFC 2557, DOI 10.17487/RFC2557, March 1999, | (MHTML)", RFC 2557, DOI 10.17487/RFC2557, March 1999, | |||
<https://www.rfc-editor.org/info/rfc2557>. | <https://www.rfc-editor.org/info/rfc2557>. | |||
[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>. | |||
[RFC6265] Barth, A., "HTTP State Management Mechanism", RFC 6265, | ||||
DOI 10.17487/RFC6265, April 2011, | ||||
<https://www.rfc-editor.org/info/rfc6265>. | ||||
[RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
Protocol (HTTP/1.1): Message Syntax and Routing", | 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. Reschke, Ed., "Hypertext Transfer | [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | |||
DOI 10.17487/RFC7231, June 2014, | DOI 10.17487/RFC7231, June 2014, | |||
<https://www.rfc-editor.org/info/rfc7231>. | <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 11 of [Semantics]. | Section 12 of [Semantics]. | |||
BWS = <BWS, see [Semantics], Section 4.3> | BWS = <BWS, see [Semantics], Section 4.3> | |||
Connection = [ connection-option ] *( OWS "," OWS [ connection-option | Connection = [ connection-option ] *( OWS "," OWS [ connection-option | |||
] ) | ] ) | |||
HTTP-message = start-line *( header-field CRLF ) CRLF [ message-body | HTTP-message = start-line CRLF *( header-field CRLF ) CRLF [ | |||
] | 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 4.3> | OWS = <OWS, see [Semantics], Section 4.3> | |||
RWS = <RWS, see [Semantics], Section 4.3> | RWS = <RWS, see [Semantics], Section 4.3> | |||
TE = [ t-codings ] *( OWS "," OWS [ t-codings ] ) | TE = [ t-codings ] *( OWS "," OWS [ t-codings ] ) | |||
Transfer-Encoding = [ transfer-coding ] *( OWS "," OWS [ | Transfer-Encoding = [ transfer-coding ] *( OWS "," OWS [ | |||
transfer-coding ] ) | transfer-coding ] ) | |||
skipping to change at page 47, line 44 ¶ | skipping to change at page 47, line 44 ¶ | |||
authority = <authority, see [RFC3986], Section 3.2> | authority = <authority, see [RFC3986], Section 3.2> | |||
authority-form = authority | authority-form = authority | |||
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-part CRLF | chunked-body = *chunk last-chunk trailer-section CRLF | |||
comment = <comment, see [Semantics], Section 4.2.3> | comment = <comment, see [Semantics], Section 4.2.3> | |||
connection-option = token | connection-option = token | |||
field-name = <field-name, see [Semantics], Section 4.2> | field-name = <field-name, see [Semantics], Section 4.2> | |||
field-value = <field-value, see [Semantics], Section 4.2> | field-value = <field-value, see [Semantics], Section 4.2> | |||
header-field = field-name ":" OWS field-value OWS | header-field = field-name ":" OWS field-value OWS | |||
last-chunk = 1*"0" [ chunk-ext ] CRLF | last-chunk = 1*"0" [ chunk-ext ] CRLF | |||
message-body = *OCTET | message-body = *OCTET | |||
skipping to change at page 48, line 23 ¶ | skipping to change at page 48, line 23 ¶ | |||
port = <port, see [RFC3986], Section 3.2.3> | port = <port, see [RFC3986], Section 3.2.3> | |||
protocol = protocol-name [ "/" protocol-version ] | protocol = protocol-name [ "/" protocol-version ] | |||
protocol-name = token | protocol-name = token | |||
protocol-version = token | protocol-version = token | |||
query = <query, see [RFC3986], Section 3.4> | query = <query, see [RFC3986], Section 3.4> | |||
quoted-string = <quoted-string, see [Semantics], Section 4.2.3> | quoted-string = <quoted-string, see [Semantics], Section 4.2.3> | |||
rank = ( "0" [ "." *3DIGIT ] ) / ( "1" [ "." *3"0" ] ) | rank = ( "0" [ "." *3DIGIT ] ) / ( "1" [ "." *3"0" ] ) | |||
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 CRLF | 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 ] CRLF | status-line = HTTP-version SP status-code SP [ reason-phrase ] | |||
t-codings = "trailers" / ( transfer-coding [ t-ranking ] ) | t-codings = "trailers" / ( transfer-coding [ t-ranking ] ) | |||
t-ranking = OWS ";" OWS "q=" rank | t-ranking = OWS ";" OWS "q=" rank | |||
token = <token, see [Semantics], Section 4.2.3> | token = <token, see [Semantics], Section 4.2.3> | |||
trailer-part = *( header-field CRLF ) | trailer-section = *( header-field CRLF ) | |||
transfer-coding = token *( OWS ";" OWS transfer-parameter ) | transfer-coding = token *( OWS ";" OWS transfer-parameter ) | |||
transfer-parameter = token BWS "=" BWS ( token / quoted-string ) | transfer-parameter = token BWS "=" BWS ( token / quoted-string ) | |||
uri-host = <host, see [RFC3986], Section 3.2.2> | uri-host = <host, see [RFC3986], 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 | |||
skipping to change at page 50, line 41 ¶ | skipping to change at page 50, line 41 ¶ | |||
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 as | canonicalization, etc., since HTTP transfers message-bodies as | |||
payload and, aside from the "multipart/byteranges" type | payload and, aside from the "multipart/byteranges" type | |||
(Section 6.3.4 of [Semantics]), does not interpret the content or any | (Section 6.3.5 of [Semantics]), does not interpret the content or any | |||
MIME header lines that might be contained therein. | MIME header lines that might be contained therein. | |||
Appendix C. HTTP Version History | Appendix C. HTTP Version History | |||
HTTP has been in use since 1990. The first version, later referred | HTTP has been in use since 1990. The first version, later referred | |||
to as HTTP/0.9, was a simple protocol for hypertext data transfer | to as HTTP/0.9, was a simple protocol for hypertext data transfer | |||
across the Internet, using only a single request method (GET) and no | across the Internet, using only a single request method (GET) and no | |||
metadata. HTTP/1.0, as defined by [RFC1945], added a range of | metadata. HTTP/1.0, as defined by [RFC1945], added a range of | |||
request methods and MIME-like messaging, allowing for metadata to be | request methods and MIME-like messaging, allowing for metadata to be | |||
transferred and modifiers placed on the request/response semantics. | transferred and modifiers placed on the request/response semantics. | |||
skipping to change at page 52, line 49 ¶ | skipping to change at page 52, line 49 ¶ | |||
C.1.3. Introduction of Transfer-Encoding | C.1.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.2. Changes from RFC 7230 | C.2. 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 field values have been moved to | message routing, and header fields have been moved to [Semantics]. | |||
[Semantics]. This document has been reduced to just the messaging | This document has been reduced to just the messaging syntax and | |||
syntax and connection management requirements specific to HTTP/1.1. | connection management requirements specific to HTTP/1.1. | |||
Furthermore: | Trailer field semantics now transcend the specifics of chunked | |||
encoding. The decoding algorithm for chunked (Section 7.1.3) has | ||||
been updated to encourage storage/forwarding of trailer fields | ||||
separately from the header section, to only allow merging into the | ||||
header section if the recipient knows the corresponding field | ||||
definition permits and defines how to merge, and otherwise to discard | ||||
the trailer fields instead of merging. The trailer part is now | ||||
called the trailer section to be more consistent with the header | ||||
section and more distinct from a body part (Section 7.1.2). | ||||
In the ABNF for chunked extensions, re-introduce (bad) whitespace | In the ABNF for chunked extensions, re-introduced (bad) whitespace | |||
around ";" and "=". Whitespace was removed in [RFC7230], but later | around ";" and "=" (Section 7.1.1). Whitespace was removed in | |||
this change was found to break existing implementations (see | [RFC7230], but that change was found to break existing | |||
[Err4667]). (Section 7.1.1) | implementations (see [Err4667]). | |||
Disallow transfer coding parameters called "q" in order to avoid | Disallowed transfer coding parameters called "q" in order to avoid | |||
conflicts with the use of ranks in the TE header field. | conflicts with the use of ranks in the TE header field (Section 7.3). | |||
(Section 7.3) | ||||
Appendix D. Change Log | Appendix D. Change Log | |||
This section is to be removed before publishing as an RFC. | This section is to be removed before publishing as an RFC. | |||
D.1. Between RFC7230 and draft 00 | D.1. Between RFC7230 and draft 00 | |||
The changes were purely editorial: | The changes were purely editorial: | |||
o Change boilerplate and abstract to indicate the "draft" status, | o Change boilerplate and abstract to indicate the "draft" status, | |||
skipping to change at page 55, line 20 ¶ | skipping to change at page 55, line 28 ¶ | |||
o In Section 7, remove the predefined codings from the ABNF and make | o 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>) | |||
o Use RFC 7405 ABNF notation for case-sensitive string constants | o Use RFC 7405 ABNF notation for case-sensitive string constants | |||
(<https://github.com/httpwg/http-core/issues/133>) | (<https://github.com/httpwg/http-core/issues/133>) | |||
D.6. Since draft-ietf-httpbis-messaging-04 | D.6. Since draft-ietf-httpbis-messaging-04 | |||
o In Section 9.8, clarify that protocol-name is to be matched case- | o In Section 9.9, clarify that protocol-name is to be matched case- | |||
insensitively (<https://github.com/httpwg/http-core/issues/8>) | insensitively (<https://github.com/httpwg/http-core/issues/8>) | |||
o In Section 5.2, add leading optional whitespace to obs-fold ABNF | o 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>) | |||
o In Section 4, add clarifications about empty reason phrases | o 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>) | |||
o Move discussion of retries from Section 9.4.1 into [Semantics] | o Move discussion of retries from Section 9.4.1 into [Semantics] | |||
(<https://github.com/httpwg/http-core/issues/230>) | (<https://github.com/httpwg/http-core/issues/230>) | |||
D.7. Since draft-ietf-httpbis-messaging-05 | ||||
o In Section 7.1.2, the trailer part has been renamed the trailer | ||||
section (for consistency with the header section) and trailers are | ||||
no longer merged as header fields by default, but rather can be | ||||
discarded, kept separate from header fields, or merged with header | ||||
fields only if understood and defined as being mergeable | ||||
(<https://github.com/httpwg/http-core/issues/16>) | ||||
o In Section 2.1 and related Sections, move the trailing CRLF from | ||||
the line grammars into the message format | ||||
(<https://github.com/httpwg/http-core/issues/62>) | ||||
o Moved Section 2.3 down (<https://github.com/httpwg/http-core/ | ||||
issues/68>) | ||||
o In Section 9.9, use 'websocket' instead of 'HTTP/2.0' in examples | ||||
(<https://github.com/httpwg/http-core/issues/112>) | ||||
o Move version non-specific text from Section 6 into semantics as | ||||
"payload body" (<https://github.com/httpwg/http-core/issues/159>) | ||||
o In Section 9.8, add text from RFC 2818 | ||||
(<https://github.com/httpwg/http-core/issues/236>) | ||||
Index | Index | |||
A | A | |||
absolute-form (of request-target) 11 | absolute-form (of request-target) 11 | |||
application/http Media Type 40 | application/http Media Type 40 | |||
asterisk-form (of request-target) 12 | asterisk-form (of request-target) 11 | |||
authority-form (of request-target) 11 | authority-form (of request-target) 11 | |||
C | C | |||
Connection header field 29, 34 | Connection header field 28, 33 | |||
Content-Length header field 19 | Content-Length header field 18 | |||
Content-Transfer-Encoding header field 50 | Content-Transfer-Encoding header field 50 | |||
chunked (Coding Format) 17, 19 | chunked (Coding Format) 17, 19 | |||
chunked (transfer coding) 22 | chunked (transfer coding) 22 | |||
close 29, 34 | close 28, 33 | |||
compress (transfer coding) 25 | compress (transfer coding) 24 | |||
D | D | |||
deflate (transfer coding) 25 | deflate (transfer coding) 24 | |||
E | E | |||
effective request URI 12 | effective request URI 12 | |||
G | G | |||
Grammar | Grammar | |||
absolute-form 10-11 | absolute-form 10-11 | |||
ALPHA 5 | ALPHA 5 | |||
asterisk-form 10, 12 | asterisk-form 10-11 | |||
authority-form 10-11 | authority-form 10-11 | |||
chunk 23 | chunk 22 | |||
chunk-data 23 | chunk-data 22 | |||
chunk-ext 23 | chunk-ext 22-23 | |||
chunk-ext-name 23 | chunk-ext-name 23 | |||
chunk-ext-val 23 | chunk-ext-val 23 | |||
chunk-size 23 | chunk-size 22 | |||
chunked-body 23 | chunked-body 22 | |||
Connection 29 | Connection 28 | |||
connection-option 29 | connection-option 28 | |||
CR 5 | CR 5 | |||
CRLF 5 | CRLF 5 | |||
CTL 5 | CTL 5 | |||
DIGIT 5 | DIGIT 5 | |||
DQUOTE 5 | DQUOTE 5 | |||
field-name 15 | field-name 14 | |||
field-value 15 | field-value 14 | |||
header-field 15, 24 | header-field 14, 24 | |||
HEXDIG 5 | HEXDIG 5 | |||
HTAB 5 | HTAB 5 | |||
HTTP-message 6 | HTTP-message 6 | |||
HTTP-name 7 | HTTP-name 8 | |||
HTTP-version 7 | HTTP-version 8 | |||
last-chunk 23 | last-chunk 22 | |||
LF 5 | LF 5 | |||
message-body 17 | message-body 16 | |||
method 9 | method 9 | |||
obs-fold 16 | obs-fold 16 | |||
OCTET 5 | OCTET 5 | |||
origin-form 10 | origin-form 10 | |||
rank 27 | rank 26 | |||
reason-phrase 14 | reason-phrase 14 | |||
request-line 9 | request-line 9 | |||
request-target 10 | request-target 10 | |||
SP 5 | SP 5 | |||
start-line 6 | start-line 6 | |||
status-code 14 | status-code 14 | |||
status-line 14 | status-line 13 | |||
t-codings 27 | t-codings 26 | |||
t-ranking 27 | t-ranking 26 | |||
TE 27 | TE 26 | |||
trailer-part 23-24 | trailer-section 22, 24 | |||
transfer-coding 21 | transfer-coding 21 | |||
Transfer-Encoding 17 | Transfer-Encoding 17 | |||
transfer-parameter 22 | transfer-parameter 21 | |||
Upgrade 35 | Upgrade 35 | |||
VCHAR 5 | VCHAR 5 | |||
gzip (transfer coding) 25 | gzip (transfer coding) 24 | |||
H | H | |||
header field 6 | header field 6 | |||
header section 6 | header section 6 | |||
headers 6 | headers 6 | |||
M | M | |||
MIME-Version header field 49 | MIME-Version header field 49 | |||
Media Type | Media Type | |||
application/http 40 | application/http 40 | |||
skipping to change at page 57, line 33 ¶ | skipping to change at page 58, line 17 ¶ | |||
message/http Media Type 38 | message/http Media Type 38 | |||
method 9 | method 9 | |||
O | O | |||
origin-form (of request-target) 10 | origin-form (of request-target) 10 | |||
R | R | |||
request-target 10 | request-target 10 | |||
T | T | |||
TE header field 26 | TE header field 25 | |||
Transfer-Encoding header field 17 | Transfer-Encoding header field 17 | |||
U | U | |||
Upgrade header field 35 | Upgrade header field 35 | |||
X | X | |||
x-compress (transfer coding) 25 | x-compress (transfer coding) 24 | |||
x-gzip (transfer coding) 25 | x-gzip (transfer coding) 24 | |||
Acknowledgments | Acknowledgments | |||
See Appendix "Acknowledgments" of [Semantics]. | See Appendix "Acknowledgments" of [Semantics]. | |||
Authors' Addresses | Authors' Addresses | |||
Roy T. Fielding (editor) | Roy T. Fielding (editor) | |||
Adobe | Adobe | |||
345 Park Ave | 345 Park Ave | |||
San Jose, CA 95110 | San Jose, CA 95110 | |||
USA | United States of America | |||
EMail: fielding@gbiv.com | EMail: fielding@gbiv.com | |||
URI: https://roy.gbiv.com/ | URI: https://roy.gbiv.com/ | |||
Mark Nottingham (editor) | Mark Nottingham (editor) | |||
Fastly | Fastly | |||
EMail: mnot@mnot.net | EMail: mnot@mnot.net | |||
URI: https://www.mnot.net/ | URI: https://www.mnot.net/ | |||
Julian F. Reschke (editor) | Julian F. Reschke (editor) | |||
greenbytes GmbH | greenbytes GmbH | |||
Hafenweg 16 | Hafenweg 16 | |||
Muenster, NW 48155 | Muenster 48155 | |||
Germany | Germany | |||
EMail: julian.reschke@greenbytes.de | EMail: julian.reschke@greenbytes.de | |||
URI: https://greenbytes.de/tech/webdav/ | URI: https://greenbytes.de/tech/webdav/ | |||
End of changes. 95 change blocks. | ||||
265 lines changed or deleted | 312 lines changed or added | |||
This html diff was produced by rfcdiff 1.46. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |