| rfc9112.original.xml | rfc9112.xml | |||
|---|---|---|---|---|
| <?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | |||
| <!-- | ||||
| This XML document is the output of clean-for-DTD.xslt; a tool that strips | <!-- draft submitted in xml v3 --> | |||
| extensions to RFC 7749 from documents for processing with xml2rfc. | ||||
| <!--TARGET-GENERATOR: 202007--> | <!DOCTYPE rfc [ | |||
| <!--TARGET-VOCABULARY: 3--> | <!ENTITY nbsp " "> | |||
| <?xml-stylesheet type='text/xsl' href='lib/myxml2rfc.xslt'?> | <!ENTITY zwsp "​"> | |||
| <?rfc toc="yes" ?> | <!ENTITY nbhy "‑"> | |||
| <?rfc symrefs="yes" ?> | <!ENTITY wj "⁠"> | |||
| <?rfc sortrefs="yes" ?> | ]> | |||
| <?rfc compact="yes"?> | ||||
| <?rfc subcompact="no" ?> | ||||
| <?rfc linkmailto="no" ?> | ||||
| <?rfc editing="no" ?> | ||||
| <?rfc comments="yes"?> | ||||
| <?rfc inline="yes"?> | ||||
| <?rfc rfcedstyle="yes"?> | ||||
| <rfc version="3" | <rfc version="3" | |||
| tocInclude="true" | ||||
| tocDepth="4" | tocDepth="4" | |||
| sortRefs="true" | sortRefs="true" | |||
| symRefs="true" | ||||
| submissionType="IETF" | ||||
| category="std" | category="std" | |||
| consensus="true" | ||||
| ipr="pre5378Trust200902" | ipr="pre5378Trust200902" | |||
| obsoletes="7230" | obsoletes="7230" | |||
| docName="draft-ietf-httpbis-messaging-19"> | updates="" | |||
| <!--see https://trac.tools.ietf.org/tools/xml2rfc/trac/ticket/420--> | docName="draft-ietf-httpbis-messaging-19" | |||
| <?v3xml2rfc silence="Warning: Setting consensus="true" for IETF STD document"?> | number="9112" | |||
| <?v3xml2rfc silence="Warning: Expected a valid submissionType (stream) setting"? | xmlns:xi="http://www.w3.org/2001/XInclude" | |||
| > | xml:lang="en"> | |||
| <front> | <front> | |||
| <title>HTTP/1.1</title> | <title>HTTP/1.1</title> | |||
| <seriesInfo name="RFC" value="9112"/> | ||||
| <seriesInfo name="STD" value="99"/> | ||||
| <author fullname="Roy T. Fielding" | <author fullname="Roy T. Fielding" | |||
| initials="R." | initials="R." | |||
| surname="Fielding" | surname="Fielding" | |||
| role="editor"> | role="editor"> | |||
| <organization>Adobe</organization> | <organization>Adobe</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <postalLine>345 Park Ave</postalLine> | <postalLine>345 Park Ave</postalLine> | |||
| <postalLine>San Jose, CA 95110</postalLine> | <postalLine>San Jose, CA 95110</postalLine> | |||
| <postalLine>United States of America</postalLine> | <postalLine>United States of America</postalLine> | |||
| skipping to change at line 53 ¶ | skipping to change at line 54 ¶ | |||
| <uri>https://roy.gbiv.com/</uri> | <uri>https://roy.gbiv.com/</uri> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author fullname="Mark Nottingham" | <author fullname="Mark Nottingham" | |||
| initials="M." | initials="M." | |||
| surname="Nottingham" | surname="Nottingham" | |||
| role="editor"> | role="editor"> | |||
| <organization>Fastly</organization> | <organization>Fastly</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <postalLine>Prahran VIC</postalLine> | <postalLine>Prahran</postalLine> | |||
| <postalLine>Australia</postalLine> | <postalLine>Australia</postalLine> | |||
| </postal> | </postal> | |||
| <email>mnot@mnot.net</email> | <email>mnot@mnot.net</email> | |||
| <uri>https://www.mnot.net/</uri> | <uri>https://www.mnot.net/</uri> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author fullname="Julian Reschke" | <author fullname="Julian Reschke" | |||
| initials="J." | initials="J." | |||
| surname="Reschke" | surname="Reschke" | |||
| role="editor"> | role="editor"> | |||
| skipping to change at line 75 ¶ | skipping to change at line 76 ¶ | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <postalLine>Hafenweg 16</postalLine> | <postalLine>Hafenweg 16</postalLine> | |||
| <postalLine>48155 Münster</postalLine> | <postalLine>48155 Münster</postalLine> | |||
| <postalLine>Germany</postalLine> | <postalLine>Germany</postalLine> | |||
| </postal> | </postal> | |||
| <email>julian.reschke@greenbytes.de</email> | <email>julian.reschke@greenbytes.de</email> | |||
| <uri>https://greenbytes.de/tech/webdav/</uri> | <uri>https://greenbytes.de/tech/webdav/</uri> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <date year="2021" month="September" day="10"/> | <date year="2022" month="June"/> | |||
| <area>Applications and Real-Time</area> | <area>Applications and Real-Time</area> | |||
| <workgroup>HTTP Working Group</workgroup> | <workgroup>HTTP Working Group</workgroup> | |||
| <keyword>Hypertext Transfer Protocol</keyword> | <keyword>Hypertext Transfer Protocol</keyword> | |||
| <keyword>HTTP</keyword> | <keyword>HTTP</keyword> | |||
| <keyword>HTTP message format</keyword> | <keyword>HTTP message format</keyword> | |||
| <abstract> | <abstract> | |||
| <t> | <t> | |||
| The Hypertext Transfer Protocol (HTTP) is a stateless application-level | The Hypertext Transfer Protocol (HTTP) is a stateless application-level | |||
| protocol for distributed, collaborative, hypertext information systems. | protocol for distributed, collaborative, hypertext information systems. | |||
| This document specifies the HTTP/1.1 message syntax, message parsing, | This document specifies the HTTP/1.1 message syntax, message parsing, | |||
| connection management, and related security concerns. | connection management, and related security concerns. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| This document obsoletes portions of RFC 7230. | This document obsoletes portions of RFC 7230. | |||
| </t> | </t> | |||
| </abstract> | </abstract> | |||
| <note title="Editorial Note"> | ||||
| <t>This note is to be removed before publishing as an RFC.</t> | ||||
| <t> | ||||
| Discussion of this draft takes place on the HTTP working group | ||||
| mailing list (ietf-http-wg@w3.org), which is archived at | ||||
| <eref target="https://lists.w3.org/Archives/Public/ietf-http-wg/" | ||||
| brackets="angle"/>. | ||||
| </t> | ||||
| <t> | ||||
| Working Group information can be found at <eref target="https://httpwg.org/" | ||||
| brackets="angle"/>; | ||||
| source code and issues list for this draft can be found at | ||||
| <eref target="https://github.com/httpwg/http-core" brackets="angle"/>. | ||||
| </t> | ||||
| <t> | ||||
| The changes in this draft are summarized in <xref target="changes.since.18"/ | ||||
| >. | ||||
| </t> | ||||
| </note> | ||||
| </front> | </front> | |||
| <middle> | <middle> | |||
| <section anchor="introduction" title="Introduction"> | <section anchor="introduction" title="Introduction"> | |||
| <t> | <t> | |||
| The Hypertext Transfer Protocol (HTTP) is a stateless application-level | The Hypertext Transfer Protocol (HTTP) is a stateless application-level | |||
| request/response protocol that uses extensible semantics and | request/response protocol that uses extensible semantics and | |||
| self-descriptive messages for flexible interaction with network-based | self-descriptive messages for flexible interaction with network-based | |||
| hypertext information systems. HTTP/1.1 is defined by: | hypertext information systems. HTTP/1.1 is defined by: | |||
| </t> | </t> | |||
| <ul> | <ul> | |||
| <li>This document</li> | <li>This document</li> | |||
| <li>"HTTP Semantics" <xref target="HTTP"/> | <li>"HTTP Semantics" <xref target="HTTP"/> | |||
| </li> | </li> | |||
| <li>"HTTP Caching" <xref target="CACHING"/> | <li>"HTTP Caching" <xref target="CACHING"/> | |||
| </li> | </li> | |||
| </ul> | </ul> | |||
| <t> | <t> | |||
| This document specifies how HTTP semantics are conveyed using the | This document specifies how HTTP semantics are conveyed using the | |||
| HTTP/1.1 message syntax, framing and connection management mechanisms. | HTTP/1.1 message syntax, framing, and connection management mechanisms. | |||
| Its goal is to define the complete set of requirements for HTTP/1.1 | Its goal is to define the complete set of requirements for HTTP/1.1 | |||
| message parsers and message-forwarding intermediaries. | message parsers and message-forwarding intermediaries. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| This document obsoletes the portions of | This document obsoletes the portions of | |||
| <xref target="RFC7230" format="none">RFC 7230</xref> related to HTTP/1.1 | <xref target="RFC7230" format="none">RFC 7230</xref> related to HTTP/1.1 | |||
| messaging and connection management, with the changes being summarized in | messaging and connection management, with the changes being summarized in | |||
| <xref target="changes.from.rfc.7230"/>. The other parts of | <xref target="changes.from.rfc.7230"/>. The other parts of | |||
| <xref target="RFC7230" format="none">RFC 7230</xref> are obsoleted by | <xref target="RFC7230" format="none">RFC 7230</xref> are obsoleted by | |||
| "HTTP Semantics" <xref target="HTTP"/>. | "HTTP Semantics" <xref target="HTTP"/>. | |||
| </t> | </t> | |||
| <section anchor="requirements.notation" title="Requirements Notation"> | <section anchor="requirements.notation" title="Requirements Notation"> | |||
| <t> | <t> | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQU | |||
| NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", | IRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
| "MAY", and "OPTIONAL" in this document are to be interpreted as | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14> | |||
| described in BCP 14 <xref target="RFC2119"/> | RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
| <xref target="RFC8174"/> when, and only when, they | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | |||
| appear in all capitals, as shown here. | be interpreted as | |||
| </t> | described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | |||
| when, and only when, they appear in all capitals, as shown here. | ||||
| </t> | ||||
| <t> | <t> | |||
| Conformance criteria and considerations regarding error handling | Conformance criteria and considerations regarding error handling | |||
| are defined in <xref target="HTTP" section="2"/>. | are defined in <xref target="HTTP" section="2"/>. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="notation" title="Syntax Notation"> | <section anchor="notation" title="Syntax Notation"> | |||
| <iref primary="true" item="Grammar" subitem="ALPHA"/> | <iref primary="true" item="Grammar" subitem="ALPHA"/> | |||
| <iref primary="true" item="Grammar" subitem="CR"/> | <iref primary="true" item="Grammar" subitem="CR"/> | |||
| <iref primary="true" item="Grammar" subitem="CRLF"/> | <iref primary="true" item="Grammar" subitem="CRLF"/> | |||
| <iref primary="true" item="Grammar" subitem="CTL"/> | <iref primary="true" item="Grammar" subitem="CTL"/> | |||
| skipping to change at line 173 ¶ | skipping to change at line 156 ¶ | |||
| <iref primary="true" item="Grammar" subitem="OCTET"/> | <iref primary="true" item="Grammar" subitem="OCTET"/> | |||
| <iref primary="true" item="Grammar" subitem="SP"/> | <iref primary="true" item="Grammar" subitem="SP"/> | |||
| <iref primary="true" item="Grammar" subitem="VCHAR"/> | <iref primary="true" item="Grammar" subitem="VCHAR"/> | |||
| <t> | <t> | |||
| This specification uses the Augmented Backus-Naur Form (ABNF) notation of | This specification uses the Augmented Backus-Naur Form (ABNF) notation of | |||
| <xref target="RFC5234"/>, extended with the notation for case-sensitivity | <xref target="RFC5234"/>, extended with the notation for case-sensitivity | |||
| in strings defined in <xref target="RFC7405"/>. | in strings defined in <xref target="RFC7405"/>. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| It also uses a list extension, defined in <xref target="HTTP" section="5.6.1" />, | It also uses a list extension, defined in <xref target="HTTP" section="5.6.1" />, | |||
| 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). <xref target | operator (similar to how the "*" operator indicates repetition). <xref target | |||
| ="collected.abnf"/> shows the collected grammar with all list | ="collected.abnf"/> shows the collected grammar with all list | |||
| operators expanded to standard ABNF notation. | operators expanded to standard ABNF notation. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| 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. | |||
| </t> | </t> | |||
| <t anchor="core.rules"> | <t anchor="core.rules"> | |||
| The following core rules are included by | The following core rules are included by | |||
| reference, as defined in <xref target="RFC5234" sectionFormat="comma" section ="B.1"/>: | reference, as defined in <xref target="RFC5234" sectionFormat="comma" section ="B.1"/>: | |||
| ALPHA (letters), CR (carriage return), CRLF (CR LF), CTL (controls), | ALPHA (letters), CR (carriage return), CRLF (CR LF), CTL (controls), | |||
| DIGIT (decimal 0-9), DQUOTE (double quote), | DIGIT (decimal 0-9), DQUOTE (double quote), | |||
| HEXDIG (hexadecimal 0-9/A-F/a-f), HTAB (horizontal tab), LF (line feed), | HEXDIG (hexadecimal 0-9/A-F/a-f), HTAB (horizontal tab), LF (line feed), | |||
| OCTET (any 8-bit sequence of data), SP (space), and | OCTET (any 8-bit sequence of data), SP (space), and | |||
| VCHAR (any visible <xref target="USASCII"/> character). | VCHAR (any visible <xref target="USASCII"/> character). | |||
| </t> | </t> | |||
| <t anchor="imported.rules"> | <t anchor="imported.rules"> | |||
| The rules below are defined in <xref target="HTTP"/>: | The rules below are defined in <xref target="HTTP"/>: | |||
| </t> | </t> | |||
| <sourcecode type="abnf7230"><![CDATA[ BWS = <BWS, see [HT TP], Section 5.6.3> | <sourcecode type="abnf9110"><![CDATA[ BWS = <BWS, see [HT TP], Section 5.6.3> | |||
| OWS = <OWS, see [HTTP], Section 5.6.3> | OWS = <OWS, see [HTTP], Section 5.6.3> | |||
| RWS = <RWS, see [HTTP], Section 5.6.3> | RWS = <RWS, see [HTTP], Section 5.6.3> | |||
| absolute-path = <absolute-path, see [HTTP], Section 4.1> | absolute-path = <absolute-path, see [HTTP], Section 4.1> | |||
| field-name = <field-name, see [HTTP], Section 5.1> | field-name = <field-name, see [HTTP], Section 5.1> | |||
| field-value = <field-value, see [HTTP], Section 5.5> | field-value = <field-value, see [HTTP], Section 5.5> | |||
| obs-text = <obs-text, see [HTTP], Section 5.6.4> | obs-text = <obs-text, see [HTTP], Section 5.6.4> | |||
| quoted-string = <quoted-string, see [HTTP], Section 5.6.4> | quoted-string = <quoted-string, see [HTTP], Section 5.6.4> | |||
| token = <token, see [HTTP], Section 5.6.2> | token = <token, see [HTTP], Section 5.6.2> | |||
| transfer-coding = | transfer-coding = | |||
| <transfer-coding, see [HTTP], Section 10.1.4> | <transfer-coding, see [HTTP], Section 10.1.4> | |||
| skipping to change at line 208 ¶ | skipping to change at line 190 ¶ | |||
| absolute-path = <absolute-path, see [HTTP], Section 4.1> | absolute-path = <absolute-path, see [HTTP], Section 4.1> | |||
| field-name = <field-name, see [HTTP], Section 5.1> | field-name = <field-name, see [HTTP], Section 5.1> | |||
| field-value = <field-value, see [HTTP], Section 5.5> | field-value = <field-value, see [HTTP], Section 5.5> | |||
| obs-text = <obs-text, see [HTTP], Section 5.6.4> | obs-text = <obs-text, see [HTTP], Section 5.6.4> | |||
| quoted-string = <quoted-string, see [HTTP], Section 5.6.4> | quoted-string = <quoted-string, see [HTTP], Section 5.6.4> | |||
| token = <token, see [HTTP], Section 5.6.2> | token = <token, see [HTTP], Section 5.6.2> | |||
| transfer-coding = | transfer-coding = | |||
| <transfer-coding, see [HTTP], Section 10.1.4> | <transfer-coding, see [HTTP], Section 10.1.4> | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t anchor="imported.uri.rules"> | <t anchor="imported.uri.rules"> | |||
| The rules below are defined in <xref target="URI"/>: | The rules below are defined in <xref target="URI"/>: | |||
| </t> | </t> | |||
| <sourcecode type="abnf7230"><![CDATA[ absolute-URI = <absolute-URI , see [URI], Section 4.3> | <sourcecode type="abnf9110"><![CDATA[ absolute-URI = <absolute-URI , see [URI], Section 4.3> | |||
| authority = <authority, see [URI], Section 3.2> | authority = <authority, see [URI], Section 3.2> | |||
| uri-host = <host, see [URI], Section 3.2.2> | uri-host = <host, see [URI], Section 3.2.2> | |||
| port = <port, see [URI], Section 3.2.3> | port = <port, see [URI], Section 3.2.3> | |||
| query = <query, see [URI], Section 3.4> | query = <query, see [URI], Section 3.4> | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="http.message" title="Message"> | <section anchor="http.message" title="Message"> | |||
| <t> | <t> | |||
| HTTP/1.1 clients and servers communicate by sending messages. | HTTP/1.1 clients and servers communicate by sending messages. | |||
| skipping to change at line 238 ¶ | skipping to change at line 219 ¶ | |||
| <iref item="header line"/> | <iref item="header line"/> | |||
| <t> | <t> | |||
| An HTTP/1.1 message consists of a start-line followed by a CRLF and a | An HTTP/1.1 message consists of a start-line followed by a CRLF and a | |||
| sequence of | sequence of | |||
| octets in a format similar to the Internet Message Format | octets in a format similar to the Internet Message Format | |||
| <xref target="RFC5322"/>: zero or more header field lines (collectively | <xref target="RFC5322"/>: zero or more header field lines (collectively | |||
| referred to as the "headers" or the "header section"), an empty line | referred to as the "headers" or the "header section"), an empty line | |||
| indicating the end of the header section, and an optional message body. | indicating the end of the header section, and an optional message body. | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="HTTP-message"/> | <iref primary="true" item="Grammar" subitem="HTTP-message"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ HTTP-message = start-line C RLF | <sourcecode type="abnf9110"><![CDATA[ HTTP-message = start-line C RLF | |||
| *( field-line CRLF ) | *( field-line CRLF ) | |||
| CRLF | CRLF | |||
| [ message-body ] | [ message-body ] | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| A 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 from server to client. Syntactically, the two types of message | response from server to client. Syntactically, the two types of messages | |||
| differ only in the start-line, which is either a request-line (for requests) | differ only in the start-line, which is either a request-line (for requests) | |||
| or a status-line (for responses), and in the algorithm for determining | or a status-line (for responses), and in the algorithm for determining | |||
| the length of the message body (<xref target="message.body"/>). | the length of the message body (<xref target="message.body"/>). | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="start-line"/> | <iref primary="true" item="Grammar" subitem="start-line"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ start-line = request-line / status-line | <sourcecode type="abnf9110"><![CDATA[ start-line = request-line / status-line | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| 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 | In practice, servers are implemented to only expect a request | |||
| (a response is interpreted as an unknown or invalid request method) | (a response is interpreted as an unknown or invalid request method), | |||
| and clients are implemented to only expect a response. | and clients are implemented to only expect a response. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| HTTP makes use of some protocol elements similar to the | HTTP makes use of some protocol elements similar to | |||
| Multipurpose Internet Mail Extensions (MIME) <xref target="RFC2045"/>. | the Multipurpose Internet Mail Extensions (MIME) <xref target="RFC2045"/>. | |||
| See <xref target="differences.between.http.and.mime"/> for the | See <xref target="differences.between.http.and.mime"/> for the | |||
| differences between HTTP and MIME messages. | differences between HTTP and MIME messages. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="message.parsing" title="Message Parsing"> | <section anchor="message.parsing" title="Message Parsing"> | |||
| <t> | <t> | |||
| The normal procedure for parsing an HTTP message is to read the | The normal procedure for parsing an HTTP message is to read the | |||
| start-line into a structure, read each header field line into a hash | start-line into a structure, read each header field line into a hash | |||
| table by field name until the empty line, and then use the parsed | table by field name until the empty line, and then use the parsed | |||
| data to determine if a message body is expected. If a message body | data to determine if a message body is expected. If a message body | |||
| skipping to change at line 353 ¶ | skipping to change at line 334 ¶ | |||
| versions of the protocol. This specification defines version "1.1". | versions of the protocol. This specification defines version "1.1". | |||
| <xref target="HTTP" section="2.5"/> specifies the semantics of HTTP version | <xref target="HTTP" section="2.5"/> specifies the semantics of HTTP version | |||
| numbers. | numbers. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The version of an HTTP/1.x message is indicated by an HTTP-version field | The version of an HTTP/1.x message is indicated by an HTTP-version field | |||
| in the <xref target="message.format" format="none">start-line</xref>. HTTP-ve rsion is case-sensitive. | in the <xref target="message.format" format="none">start-line</xref>. HTTP-ve rsion is case-sensitive. | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="HTTP-version"/> | <iref primary="true" item="Grammar" subitem="HTTP-version"/> | |||
| <iref primary="true" item="Grammar" subitem="HTTP-name"/> | <iref primary="true" item="Grammar" subitem="HTTP-name"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ HTTP-version = HTTP-name "/" DIGIT "." DIGIT | <sourcecode type="abnf9110"><![CDATA[ HTTP-version = HTTP-name "/" DIGIT "." DIGIT | |||
| HTTP-name = %s"HTTP" | HTTP-name = %s"HTTP" | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| When an HTTP/1.1 message is sent to an HTTP/1.0 recipient | When an HTTP/1.1 message is sent to an HTTP/1.0 recipient | |||
| <xref target="HTTP10"/> or a recipient whose version is unknown, | <xref target="HTTP10"/> or a recipient whose version is unknown, | |||
| the HTTP/1.1 message is constructed such that it can be interpreted | 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. | as a valid HTTP/1.0 message if all of the newer features are ignored. | |||
| This specification places recipient-version requirements on some | This specification places recipient-version requirements on some | |||
| new features so that a conformant sender will only use compatible | new features so that a conformant sender will only use compatible | |||
| features until it has determined, through configuration or the | features until it has determined, through configuration or the | |||
| skipping to change at line 394 ¶ | skipping to change at line 375 ¶ | |||
| number correctly or when an intermediary is known to blindly forward | number correctly or when an intermediary is known to blindly forward | |||
| the HTTP-version even when it doesn't conform to the given minor | the HTTP-version even when it doesn't conform to the given minor | |||
| version of the protocol. Such protocol downgrades <bcp14>SHOULD NOT</bcp14> b e | version of the protocol. Such protocol downgrades <bcp14>SHOULD NOT</bcp14> b e | |||
| performed unless triggered by specific client attributes, such as when | performed unless triggered by specific client attributes, such as when | |||
| one or more of the request header fields (e.g., User-Agent) | 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. | uniquely match the values sent by a client known to be in error. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="request.line" title="Request Line"> | <section anchor="request.line" title="Request Line"> | |||
| <t> | <t> | |||
| A request-line begins with a method token, followed by a single | A request-line begins with a method token, followed by a single | |||
| space (SP), the request-target, another single space (SP), and ends | space (SP), the request-target, and another single space (SP), and ends | |||
| with the protocol version. | with the protocol version. | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="request-line"/> | <iref primary="true" item="Grammar" subitem="request-line"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ request-line = method SP reque st-target SP HTTP-version | <sourcecode type="abnf9110"><![CDATA[ request-line = method SP reque st-target SP HTTP-version | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| Although the request-line grammar rule requires that each of the component | Although the request-line grammar rule requires that each of the component | |||
| elements be separated by a single SP octet, recipients <bcp14>MAY</bcp14> ins tead parse | elements be separated by a single SP octet, recipients <bcp14>MAY</bcp14> ins tead parse | |||
| on whitespace-delimited word boundaries and, aside from the CRLF | on whitespace-delimited word boundaries and, aside from the CRLF | |||
| terminator, treat any form of whitespace as the SP separator while | terminator, treat any form of whitespace as the SP separator while | |||
| ignoring preceding or trailing whitespace; such whitespace includes one or | ignoring preceding or trailing whitespace; such whitespace includes one or | |||
| more of the following octets: SP, HTAB, VT (%x0B), FF (%x0C), or bare CR. | more of the following octets: SP, HTAB, VT (%x0B), FF (%x0C), or bare CR. | |||
| However, lenient parsing can result in request smuggling security | However, lenient parsing can result in request smuggling security | |||
| vulnerabilities if there are multiple recipients of the message and each | vulnerabilities if there are multiple recipients of the message and each | |||
| skipping to change at line 435 ¶ | skipping to change at line 416 ¶ | |||
| It is <bcp14>RECOMMENDED</bcp14> that all HTTP senders and recipients support , at a | It is <bcp14>RECOMMENDED</bcp14> that all HTTP senders and recipients support , at a | |||
| minimum, request-line lengths of 8000 octets. | minimum, request-line lengths of 8000 octets. | |||
| </t> | </t> | |||
| <section anchor="request.method" title="Method"> | <section anchor="request.method" title="Method"> | |||
| <iref primary="true" item="method"/> | <iref primary="true" item="method"/> | |||
| <t> | <t> | |||
| The method token indicates the request method to be performed on the | The method token indicates the request method to be performed on the | |||
| target resource. The request method is case-sensitive. | target resource. The request method is case-sensitive. | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="method"/> | <iref primary="true" item="Grammar" subitem="method"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ method = token | <sourcecode type="abnf9110"><![CDATA[ method = token | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| The request methods defined by this specification can be found in | The request methods defined by this specification can be found in | |||
| <xref target="HTTP" section="9"/>, along with information regarding the HTTP method | <xref target="HTTP" section="9"/>, along with information regarding the HTTP method | |||
| registry and considerations for defining new methods. | registry and considerations for defining new methods. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="request.target" title="Request Target"> | <section anchor="request.target" title="Request Target"> | |||
| <iref primary="true" item="request-target"/> | <iref primary="true" item="request-target"/> | |||
| <t> | <t> | |||
| The request-target identifies the target resource upon which to apply the | The request-target identifies the target resource upon which to apply the | |||
| request. The client derives a request-target from its desired target URI. | request. The client derives a request-target from its desired target URI. | |||
| There are four distinct formats for the request-target, depending on both | There are four distinct formats for the request-target, depending on both | |||
| the method being requested and whether the request is to a proxy. | the method being requested and whether the request is to a proxy. | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="request-target"/> | <iref primary="true" item="Grammar" subitem="request-target"/> | |||
| <iref primary="false" item="Grammar" subitem="origin-form"/> | <iref primary="false" item="Grammar" subitem="origin-form"/> | |||
| <iref primary="false" item="Grammar" subitem="absolute-form"/> | <iref primary="false" item="Grammar" subitem="absolute-form"/> | |||
| <iref primary="false" item="Grammar" subitem="authority-form"/> | <iref primary="false" item="Grammar" subitem="authority-form"/> | |||
| <iref primary="false" item="Grammar" subitem="asterisk-form"/> | <iref primary="false" item="Grammar" subitem="asterisk-form"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ request-target = origin-form | <sourcecode type="abnf9110"><![CDATA[ request-target = origin-form | |||
| / absolute-form | / absolute-form | |||
| / authority-form | / authority-form | |||
| / asterisk-form | / asterisk-form | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| No whitespace is allowed in the request-target. | No whitespace is allowed in the request-target. | |||
| Unfortunately, some user agents fail to properly encode or exclude | Unfortunately, some user agents fail to properly encode or exclude | |||
| whitespace found in hypertext references, resulting in those disallowed | whitespace found in hypertext references, resulting in those disallowed | |||
| characters being sent as the request-target in a malformed request-line. | characters being sent as the request-target in a malformed request-line. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Recipients of an invalid request-line <bcp14>SHOULD</bcp14> respond with eith er a | Recipients of an invalid request-line <bcp14>SHOULD</bcp14> respond with eith er a | |||
| 400 (Bad Request) error or a 301 (Moved Permanently) | 400 (Bad Request) error or a 301 (Moved Permanently) | |||
| redirect with the request-target properly encoded. A recipient <bcp14>SHOULD NOT</bcp14> | redirect with the request-target properly encoded. A recipient <bcp14>SHOULD NOT</bcp14> | |||
| attempt to autocorrect and then process the request without a redirect, | attempt to autocorrect and then process the request without a redirect, | |||
| since the invalid request-line might be deliberately crafted to bypass | since the invalid request-line might be deliberately crafted to bypass | |||
| security filters along the request chain. | security filters along the request chain. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A client <bcp14>MUST</bcp14> send a Host header field (<xref target="HTTP" se ction="7.2"/>) | A client <bcp14>MUST</bcp14> send a Host header field (<xref target="HTTP" se ction="7.2"/>) | |||
| in all HTTP/1.1 request messages. | in all HTTP/1.1 request messages. If the target URI includes an authority com | |||
| If the target URI includes an authority component, then a client <bcp14>MUST< | ponent, then a client <bcp14>MUST</bcp14> | |||
| /bcp14> | ||||
| send a field value for Host that is identical to that authority | send a field value for Host that is identical to that authority | |||
| component, excluding any userinfo subcomponent and its "@" delimiter | component, excluding any userinfo subcomponent and its "@" delimiter | |||
| (<xref target="HTTP" section="4.2.1"/>). | (<xref target="HTTP" section="4.2"/>). | |||
| If the authority component is missing or undefined for the target URI, | If the authority component is missing or undefined for the target URI, | |||
| then a client <bcp14>MUST</bcp14> send a Host header field with an empty fiel d value. | then a client <bcp14>MUST</bcp14> send a Host header field with an empty fiel d value. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A server <bcp14>MUST</bcp14> respond with a 400 (Bad Request) status code | A server <bcp14>MUST</bcp14> respond with a 400 (Bad Request) status code | |||
| to any HTTP/1.1 request message that lacks a Host header field and | to any HTTP/1.1 request message that lacks a Host header field and | |||
| to any request message that contains more than one Host header field line | to any request message that contains more than one Host header field line | |||
| or a Host header field with an invalid field value. | or a Host header field with an invalid field value. | |||
| </t> | </t> | |||
| <section anchor="origin-form" title="origin-form"> | ||||
| <iref item="origin-form (of request-target)"/> | <section anchor="origin-form" title="origin-form"> | |||
| <iref item="origin-form (of request-target)"/> | ||||
| <t> | <t> | |||
| The most common form of request-target is the <em>origin-form</em>. | The most common form of request-target is the "origin-form". | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="origin-form"/> | <iref primary="true" item="Grammar" subitem="origin-form"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ origin-form = absolute- path [ "?" query ] | <sourcecode type="abnf9110"><![CDATA[ origin-form = absolute- path [ "?" query ] | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| When making a request directly to an origin server, other than a CONNECT | When making a request directly to an origin server, other than a CONNECT | |||
| or server-wide OPTIONS request (as detailed below), | or server-wide OPTIONS request (as detailed below), | |||
| a client <bcp14>MUST</bcp14> send only the absolute path and query components of | a client <bcp14>MUST</bcp14> send only the absolute path and query components of | |||
| the target URI as the request-target. | the target URI as the request-target. | |||
| If the target URI's path component is empty, the client <bcp14>MUST</bcp14> s end | If the target URI's path component is empty, the client <bcp14>MUST</bcp14> s end | |||
| "/" as the path within the origin-form of request-target. | "/" as the path within the origin-form of request-target. | |||
| A Host header field is also sent, as defined in | A Host header field is also sent, as defined in | |||
| <xref target="HTTP" section="7.2"/>. | <xref target="HTTP" section="7.2"/>. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| For example, a client wishing to retrieve a representation of the resource | For example, a client wishing to retrieve a representation of the resource | |||
| identified as | identified as | |||
| </t> | </t> | |||
| <artwork type="example"><![CDATA[ | <artwork><![CDATA[ | |||
| http://www.example.org/where?q=now | http://www.example.org/where?q=now | |||
| ]]></artwork> | ]]></artwork> | |||
| <t> | <t> | |||
| directly from the origin server would open (or reuse) a TCP connection | directly from the origin server would open (or reuse) a TCP connection | |||
| to port 80 of the host "www.example.org" and send the lines: | to port 80 of the host "www.example.org" and send the lines: | |||
| </t> | </t> | |||
| <sourcecode type="http-message"><![CDATA[GET /where?q=now HTTP/1. 1 | <sourcecode type="http-message"><![CDATA[GET /where?q=now HTTP/1. 1 | |||
| Host: www.example.org | Host: www.example.org | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| followed by the remainder of the request message. | followed by the remainder of the request message. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="absolute-form" title="absolute-form"> | <section anchor="absolute-form" title="absolute-form"> | |||
| <iref item="absolute-form (of request-target)"/> | <iref item="absolute-form (of request-target)"/> | |||
| <t> | <t> | |||
| When making a request to a proxy, other than a CONNECT or server-wide | When making a request to a proxy, other than a CONNECT or server-wide | |||
| OPTIONS request (as detailed below), a client <bcp14>MUST</bcp14> send the ta rget URI | OPTIONS request (as detailed below), a client <bcp14>MUST</bcp14> send the ta rget URI | |||
| in <em>absolute-form</em> as the request-target. | in "absolute-form" as the request-target. | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="absolute-form"/> | <iref primary="true" item="Grammar" subitem="absolute-form"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ absolute-form = absolute- URI | <sourcecode type="abnf9110"><![CDATA[ absolute-form = absolute- URI | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| The proxy is requested to either service that request from a valid cache, | The proxy is requested to either service that request from a valid cache, | |||
| if possible, or make the same request on the client's behalf to either | if possible, or make the same request on the client's behalf either to | |||
| the next inbound proxy server or directly to the origin server indicated | the next inbound proxy server or directly to the origin server indicated | |||
| by the request-target. Requirements on such "forwarding" of messages are | by the request-target. Requirements on such "forwarding" of messages are | |||
| defined in <xref target="HTTP" section="7.6"/>. | defined in <xref target="HTTP" section="7.6"/>. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| An example absolute-form of request-line would be: | An example absolute-form of request-line would be: | |||
| </t> | </t> | |||
| <sourcecode type="http-message"><![CDATA[GET http://www.example.o rg/pub/WWW/TheProject.html HTTP/1.1 | <sourcecode type="http-message"><![CDATA[GET http://www.example.o rg/pub/WWW/TheProject.html HTTP/1.1 | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| skipping to change at line 578 ¶ | skipping to change at line 559 ¶ | |||
| empty Host header field will be sent in this case. | empty Host header field will be sent in this case. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A server <bcp14>MUST</bcp14> accept the absolute-form in requests even though most | A server <bcp14>MUST</bcp14> accept the absolute-form in requests even though most | |||
| HTTP/1.1 clients will only send the absolute-form to a proxy. | HTTP/1.1 clients will only send the absolute-form to a proxy. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="authority-form" title="authority-form"> | <section anchor="authority-form" title="authority-form"> | |||
| <iref item="authority-form (of request-target)"/> | <iref item="authority-form (of request-target)"/> | |||
| <t> | <t> | |||
| The <em>authority-form</em> of request-target is only used for | The "authority-form" of request-target is only used for | |||
| CONNECT requests (<xref target="HTTP" section="9.3.6"/>). It consists of only the | CONNECT requests (<xref target="HTTP" section="9.3.6"/>). It consists of only the | |||
| uri-host and port number of the tunnel | uri-host and port number of the tunnel | |||
| destination, separated by a colon (":"). | destination, separated by a colon (":"). | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="authority-form"/> | <iref primary="true" item="Grammar" subitem="authority-form"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ authority-form = uri-host ":" port | <sourcecode type="abnf9110"><![CDATA[ authority-form = uri-host ":" port | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| When making a CONNECT request to establish a tunnel through one or more | When making a CONNECT request to establish a tunnel through one or more | |||
| proxies, a client <bcp14>MUST</bcp14> send only the host and port of the tunn el | proxies, a client <bcp14>MUST</bcp14> send only the host and port of the tunn el | |||
| destination as the request-target. The client obtains the host and port | destination as the request-target. The client obtains the host and port | |||
| from the target URI's <xref target="imported.uri.rules" format="none">authori ty</xref> component, except that it | from the target URI's <xref target="imported.uri.rules" format="none">authori ty</xref> component, except that it | |||
| sends the scheme's default port if the target URI elides the port. | sends the scheme's default port if the target URI elides the port. | |||
| For example, a CONNECT request to "http://www.example.com" looks like | For example, a CONNECT request to "http://www.example.com" looks like the fol lowing: | |||
| </t> | </t> | |||
| <sourcecode type="http-message"><![CDATA[CONNECT www.example.com: 80 HTTP/1.1 | <sourcecode type="http-message"><![CDATA[CONNECT www.example.com: 80 HTTP/1.1 | |||
| Host: www.example.com | Host: www.example.com | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| </section> | </section> | |||
| <section anchor="asterisk-form" title="asterisk-form"> | <section anchor="asterisk-form" title="asterisk-form"> | |||
| <iref item="asterisk-form (of request-target)"/> | <iref item="asterisk-form (of request-target)"/> | |||
| <t> | <t> | |||
| The <em>asterisk-form</em> of request-target is only used for a server-wide | The "asterisk-form" of request-target is only used for a server-wide | |||
| OPTIONS request (<xref target="HTTP" section="9.3.7"/>). | OPTIONS request (<xref target="HTTP" section="9.3.7"/>). | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="asterisk-form"/> | <iref primary="true" item="Grammar" subitem="asterisk-form"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ asterisk-form = "*" | <sourcecode type="abnf9110"><![CDATA[ asterisk-form = "*" | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| When a client wishes to request OPTIONS | When a client wishes to request OPTIONS | |||
| for the server as a whole, as opposed to a specific named resource of | for the server as a whole, as opposed to a specific named resource of | |||
| that server, the client <bcp14>MUST</bcp14> send only "*" (%x2A) as the reque st-target. | that server, the client <bcp14>MUST</bcp14> send only "*" (%x2A) as the reque st-target. | |||
| For example, | For example, | |||
| </t> | </t> | |||
| <sourcecode type="http-message"><![CDATA[OPTIONS * HTTP/1.1 | <sourcecode type="http-message"><![CDATA[OPTIONS * HTTP/1.1 | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| skipping to change at line 683 ¶ | skipping to change at line 664 ¶ | |||
| Otherwise, the target URI's combined path and | Otherwise, the target URI's combined path and | |||
| <xref target="imported.uri.rules" format="none">query</xref> component is the request-target. | <xref target="imported.uri.rules" format="none">query</xref> component is the request-target. | |||
| </li> | </li> | |||
| <li> | <li> | |||
| The components of a reconstructed target URI, once determined as above, | The components of a reconstructed target URI, once determined as above, | |||
| can be recombined into <xref target="imported.uri.rules" format="none">absolu te-URI</xref> form by concatenating | can be recombined into <xref target="imported.uri.rules" format="none">absolu te-URI</xref> form by concatenating | |||
| the scheme, "://", authority, and combined path and query component. | the scheme, "://", authority, and combined path and query component. | |||
| </li> | </li> | |||
| </ul> | </ul> | |||
| <t> | <t> | |||
| Example 1: the following message received over a secure connection | Example 1: The following message received over a secure connection | |||
| </t> | </t> | |||
| <sourcecode type="http-message"><![CDATA[GET /pub/WWW/TheProject.htm l HTTP/1.1 | <sourcecode type="http-message"><![CDATA[GET /pub/WWW/TheProject.htm l HTTP/1.1 | |||
| Host: www.example.org | Host: www.example.org | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| has a target URI of | has a target URI of | |||
| </t> | </t> | |||
| <artwork type="example"><![CDATA[ | <artwork><![CDATA[ | |||
| https://www.example.org/pub/WWW/TheProject.html | https://www.example.org/pub/WWW/TheProject.html | |||
| ]]></artwork> | ]]></artwork> | |||
| <t> | <t> | |||
| Example 2: the following message received over an insecure connection | Example 2: The following message received over an insecure connection | |||
| </t> | </t> | |||
| <sourcecode type="http-message"><![CDATA[OPTIONS * HTTP/1.1 | <sourcecode type="http-message"><![CDATA[OPTIONS * HTTP/1.1 | |||
| Host: www.example.org:8080 | Host: www.example.org:8080 | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| has a target URI of | has a target URI of | |||
| </t> | </t> | |||
| <artwork type="example"><![CDATA[ | <artwork><![CDATA[ | |||
| http://www.example.org:8080 | http://www.example.org:8080 | |||
| ]]></artwork> | ]]></artwork> | |||
| <t> | <t> | |||
| If the target URI's authority component is empty and its URI scheme | If the target URI's authority component is empty and its URI scheme | |||
| requires a non-empty authority (as is the case for "http" and "https"), | requires a non-empty authority (as is the case for "http" and "https"), | |||
| the server can reject the request or determine whether a configured | the server can reject the request or determine whether a configured | |||
| default applies that is consistent with the incoming connection's context. | default applies that is consistent with the incoming connection's context. | |||
| Context might include connection details like address and port, what | Context might include connection details like address and port, what | |||
| security has been applied, and locally-defined information specific to | security has been applied, and locally defined information specific to | |||
| that server's configuration. An empty authority is replaced with the | that server's configuration. An empty authority is replaced with the | |||
| configured default before further processing of the request. | configured default before further processing of the request. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Supplying a default name for authority within the context of a secured | Supplying a default name for authority within the context of a secured | |||
| connection is inherently unsafe if there is any chance that the user | connection is inherently unsafe if there is any chance that the user | |||
| agent's intended authority might differ from the default. | agent's intended authority might differ from the default. | |||
| A server that can uniquely identify an authority from the request | A server that can uniquely identify an authority from the request | |||
| context <bcp14>MAY</bcp14> use that identity as a default without this risk. | context <bcp14>MAY</bcp14> use that identity as a default without this risk. | |||
| Alternatively, it might be better to redirect the request to a safe | Alternatively, it might be better to redirect the request to a safe | |||
| skipping to change at line 735 ¶ | skipping to change at line 716 ¶ | |||
| <t> | <t> | |||
| Note that reconstructing the client's target URI is only half of the | Note that reconstructing the client's target URI is only half of the | |||
| process for identifying a target resource. The other half is determining | process for identifying a target resource. The other half is determining | |||
| whether that target URI identifies a resource for which the server is | whether that target URI identifies a resource for which the server is | |||
| willing and able to send a response, as defined in | willing and able to send a response, as defined in | |||
| <xref target="HTTP" section="7.4"/>. | <xref target="HTTP" section="7.4"/>. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="status.line" title="Status Line"> | <section anchor="status.line" title="Status Line"> | |||
| <t> | <t> | |||
| 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 space, | of the protocol version, a space (SP), the status code, and another space | |||
| and ending with an <bcp14>OPTIONAL</bcp14> textual phrase describing the stat us code. | and ending with an <bcp14>OPTIONAL</bcp14> textual phrase describing the stat us code. | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="status-line"/> | <iref primary="true" item="Grammar" subitem="status-line"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ status-line = HTTP-version SP st atus-code SP [reason-phrase] | <sourcecode type="abnf9110"><![CDATA[ status-line = HTTP-version SP st atus-code SP [ reason-phrase ] | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| Although the status-line grammar rule requires that each of the component | Although the status-line grammar rule requires that each of the component | |||
| elements be separated by a single SP octet, recipients <bcp14>MAY</bcp14> ins tead parse | elements be separated by a single SP octet, recipients <bcp14>MAY</bcp14> ins tead parse | |||
| on whitespace-delimited word boundaries and, aside from the line | on whitespace-delimited word boundaries and, aside from the line | |||
| terminator, treat any form of whitespace as the SP separator while | terminator, treat any form of whitespace as the SP separator while | |||
| ignoring preceding or trailing whitespace; such whitespace includes one or | ignoring preceding or trailing whitespace; such whitespace includes one or | |||
| more of the following octets: SP, HTAB, VT (%x0B), FF (%x0C), or bare CR. | more of the following octets: SP, HTAB, VT (%x0B), FF (%x0C), or bare CR. | |||
| However, lenient parsing can result in response splitting security | However, lenient parsing can result in response splitting security | |||
| vulnerabilities if there are multiple recipients of the message and each | vulnerabilities if there are multiple recipients of the message and each | |||
| skipping to change at line 765 ¶ | skipping to change at line 747 ¶ | |||
| <t> | <t> | |||
| The status-code element is a 3-digit integer code describing the | The status-code element is a 3-digit integer code describing the | |||
| result of the server's attempt to understand and satisfy the client's | result of the server's attempt to understand and satisfy the client's | |||
| corresponding request. A recipient parses and interprets the remainder | corresponding request. A recipient parses and interprets the remainder | |||
| of the response message in light of the semantics defined for that | of the response message in light of the semantics defined for that | |||
| status code, if the status code is recognized by that recipient, | status code, if the status code is recognized by that recipient, | |||
| or in accordance with the class of that status code when the specific | or in accordance with the class of that status code when the specific | |||
| code is unrecognized. | code is unrecognized. | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="status-code"/> | <iref primary="true" item="Grammar" subitem="status-code"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ status-code = 3DIGIT | <sourcecode type="abnf9110"><![CDATA[ status-code = 3DIGIT | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| HTTP's core status codes are defined in <xref target="HTTP" section="15"/>, | HTTP's core status codes are defined in <xref target="HTTP" section="15"/>, | |||
| along with the classes of status codes, considerations for the | along with the classes of status codes, considerations for the | |||
| definition of new status codes, and the IANA registry for collecting | definition of new status codes, and the IANA registry for collecting | |||
| such definitions. | such definitions. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The reason-phrase element exists for the sole purpose of providing a | The reason-phrase element exists for the sole purpose of providing a | |||
| textual description associated with the numeric status code, mostly out of | textual description associated with the numeric status code, mostly out of | |||
| deference to earlier Internet application protocols that were more | deference to earlier Internet application protocols that were more | |||
| frequently used with interactive text clients. | frequently used with interactive text clients. | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="reason-phrase"/> | <iref primary="true" item="Grammar" subitem="reason-phrase"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ reason-phrase = 1*( HTAB / SP / VCHAR / obs-text ) | <sourcecode type="abnf9110"><![CDATA[ reason-phrase = 1*( HTAB / SP / VCHAR / obs-text ) | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| A client <bcp14>SHOULD</bcp14> ignore the reason-phrase content because it is not a | A client <bcp14>SHOULD</bcp14> ignore the reason-phrase content because it is not a | |||
| reliable channel for information (it might be translated for a given locale, | reliable channel for information (it might be translated for a given locale, | |||
| overwritten by intermediaries, or discarded when the message is forwarded | overwritten by intermediaries, or discarded when the message is forwarded | |||
| via other versions of HTTP). | via other versions of HTTP). | |||
| A server <bcp14>MUST</bcp14> send the space that separates status-code from t he | A server <bcp14>MUST</bcp14> send the space that separates the status-code fr om the | |||
| reason-phrase even when the reason-phrase is absent (i.e., the status-line | reason-phrase even when the reason-phrase is absent (i.e., the status-line | |||
| would end with the three octets SP CR LF). | would end with the space). | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="header.field.syntax" title="Field Syntax"> | <section anchor="header.field.syntax" title="Field Syntax"> | |||
| <t> | <t> | |||
| Each field line consists of a case-insensitive field name | Each field line consists of a case-insensitive field name | |||
| followed by a colon (":"), optional leading whitespace, the field line value, | followed by a colon (":"), optional leading whitespace, the field line value, | |||
| and optional trailing whitespace. | and optional trailing whitespace. | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="field-line"/> | <iref primary="true" item="Grammar" subitem="field-line"/> | |||
| <iref primary="false" item="Grammar" subitem="field-name"/> | <iref primary="false" item="Grammar" subitem="field-name"/> | |||
| <iref primary="false" item="Grammar" subitem="field-value"/> | <iref primary="false" item="Grammar" subitem="field-value"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ field-line = field-name ":" OW S field-value OWS | <sourcecode type="abnf9110"><![CDATA[ field-line = field-name ":" OW S field-value OWS | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| Most HTTP field names and the rules for parsing within field values are | Rules for parsing within field values are | |||
| defined in <xref target="HTTP" section="6.3"/>. This section covers the | defined in <xref target="HTTP" section="5.5"/>. This section covers the | |||
| generic syntax for header field inclusion within, and extraction from, | generic syntax for header field inclusion within, and extraction from, | |||
| HTTP/1.1 messages. | HTTP/1.1 messages. | |||
| </t> | </t> | |||
| <section anchor="field.parsing" title="Field Line Parsing"> | <section anchor="field.parsing" title="Field Line Parsing"> | |||
| <t> | <t> | |||
| Messages are parsed using a generic algorithm, independent of the | Messages are parsed using a generic algorithm, independent of the | |||
| individual field names. The contents within a given field line value are | individual field names. The contents within a given field line value are | |||
| not parsed until a later stage of message interpretation (usually after the | not parsed until a later stage of message interpretation (usually after the | |||
| message's entire field section has been processed). | message's entire field section has been processed). | |||
| </t> | </t> | |||
| skipping to change at line 841 ¶ | skipping to change at line 823 ¶ | |||
| occurring before the first non-whitespace octet of the field line value, | occurring before the first non-whitespace octet of the field line value, | |||
| or after the last non-whitespace octet of the field line value, is excluded b y | or after the last non-whitespace octet of the field line value, is excluded b y | |||
| parsers when extracting the field line value from a field line. | parsers when extracting the field line value from a field line. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="line.folding" title="Obsolete Line Folding"> | <section anchor="line.folding" title="Obsolete Line Folding"> | |||
| <t> | <t> | |||
| Historically, HTTP/1.x field values could be extended over multiple | Historically, HTTP/1.x field values could be extended over multiple | |||
| lines by preceding each extra line with at least one space or horizontal | lines by preceding each extra line with at least one space or horizontal | |||
| tab (obs-fold). This specification deprecates such line folding except | tab (obs-fold). This specification deprecates such line folding except | |||
| within the message/http media type | within the "message/http" media type | |||
| (<xref target="media.type.message.http"/>). | (<xref target="media.type.message.http"/>). | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="obs-fold"/> | <iref primary="true" item="Grammar" subitem="obs-fold"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ obs-fold = OWS CRLF RWS | <sourcecode type="abnf9110"><![CDATA[ obs-fold = OWS CRLF RWS | |||
| ; obsolete line folding | ; obsolete line folding | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| A sender <bcp14>MUST NOT</bcp14> generate a message that includes line foldin g | A sender <bcp14>MUST NOT</bcp14> generate a message that includes line foldin g | |||
| (i.e., that has any field line value that contains a match to the | (i.e., that has any field line value that contains a match to the | |||
| <xref target="line.folding" format="none">obs-fold</xref> rule) unless the me ssage is intended for packaging | <xref target="line.folding" format="none">obs-fold</xref> rule) unless the me ssage is intended for packaging | |||
| within the message/http media type. | within the "message/http" media type. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A server that receives an <xref target="line.folding" format="none">obs-fold< /xref> in a request message that | A server that receives an <xref target="line.folding" format="none">obs-fold< /xref> in a request message that | |||
| is not within a message/http container <bcp14>MUST</bcp14> either reject the message by | is not within a "message/http" container <bcp14>MUST</bcp14> either reject th e message by | |||
| sending a 400 (Bad Request), preferably with a | sending a 400 (Bad Request), preferably with a | |||
| representation explaining that obsolete line folding is unacceptable, or | representation explaining that obsolete line folding is unacceptable, or | |||
| replace each received <xref target="line.folding" format="none">obs-fold</xre f> with one or more | replace each received <xref target="line.folding" format="none">obs-fold</xre f> with one or more | |||
| <xref target="core.rules" format="none">SP</xref> octets prior to interpretin g the field value or | <xref target="core.rules" format="none">SP</xref> octets prior to interpretin g the field value or | |||
| forwarding the message downstream. | forwarding the message downstream. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A proxy or gateway that receives an <xref target="line.folding" format="none" >obs-fold</xref> in a response | A proxy or gateway that receives an <xref target="line.folding" format="none" >obs-fold</xref> in a response | |||
| message that is not within a message/http container <bcp14>MUST</bcp14> eithe r discard | message that is not within a "message/http" container <bcp14>MUST</bcp14> eit her discard | |||
| the message and replace it with a 502 (Bad Gateway) | the message and replace it with a 502 (Bad Gateway) | |||
| response, preferably with a representation explaining that unacceptable | response, preferably with a representation explaining that unacceptable | |||
| line folding was received, or replace each received <xref target="line.foldin g" format="none">obs-fold</xref> | line folding was received, or replace each received <xref target="line.foldin g" format="none">obs-fold</xref> | |||
| with one or more <xref target="core.rules" format="none">SP</xref> octets pri or to interpreting the field | with one or more <xref target="core.rules" format="none">SP</xref> octets pri or to interpreting the field | |||
| value or forwarding the message downstream. | value or forwarding the message downstream. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A user agent that receives an <xref target="line.folding" format="none">obs-f old</xref> in a response message | A user agent that receives an <xref target="line.folding" format="none">obs-f old</xref> in a response message | |||
| that is not within a message/http container <bcp14>MUST</bcp14> replace each received | that is not within a "message/http" container <bcp14>MUST</bcp14> replace eac h received | |||
| <xref target="line.folding" format="none">obs-fold</xref> with one or more <x ref target="core.rules" format="none">SP</xref> octets prior to | <xref target="line.folding" format="none">obs-fold</xref> with one or more <x ref target="core.rules" format="none">SP</xref> octets prior to | |||
| interpreting the field value. | interpreting the field value. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="message.body" title="Message Body"> | <section anchor="message.body" title="Message Body"> | |||
| <t> | <t> | |||
| The message body (if any) of an HTTP/1.1 message is used to carry content | The message body (if any) of an HTTP/1.1 message is used to carry content | |||
| (<xref target="HTTP" section="6.4"/>) for the request or response. The | (<xref target="HTTP" section="6.4"/>) for the request or response. The | |||
| message body is identical to the content unless a transfer coding has | message body is identical to the content unless a transfer coding has | |||
| been applied, as described in <xref target="field.transfer-encoding"/>. | been applied, as described in <xref target="field.transfer-encoding"/>. | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="message-body"/> | <iref primary="true" item="Grammar" subitem="message-body"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ message-body = *OCTET | <sourcecode type="abnf9110"><![CDATA[ message-body = *OCTET | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| The rules for determining when a message body is present in an HTTP/1.1 | The rules for determining when a message body is present in an HTTP/1.1 | |||
| message differ for requests and responses. | message differ for requests and responses. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The presence of a message body in a request is signaled by a | The presence of a message body in a request is signaled by a | |||
| <xref target="body.content-length" format="none">Content-Length</xref> or <xr ef target="field.transfer-encoding" format="none">Transfer-Encoding</xref> heade r | <xref target="body.content-length" format="none">Content-Length</xref> or <xr ef target="field.transfer-encoding" format="none">Transfer-Encoding</xref> heade r | |||
| field. Request message framing is independent of method semantics. | field. Request message framing is independent of method semantics. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The presence of a message body in a response depends on both the request | The presence of a message body in a response, as detailed in | |||
| method to which it is responding and the response status code (<xref target=" | <xref target="message.body.length"/>, depends on both the request | |||
| status.line"/>), and corresponds to when content is | method to which it is responding and the response status code. | |||
| allowed; see <xref target="HTTP" section="6.4"/>. | This corresponds to when response content is | |||
| allowed by HTTP semantics (<xref target="HTTP" section="6.4.1"/>). | ||||
| </t> | </t> | |||
| <section anchor="field.transfer-encoding" title="Transfer-Encoding"> | <section anchor="field.transfer-encoding" title="Transfer-Encoding"> | |||
| <iref primary="true" item="Fields" subitem="Transfer-Encoding"/> | <iref primary="true" item="Fields" subitem="Transfer-Encoding"/> | |||
| <iref primary="true" item="Header Fields" subitem="Transfer-Encoding "/> | <iref primary="true" item="Header Fields" subitem="Transfer-Encoding "/> | |||
| <iref primary="true" item="Transfer-Encoding header field"/> | <iref primary="true" item="Transfer-Encoding header field"/> | |||
| <iref item="chunked (Coding Format)"/> | <iref item="chunked (Coding Format)"/> | |||
| <t> | <t> | |||
| 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 | corresponding to the sequence of transfer codings that have been | |||
| (or will be) applied to the content in order to form the message body. | (or will be) applied to the content in order to form the message body. | |||
| Transfer codings are defined in <xref target="transfer.codings"/>. | Transfer codings are defined in <xref target="transfer.codings"/>. | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="Transfer-Encoding"/> | <iref primary="true" item="Grammar" subitem="Transfer-Encoding"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ Transfer-Encoding = #transfer -coding | <sourcecode type="abnf9110"><![CDATA[ Transfer-Encoding = #transfer -coding | |||
| ; defined in [HTTP], Section 10.1.4 | ; defined in [HTTP], Section 10.1.4 | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| Transfer-Encoding is analogous to the Content-Transfer-Encoding field of | Transfer-Encoding is analogous to the Content-Transfer-Encoding field of | |||
| MIME, which was designed to enable safe transport of binary data over a | MIME, which was designed to enable safe transport of binary data over a | |||
| 7-bit transport service (<xref target="RFC2045" sectionFormat="comma" section ="6"/>). | 7-bit transport service (<xref target="RFC2045" sectionFormat="comma" section ="6"/>). | |||
| However, safe transport has a different focus for an 8bit-clean transfer | However, safe transport has a different focus for an 8bit-clean transfer | |||
| protocol. In HTTP's case, Transfer-Encoding is primarily intended to | protocol. In HTTP's case, Transfer-Encoding is primarily intended to | |||
| accurately delimit dynamically generated content. It also serves to | accurately delimit dynamically generated content. It also serves to | |||
| distinguish encodings that are only applied in transit from the encodings | distinguish encodings that are only applied in transit from the encodings | |||
| skipping to change at line 954 ¶ | skipping to change at line 938 ¶ | |||
| </t> | </t> | |||
| <sourcecode type="http-message"><![CDATA[Transfer-Encoding: gzip, ch unked | <sourcecode type="http-message"><![CDATA[Transfer-Encoding: gzip, ch unked | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| indicates that the content has been compressed using the gzip | indicates that the content has been compressed using the gzip | |||
| coding and then chunked using the chunked coding while forming the | coding and then chunked using the chunked coding while forming the | |||
| message body. | message body. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Unlike Content-Encoding (<xref target="HTTP" section="8.4.1"/>), | Unlike Content-Encoding (<xref target="HTTP" section="8.4.1"/>), | |||
| Transfer-Encoding is a property of the message, not of the representation, an | Transfer-Encoding is a property of the message, not of the representation. | |||
| d | Any recipient along the request/response chain <bcp14>MAY</bcp14> decode the | |||
| any recipient along the request/response chain <bcp14>MAY</bcp14> decode the | received | |||
| received | ||||
| transfer coding(s) or apply additional transfer coding(s) to the message | transfer coding(s) or apply additional transfer coding(s) to the message | |||
| body, assuming that corresponding changes are made to the Transfer-Encoding | body, assuming that corresponding changes are made to the Transfer-Encoding | |||
| field value. Additional information about the encoding parameters can be | field value. Additional information about the encoding parameters can be | |||
| provided by other header fields not defined by this specification. | provided by other header fields not defined by this specification. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Transfer-Encoding <bcp14>MAY</bcp14> be sent in a response to a HEAD request or in a | Transfer-Encoding <bcp14>MAY</bcp14> be sent in a response to a HEAD request or in a | |||
| 304 (Not Modified) response (<xref target="HTTP" section="15.4.5"/>) to a GET request, | 304 (Not Modified) response (<xref target="HTTP" section="15.4.5"/>) to a GET request, | |||
| neither of which includes a message body, | neither of which includes a message body, | |||
| to indicate that the origin server would have applied a transfer coding | to indicate that the origin server would have applied a transfer coding | |||
| skipping to change at line 987 ¶ | skipping to change at line 971 ¶ | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A server that receives a request message with a transfer coding it does | A server that receives a request message with a transfer coding it does | |||
| not understand <bcp14>SHOULD</bcp14> respond with 501 (Not Implemented). | not understand <bcp14>SHOULD</bcp14> respond with 501 (Not Implemented). | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Transfer-Encoding was added in HTTP/1.1. It is generally assumed that | Transfer-Encoding was added in HTTP/1.1. It is generally assumed that | |||
| implementations advertising only HTTP/1.0 support will not understand | implementations advertising only HTTP/1.0 support will not understand | |||
| how to process transfer-encoded content, and that an HTTP/1.0 message | how to process transfer-encoded content, and that an HTTP/1.0 message | |||
| received with a Transfer-Encoding is likely to have been forwarded | received with a Transfer-Encoding is likely to have been forwarded | |||
| without proper handling of the chunked encoding in transit. | without proper handling of the chunked transfer coding in transit. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A client <bcp14>MUST NOT</bcp14> send a request containing Transfer-Encoding unless it | A client <bcp14>MUST NOT</bcp14> send a request containing Transfer-Encoding unless it | |||
| knows the server will handle HTTP/1.1 requests (or later minor revisions); | knows the server will handle HTTP/1.1 requests (or later minor revisions); | |||
| such knowledge might be in the form of specific user configuration or by | such knowledge might be in the form of specific user configuration or by | |||
| remembering the version of a prior received response. | remembering the version of a prior received response. | |||
| A server <bcp14>MUST NOT</bcp14> send a response containing Transfer-Encoding unless | A server <bcp14>MUST NOT</bcp14> send a response containing Transfer-Encoding unless | |||
| the corresponding request indicates HTTP/1.1 (or later minor revisions). | the corresponding request indicates HTTP/1.1 (or later minor revisions). | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Early implementations of Transfer-Encoding would occasionally send both | Early implementations of Transfer-Encoding would occasionally send both | |||
| a chunked encoding for message framing and an estimated Content-Length | a chunked transfer coding for message framing and an estimated Content-Length | |||
| header field for use by progress bars. This is why Transfer-Encoding is | header field for use by progress bars. This is why Transfer-Encoding is | |||
| defined as overriding Content-Length, as opposed to them being mutually | defined as overriding Content-Length, as opposed to them being mutually | |||
| incompatible. Unfortunately, forwarding such a message can lead to | incompatible. Unfortunately, forwarding such a message can lead to | |||
| vulnerabilities regarding | vulnerabilities regarding | |||
| request smuggling (<xref target="request.smuggling"/>) or | request smuggling (<xref target="request.smuggling"/>) or | |||
| response splitting (<xref target="response.splitting"/>) attacks | response splitting (<xref target="response.splitting"/>) attacks | |||
| if any downstream recipient fails to parse the message according to this | if any downstream recipient fails to parse the message according to this | |||
| specification, particularly when a downstream recipient only implements | specification, particularly when a downstream recipient only implements | |||
| HTTP/1.0. | HTTP/1.0. | |||
| </t> | </t> | |||
| skipping to change at line 1040 ¶ | skipping to change at line 1024 ¶ | |||
| as a decimal number of octets, for potential content. | as a decimal number of octets, for potential content. | |||
| For messages that do include content, the Content-Length field value | For messages that do include content, the Content-Length field value | |||
| provides the framing information necessary for determining where the data | provides the framing information necessary for determining where the data | |||
| (and message) ends. For messages that do not include content, the | (and message) ends. For messages that do not include content, the | |||
| Content-Length indicates the size of the selected representation | Content-Length indicates the size of the selected representation | |||
| (<xref target="HTTP" section="8.6"/>). | (<xref target="HTTP" section="8.6"/>). | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A sender <bcp14>MUST NOT</bcp14> send a Content-Length header field in any me ssage that | A sender <bcp14>MUST NOT</bcp14> send a Content-Length header field in any me ssage that | |||
| contains a <xref target="field.transfer-encoding" format="none">Transfer-Enco ding</xref> header field. | contains a <xref target="field.transfer-encoding" format="none">Transfer-Enco ding</xref> header field. | |||
| </t> | </t> | |||
| <aside> | ||||
| <t> | <aside> | |||
| <strong>Note:</strong> HTTP's use of Content-Length for messag | <t> | |||
| e framing differs | <strong>Note:</strong> HTTP's use of Content-Length for message framing differs | |||
| significantly from the same field's use in MIME, where it is an optional | significantly from the same field's use in MIME, where it is an optional | |||
| field used only within the "message/external-body" media-type. | field used only within the "message/external-body" media-type. | |||
| </t> | </t> | |||
| </aside> | </aside> | |||
| </section> | </section> | |||
| <section anchor="message.body.length" title="Message Body Length"> | <section anchor="message.body.length" title="Message Body Length"> | |||
| <iref item="chunked (Coding Format)"/> | <iref item="chunked (Coding Format)"/> | |||
| <t> | <t> | |||
| The length of a message body is determined by one of the following | The length of a message body is determined by one of the following | |||
| (in order of precedence): | (in order of precedence): | |||
| </t> | </t> | |||
| <ol> | <ol> | |||
| <li> | <li> | |||
| <t> | ||||
| Any response to a HEAD request and any response with a | Any response to a HEAD request and any response with a | |||
| 1xx (Informational), 204 (No Content), or | 1xx (Informational), 204 (No Content), or | |||
| 304 (Not Modified) status code is always | 304 (Not Modified) status code is always | |||
| terminated by the first empty line after the header fields, regardless of | terminated by the first empty line after the header fields, regardless of | |||
| the header fields present in the message, and thus cannot contain a | the header fields present in the message, and thus cannot contain a | |||
| message body or trailer section. | message body or trailer section. | |||
| </t> | ||||
| </li> | </li> | |||
| <li> | <li> | |||
| <t> | ||||
| Any 2xx (Successful) response to a CONNECT request implies that the | Any 2xx (Successful) response to a CONNECT request implies that the | |||
| connection will become a tunnel immediately after the empty line that | connection will become a tunnel immediately after the empty line that | |||
| concludes the header fields. A client <bcp14>MUST</bcp14> ignore any | concludes the header fields. A client <bcp14>MUST</bcp14> ignore any | |||
| <xref target="body.content-length" format="none">Content-Length</xref> or <xr ef target="field.transfer-encoding" format="none">Transfer-Encoding</xref> heade r | <xref target="body.content-length" format="none">Content-Length</xref> or <xr ef target="field.transfer-encoding" format="none">Transfer-Encoding</xref> heade r | |||
| fields received in such a message. | fields received in such a message. | |||
| </t> | ||||
| </li> | </li> | |||
| <li> | <li> | |||
| <t> | ||||
| If a message is received with both a <xref target="field.transfer-encoding" f ormat="none">Transfer-Encoding</xref> | If a message is received with both a <xref target="field.transfer-encoding" f ormat="none">Transfer-Encoding</xref> | |||
| and a <xref target="body.content-length" format="none">Content-Length</xref> header field, the Transfer-Encoding | and a <xref target="body.content-length" format="none">Content-Length</xref> header field, the Transfer-Encoding | |||
| overrides the Content-Length. Such a message might indicate an attempt to | overrides the Content-Length. Such a message might indicate an attempt to | |||
| perform request smuggling (<xref target="request.smuggling"/>) or | perform request smuggling (<xref target="request.smuggling"/>) or | |||
| response splitting (<xref target="response.splitting"/>) and ought to be | response splitting (<xref target="response.splitting"/>) and ought to be | |||
| handled as an error. | handled as an error. | |||
| An intermediary that chooses to forward the message <bcp14>MUST</bcp14> first remove the | An intermediary that chooses to forward the message <bcp14>MUST</bcp14> first remove the | |||
| received Content-Length field and process the Transfer-Encoding | received Content-Length field and process the Transfer-Encoding | |||
| (as described below) prior to forwarding the message downstream. | (as described below) prior to forwarding the message downstream. | |||
| </t> | ||||
| </li> | </li> | |||
| <li> | <li> | |||
| <t> | <t> | |||
| If a <xref target="field.transfer-encoding" format="none">Transfer-Encoding</ xref> header field is present | If a <xref target="field.transfer-encoding" format="none">Transfer-Encoding</ xref> header field is present | |||
| and the chunked transfer coding (<xref target="chunked.encoding"/>) | and the chunked transfer coding (<xref target="chunked.encoding"/>) | |||
| is the final encoding, the message body length is determined by reading | is the final encoding, the message body length is determined by reading | |||
| and decoding the chunked data until the transfer coding indicates the | and decoding the chunked data until the transfer coding indicates the | |||
| data is complete. | data is complete. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| If a <xref target="field.transfer-encoding" format="none">Transfer-Encoding</ xref> header field is present in a | If a <xref target="field.transfer-encoding" format="none">Transfer-Encoding</ xref> header field is present in a | |||
| response and the chunked transfer coding is not the final encoding, the | response and the chunked transfer coding is not the final encoding, the | |||
| message body length is determined by reading the connection until it is | message body length is determined by reading the connection until it is | |||
| skipping to change at line 1111 ¶ | skipping to change at line 1090 ¶ | |||
| </t> | </t> | |||
| <t> | <t> | |||
| If a <xref target="field.transfer-encoding" format="none">Transfer-Encoding</ xref> header field is present in a request | If a <xref target="field.transfer-encoding" format="none">Transfer-Encoding</ xref> header field is present in a request | |||
| and the chunked transfer coding is not the final encoding, the message body | and the chunked transfer coding is not the final encoding, the message body | |||
| length cannot be determined reliably; the server <bcp14>MUST</bcp14> respond with | length cannot be determined reliably; the server <bcp14>MUST</bcp14> respond with | |||
| the 400 (Bad Request) status code and then close the | the 400 (Bad Request) status code and then close the | |||
| connection. | connection. | |||
| </t> | </t> | |||
| </li> | </li> | |||
| <li> | <li> | |||
| <t> | ||||
| If a message is received without <xref target="field.transfer-encoding" forma t="none">Transfer-Encoding</xref> and with | If a message is received without <xref target="field.transfer-encoding" forma t="none">Transfer-Encoding</xref> and with | |||
| an invalid <xref target="body.content-length" format="none">Content-Length</x ref> header field, then the message | an invalid <xref target="body.content-length" format="none">Content-Length</x ref> header field, then the message | |||
| framing is invalid and the recipient <bcp14>MUST</bcp14> treat it as an unrec overable | framing is invalid and the recipient <bcp14>MUST</bcp14> treat it as an unrec overable | |||
| error, unless the field value can be successfully parsed as a | error, unless the field value can be successfully parsed as a | |||
| comma-separated list (<xref target="HTTP" section="5.6.1"/>), all values in t he | comma-separated list (<xref target="HTTP" section="5.6.1"/>), all values in t he | |||
| list are valid, and all values in the list are the same (in which case the | list are valid, and all values in the list are the same (in which case, the | |||
| message is processed with that single value used as the Content-Length field | message is processed with that single value used as the Content-Length field | |||
| value). | value). | |||
| If the unrecoverable error is in a request message, | If the unrecoverable error is in a request message, | |||
| the server <bcp14>MUST</bcp14> respond with | the server <bcp14>MUST</bcp14> respond with | |||
| a 400 (Bad Request) status code and then close the connection. | a 400 (Bad Request) status code and then close the connection. | |||
| If it is in a response message received by a proxy, | If it is in a response message received by a proxy, | |||
| the proxy <bcp14>MUST</bcp14> close the connection to the server, discard the received | the proxy <bcp14>MUST</bcp14> close the connection to the server, discard the received | |||
| response, and send a 502 (Bad Gateway) response to the | response, and send a 502 (Bad Gateway) response to the | |||
| client. | client. | |||
| If it is in a response message received by a user agent, | If it is in a response message received by a user agent, | |||
| the user agent <bcp14>MUST</bcp14> close the connection to the server and dis card the | the user agent <bcp14>MUST</bcp14> close the connection to the server and dis card the | |||
| received response. | received response. | |||
| </t> | ||||
| </li> | </li> | |||
| <li> | <li> | |||
| <t> | ||||
| If a valid <xref target="body.content-length" format="none">Content-Length</x ref> header field is present without | If a valid <xref target="body.content-length" format="none">Content-Length</x ref> header field is present without | |||
| <xref target="field.transfer-encoding" format="none">Transfer-Encoding</xref> , its decimal value defines the | <xref target="field.transfer-encoding" format="none">Transfer-Encoding</xref> , its decimal value defines the | |||
| expected message body length in octets. | expected message body length in octets. | |||
| If the sender closes the connection or the recipient times out before the | If the sender closes the connection or the recipient times out before the | |||
| indicated number of octets are received, the recipient <bcp14>MUST</bcp14> co nsider | indicated number of octets are received, the recipient <bcp14>MUST</bcp14> co nsider | |||
| the message to be incomplete and close the connection. | the message to be incomplete and close the connection. | |||
| </t> | ||||
| </li> | </li> | |||
| <li> | <li> | |||
| <t> | ||||
| If this is a request message and none of the above are true, then the | If this is a request message and none of the above are true, then the | |||
| message body length is zero (no message body is present). | message body length is zero (no message body is present). | |||
| </t> | ||||
| </li> | </li> | |||
| <li> | <li> | |||
| <t> | ||||
| Otherwise, this is a response message without a declared message body | Otherwise, this is a response message without a declared message body | |||
| length, so the message body length is determined by the number of octets | length, so the message body length is determined by the number of octets | |||
| received prior to the server closing the connection. | received prior to the server closing the connection. | |||
| </t> | ||||
| </li> | </li> | |||
| </ol> | </ol> | |||
| <t> | <t> | |||
| Since there is no way to distinguish a successfully completed, | Since there is no way to distinguish a successfully completed, | |||
| close-delimited response message from a partially received message interrupte d | close-delimited response message from a partially received message interrupte d | |||
| by network failure, a server <bcp14>SHOULD</bcp14> generate encoding or | by network failure, a server <bcp14>SHOULD</bcp14> generate encoding or | |||
| length-delimited messages whenever possible. The close-delimiting | length-delimited messages whenever possible. The close-delimiting | |||
| feature exists primarily for backwards compatibility with HTTP/1.0. | feature exists primarily for backwards compatibility with HTTP/1.0. | |||
| </t> | </t> | |||
| <aside> | <aside> | |||
| <t> | <t> | |||
| <strong>Note:</strong> Request messages are never close-delimi | <strong>Note:</strong> Request messages are never close-delimited because they a | |||
| ted because they are always | re always | |||
| explicitly framed by length or transfer coding, with the absence of both im plying | explicitly framed by length or transfer coding, with the absence of both im plying | |||
| the request ends immediately after the header section. | the request ends immediately after the header section. | |||
| </t> | </t> | |||
| </aside> | </aside> | |||
| <t> | <t> | |||
| A server <bcp14>MAY</bcp14> reject a request that contains a message body but | A server <bcp14>MAY</bcp14> reject a request that contains a message body but | |||
| not a <xref target="body.content-length" format="none">Content-Length</xref> by responding with | not a <xref target="body.content-length" format="none">Content-Length</xref> by responding with | |||
| 411 (Length Required). | 411 (Length Required). | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Unless a transfer coding other than chunked has been applied, | Unless a transfer coding other than chunked has been applied, | |||
| a client that sends a request containing a message body <bcp14>SHOULD</bcp14> | a client that sends a request containing a message body <bcp14>SHOULD</bcp14> | |||
| use a valid <xref target="body.content-length" format="none">Content-Length</ xref> header field if the message body | use a valid <xref target="body.content-length" format="none">Content-Length</ xref> header field if the message body | |||
| length is known in advance, rather than the chunked transfer coding, since so me | length is known in advance, rather than the chunked transfer coding, since so me | |||
| existing services respond to chunked with a 411 (Length Required) | existing services respond to chunked with a 411 (Length Required) | |||
| status code even though they understand the chunked transfer coding. This | status code even though they understand the chunked transfer coding. This | |||
| is typically because such services are implemented via a gateway that | is typically because such services are implemented via a gateway that | |||
| requires a content-length in advance of being called and the server | requires a content length in advance of being called, and the server | |||
| is unable or unwilling to buffer the entire request before processing. | is unable or unwilling to buffer the entire request before processing. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A user agent that sends a request that contains a message body <bcp14>MUST</b cp14> send | A user agent that sends a request that contains a message body <bcp14>MUST</b cp14> send | |||
| either a valid <xref target="body.content-length" format="none">Content-Lengt h</xref> header field or use the | either a valid <xref target="body.content-length" format="none">Content-Lengt h</xref> header field or use the | |||
| chunked transfer coding. A client <bcp14>MUST NOT</bcp14> use the chunked tra nsfer | chunked transfer coding. A client <bcp14>MUST NOT</bcp14> use the chunked tra nsfer | |||
| encoding unless it knows the server will handle HTTP/1.1 (or later) | coding unless it knows the server will handle HTTP/1.1 (or later) | |||
| requests; such knowledge can be in the form of specific user configuration | requests; such knowledge can be in the form of specific user configuration | |||
| or by remembering the version of a prior received response. | or by remembering the version of a prior received response. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| If the final response to the last request on a connection has been | If the final response to the last request on a connection has been | |||
| completely received and there remains additional data to read, a user agent | completely received and there remains additional data to read, a user agent | |||
| <bcp14>MAY</bcp14> discard the remaining data or attempt to determine if that data | <bcp14>MAY</bcp14> discard the remaining data or attempt to determine if that data | |||
| belongs as part of the prior message body, which might be the case if the | belongs as part of the prior message body, which might be the case if the | |||
| prior message's Content-Length value is incorrect. A client <bcp14>MUST NOT</ bcp14> | prior message's Content-Length value is incorrect. A client <bcp14>MUST NOT</ bcp14> | |||
| process, cache, or forward such extra data as a separate response, since | process, cache, or forward such extra data as a separate response, since | |||
| skipping to change at line 1240 ¶ | skipping to change at line 1211 ¶ | |||
| buffers, which enables the sender to retain connection persistence and the | buffers, which enables the sender to retain connection persistence and the | |||
| recipient to know when it has received the entire message. | recipient to know when it has received the entire message. | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="chunked-body"/> | <iref primary="true" item="Grammar" subitem="chunked-body"/> | |||
| <iref primary="true" item="Grammar" subitem="chunk"/> | <iref primary="true" item="Grammar" subitem="chunk"/> | |||
| <iref primary="true" item="Grammar" subitem="chunk-size"/> | <iref primary="true" item="Grammar" subitem="chunk-size"/> | |||
| <iref primary="true" item="Grammar" subitem="last-chunk"/> | <iref primary="true" item="Grammar" subitem="last-chunk"/> | |||
| <iref primary="false" item="Grammar" subitem="trailer-section"/> | <iref primary="false" item="Grammar" subitem="trailer-section"/> | |||
| <iref primary="false" item="Grammar" subitem="chunk-ext"/> | <iref primary="false" item="Grammar" subitem="chunk-ext"/> | |||
| <iref primary="true" item="Grammar" subitem="chunk-data"/> | <iref primary="true" item="Grammar" subitem="chunk-data"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ chunked-body = *chunk | <sourcecode type="abnf9110"><![CDATA[ chunked-body = *chunk | |||
| last-chunk | last-chunk | |||
| trailer-section | 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 | |||
| skipping to change at line 1272 ¶ | skipping to change at line 1243 ¶ | |||
| HTTP/1.1 does not define any means to limit the size of a | HTTP/1.1 does not define any means to limit the size of a | |||
| chunked response such that an intermediary can be assured of buffering the | chunked response such that an intermediary can be assured of buffering the | |||
| entire response. Additionally, very large chunk sizes may cause overflows | entire response. Additionally, very large chunk sizes may cause overflows | |||
| or loss of precision if their values are not represented accurately in a | or loss of precision if their values are not represented accurately in a | |||
| receiving implementation. Therefore, recipients <bcp14>MUST</bcp14> anticipat e | receiving implementation. Therefore, recipients <bcp14>MUST</bcp14> anticipat e | |||
| potentially large hexadecimal numerals and prevent parsing errors due to | potentially large hexadecimal numerals and prevent parsing errors due to | |||
| integer conversion overflows or precision loss due to integer | integer conversion overflows or precision loss due to integer | |||
| representation. | representation. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The chunked encoding does not define any parameters. Their presence | The chunked coding does not define any parameters. Their presence | |||
| <bcp14>SHOULD</bcp14> be treated as an error. | <bcp14>SHOULD</bcp14> be treated as an error. | |||
| </t> | </t> | |||
| <section anchor="chunked.extension" title="Chunk Extensions"> | <section anchor="chunked.extension" title="Chunk Extensions"> | |||
| <t> | <t> | |||
| The chunked encoding allows each chunk to include zero or more chunk | The chunked coding allows each chunk to include zero or more chunk | |||
| extensions, immediately following the <xref target="chunked.encoding" format= "none">chunk-size</xref>, for the | extensions, immediately following the <xref target="chunked.encoding" format= "none">chunk-size</xref>, for the | |||
| sake of supplying per-chunk metadata (such as a signature or hash), | sake of supplying per-chunk metadata (such as a signature or hash), | |||
| mid-message control information, or randomization of message body size. | mid-message control information, or randomization of message body size. | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="chunk-ext"/> | <iref primary="true" item="Grammar" subitem="chunk-ext"/> | |||
| <iref primary="true" item="Grammar" subitem="chunk-ext-name"/> | <iref primary="true" item="Grammar" subitem="chunk-ext-name"/> | |||
| <iref primary="true" item="Grammar" subitem="chunk-ext-val"/> | <iref primary="true" item="Grammar" subitem="chunk-ext-val"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ chunk-ext = *( BWS "; " BWS chunk-ext-name | <sourcecode type="abnf9110"><![CDATA[ chunk-ext = *( BWS "; " BWS chunk-ext-name | |||
| [ BWS "=" BWS chunk-ext-val ] ) | [ 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 | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| The chunked encoding is specific to each connection and is likely to be | The chunked coding is specific to each connection and is likely to be | |||
| removed or recoded by each recipient (including intermediaries) before any | removed or recoded by each recipient (including intermediaries) before any | |||
| higher-level application would have a chance to inspect the extensions. | higher-level application would have a chance to inspect the extensions. | |||
| Hence, use of chunk extensions is generally limited to specialized HTTP | Hence, the use of chunk extensions is generally limited to specialized HTTP | |||
| services such as "long polling" (where client and server can have shared | services such as "long polling" (where client and server can have shared | |||
| expectations regarding the use of chunk extensions) or for padding within | expectations regarding the use of chunk extensions) or for padding within | |||
| an end-to-end secured connection. | an end-to-end secured connection. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A recipient <bcp14>MUST</bcp14> ignore unrecognized chunk extensions. | A recipient <bcp14>MUST</bcp14> ignore unrecognized chunk extensions. | |||
| A server ought to limit the total length of chunk extensions received in a | A server ought to limit the total length of chunk extensions received in a | |||
| request to an amount reasonable for the services provided, in the same way | request to an amount reasonable for the services provided, in the same way | |||
| that it applies length limitations and timeouts for other parts of a | that it applies length limitations and timeouts for other parts of a | |||
| message, and generate an appropriate 4xx (Client Error) | message, and generate an appropriate 4xx (Client Error) | |||
| skipping to change at line 1319 ¶ | skipping to change at line 1290 ¶ | |||
| <section anchor="chunked.trailer.section" title="Chunked Trailer Sec tion"> | <section anchor="chunked.trailer.section" title="Chunked Trailer Sec tion"> | |||
| <t> | <t> | |||
| A trailer section allows the sender to include additional fields at the end | A trailer section allows the sender to include additional fields at the end | |||
| of a chunked message in order to supply metadata that might be dynamically | of a chunked message in order to supply metadata that might be dynamically | |||
| generated while the content is sent, such as a message integrity | generated while the content is sent, such as a message integrity | |||
| check, digital signature, or post-processing status. The proper use and | check, digital signature, or post-processing status. The proper use and | |||
| limitations of trailer fields are defined in <xref target="HTTP" section="6.5 "/>. | limitations of trailer fields are defined in <xref target="HTTP" section="6.5 "/>. | |||
| </t> | </t> | |||
| <iref primary="true" item="Grammar" subitem="trailer-section"/> | <iref primary="true" item="Grammar" subitem="trailer-section"/> | |||
| <iref primary="false" item="Grammar" subitem="field-line"/> | <iref primary="false" item="Grammar" subitem="field-line"/> | |||
| <sourcecode type="abnf7230"><![CDATA[ trailer-section = *( fie ld-line CRLF ) | <sourcecode type="abnf9110"><![CDATA[ trailer-section = *( fie ld-line CRLF ) | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| A recipient that removes the chunked encoding from a message <bcp14>MAY</bcp1 4> | A recipient that removes the chunked coding from a message <bcp14>MAY</bcp14> | |||
| selectively retain or discard the received trailer fields. A recipient | selectively retain or discard the received trailer fields. A recipient | |||
| that retains a received trailer field <bcp14>MUST</bcp14> either store/forwar d the | that retains a received trailer field <bcp14>MUST</bcp14> either store/forwar d the | |||
| trailer field separately from the received header fields or merge the | trailer field separately from the received header fields or merge the | |||
| received trailer field into the header section. | received trailer field into the header section. | |||
| A recipient <bcp14>MUST NOT</bcp14> merge a received trailer field into the | A recipient <bcp14>MUST NOT</bcp14> merge a received trailer field into the | |||
| header section unless its corresponding header field definition | header section unless its corresponding header field definition | |||
| explicitly permits and instructs how the trailer field value can be | explicitly permits and instructs how the trailer field value can be | |||
| safely merged. | safely merged. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| skipping to change at line 1410 ¶ | skipping to change at line 1381 ¶ | |||
| <li>Pointer to specification text</li> | <li>Pointer to specification text</li> | |||
| </ul> | </ul> | |||
| <t> | <t> | |||
| Names of transfer codings <bcp14>MUST NOT</bcp14> overlap with names of conte nt codings | Names of transfer codings <bcp14>MUST NOT</bcp14> overlap with names of conte nt codings | |||
| (<xref target="HTTP" section="8.4.1"/>) unless the encoding transformation is identical, as | (<xref target="HTTP" section="8.4.1"/>) unless the encoding transformation is identical, as | |||
| is the case for the compression codings defined in | is the case for the compression codings defined in | |||
| <xref target="compression.codings"/>. | <xref target="compression.codings"/>. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The TE header field (<xref target="HTTP" section="10.1.4"/>) uses a | The TE header field (<xref target="HTTP" section="10.1.4"/>) uses a | |||
| pseudo parameter named "q" as rank value when multiple transfer codings | pseudo-parameter named "q" as the rank value when multiple transfer codings | |||
| are acceptable. Future registrations of transfer codings <bcp14>SHOULD NOT</b cp14> | are acceptable. Future registrations of transfer codings <bcp14>SHOULD NOT</b cp14> | |||
| define parameters called "q" (case-insensitively) in order to avoid | define parameters called "q" (case-insensitively) in order to avoid | |||
| ambiguities. | ambiguities. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Values to be added to this namespace require IETF Review (see | Values to be added to this namespace require IETF Review (see | |||
| <xref target="RFC8126" section="4.8"/>), and <bcp14>MUST</bcp14> | <xref target="RFC8126" section="4.8"/>) and <bcp14>MUST</bcp14> | |||
| conform to the purpose of transfer coding defined in this specification. | conform to the purpose of transfer coding defined in this specification. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Use of program names for the identification of encoding formats | Use of program names for the identification of encoding formats | |||
| is not desirable and is discouraged for future encodings. | is not desirable and is discouraged for future encodings. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="transfer.coding.negotiation" | <section anchor="transfer.coding.negotiation" | |||
| title="Negotiating Transfer Codings"> | title="Negotiating Transfer Codings"> | |||
| <t> | <t> | |||
| The TE field (<xref target="HTTP" section="10.1.4"/>) is used in HTTP/1.1 to i ndicate | The TE field (<xref target="HTTP" section="10.1.4"/>) is used in HTTP/1.1 to i ndicate | |||
| what transfer-codings, besides chunked, the client is willing to accept | what transfer codings, besides chunked, the client is willing to accept | |||
| in the response, and whether the client is willing to preserve | in the response and whether the client is willing to preserve | |||
| trailer fields in a chunked transfer coding. | trailer fields in a chunked transfer coding. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A client <bcp14>MUST NOT</bcp14> send the chunked transfer coding name in TE; | A client <bcp14>MUST NOT</bcp14> send the chunked transfer coding name in TE; | |||
| chunked is always acceptable for HTTP/1.1 recipients. | chunked is always acceptable for HTTP/1.1 recipients. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Three examples of TE use are below. | Three examples of TE use are below. | |||
| </t> | </t> | |||
| <sourcecode type="http-message"><![CDATA[TE: deflate | <sourcecode type="http-message"><![CDATA[TE: deflate | |||
| TE: | TE: | |||
| TE: trailers, deflate;q=0.5 | TE: trailers, deflate;q=0.5 | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| When multiple transfer codings are acceptable, the client <bcp14>MAY</bcp14> rank the | When multiple transfer codings are acceptable, the client <bcp14>MAY</bcp14> rank the | |||
| codings by preference using a case-insensitive "q" parameter (similar to | codings by preference using a case-insensitive "q" parameter (similar to | |||
| the qvalues used in content negotiation fields, <xref target="HTTP" section=" 12.4.2"/>). The rank value | the qvalues used in content negotiation fields; see <xref target="HTTP" secti on="12.4.2"/>). The rank value | |||
| is a real number in the range 0 through 1, where 0.001 is the least | is a real number in the range 0 through 1, where 0.001 is the least | |||
| preferred and 1 is the most preferred; a value of 0 means "not acceptable". | preferred and 1 is the most preferred; a value of 0 means "not acceptable". | |||
| </t> | </t> | |||
| <t> | <t> | |||
| If the TE field value is empty or if no TE field is present, the only | If the TE field value is empty or if no TE field is present, the only | |||
| acceptable transfer coding is chunked. A message with no transfer coding | acceptable transfer coding is chunked. A message with no transfer coding | |||
| is always acceptable. | is always acceptable. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The keyword "trailers" indicates that the sender will not discard trailer | The keyword "trailers" indicates that the sender will not discard trailer | |||
| skipping to change at line 1475 ¶ | skipping to change at line 1446 ¶ | |||
| that do not support its semantics. | that do not support its semantics. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="incomplete.messages" title="Handling Incomplete Messages" > | <section anchor="incomplete.messages" title="Handling Incomplete Messages" > | |||
| <t> | <t> | |||
| A server that receives an incomplete request message, usually due to a | A server that receives an incomplete request message, usually due to a | |||
| canceled request or a triggered timeout exception, <bcp14>MAY</bcp14> send an error | canceled request or a triggered timeout exception, <bcp14>MAY</bcp14> send an error | |||
| response prior to closing the connection. | response prior to closing the connection. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A client that receives an incomplete response message, which can occur | A client that receives an incomplete response message, which can occur | |||
| when a connection is closed prematurely or when decoding a supposedly | when a connection is closed prematurely or when decoding a supposedly | |||
| chunked transfer coding fails, <bcp14>MUST</bcp14> record the message as inco mplete. | chunked transfer coding fails, <bcp14>MUST</bcp14> record the message as inco mplete. | |||
| Cache requirements for incomplete responses are defined in | Cache requirements for incomplete responses are defined in | |||
| <xref target="CACHING" section="3"/>. | <xref target="CACHING" section="3.3"/>. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| If a response terminates in the middle of the header section (before the | If a response terminates in the middle of the header section (before the | |||
| empty line is received) and the status code might rely on header fields to | empty line is received) and the status code might rely on header fields to | |||
| convey the full meaning of the response, then the client cannot assume | convey the full meaning of the response, then the client cannot assume | |||
| that meaning has been conveyed; the client might need to repeat the | that meaning has been conveyed; the client might need to repeat the | |||
| request in order to determine what action to take next. | request in order to determine what action to take next. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A message body that uses the chunked transfer coding is | A message body that uses the chunked transfer coding is | |||
| skipping to change at line 1547 ¶ | skipping to change at line 1518 ¶ | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="associating.response.to.request" | <section anchor="associating.response.to.request" | |||
| title="Associating a Response to a Request"> | title="Associating a Response to a Request"> | |||
| <t> | <t> | |||
| HTTP/1.1 does not include a request identifier for associating a given | HTTP/1.1 does not include a request identifier for associating a given | |||
| request message with its corresponding one or more response messages. | request message with its corresponding one or more response messages. | |||
| Hence, it relies on the order of response arrival to correspond exactly | Hence, it relies on the order of response arrival to correspond exactly | |||
| to the order in which requests are made on the same connection. | to the order in which requests are made on the same connection. | |||
| More than one response message per request only occurs when one or more | More than one response message per request only occurs when one or more | |||
| informational responses (1xx, see <xref target="HTTP" section="15.2"/>) prece de a | informational responses (1xx; see <xref target="HTTP" section="15.2"/>) prece de a | |||
| final response to the same request. | final response to the same request. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A client that has more than one outstanding request on a connection <bcp14>MU ST</bcp14> | A client that has more than one outstanding request on a connection <bcp14>MU ST</bcp14> | |||
| maintain a list of outstanding requests in the order sent and <bcp14>MUST</bc p14> | maintain a list of outstanding requests in the order sent and <bcp14>MUST</bc p14> | |||
| associate each received response message on that connection to the | associate each received response message on that connection to the | |||
| first outstanding request that has not yet received a final | first outstanding request that has not yet received a final | |||
| (non-1xx) response. | (non-1xx) response. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| If a client receives data on a connection that doesn't have | If a client receives data on a connection that doesn't have | |||
| outstanding requests, the client <bcp14>MUST NOT</bcp14> consider that data t o be a | outstanding requests, the client <bcp14>MUST NOT</bcp14> consider that data t o be a | |||
| valid response; the client <bcp14>SHOULD</bcp14> close the connection, since message | valid response; the client <bcp14>SHOULD</bcp14> close the connection, since message | |||
| delimitation is now ambiguous, unless the data consists only of one or | delimitation is now ambiguous, unless the data consists only of one or | |||
| more CRLF (which can be discarded, as per | more CRLF (which can be discarded per | |||
| <xref target="message.parsing"/>). | <xref target="message.parsing"/>). | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="persistent.connections" title="Persistence"> | <section anchor="persistent.connections" title="Persistence"> | |||
| <iref primary="false" item="close"/> | <iref primary="false" item="close"/> | |||
| <t> | <t> | |||
| HTTP/1.1 defaults to the use of <em>persistent connections</em>, | HTTP/1.1 defaults to the use of "persistent connections", | |||
| allowing multiple requests and responses to be carried over a single | allowing multiple requests and responses to be carried over a single | |||
| connection. HTTP implementations <bcp14>SHOULD</bcp14> support persistent con nections. | connection. HTTP implementations <bcp14>SHOULD</bcp14> support persistent con nections. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A recipient determines whether a connection is persistent or not based on | A recipient determines whether a connection is persistent or not based on | |||
| the protocol version and Connection header field | the protocol version and Connection header field | |||
| (<xref target="HTTP" section="7.6.1"/>) in the | (<xref target="HTTP" section="7.6.1"/>) in the | |||
| most recently received message, if any: | most recently received message, if any: | |||
| </t> | </t> | |||
| <ul> | <ul> | |||
| <li>If the <xref target="persistent.tear-down" format="none">clos e</xref> connection option is present | <li>If the "<xref target="persistent.tear-down" format="none">clo se</xref>" connection option is present | |||
| (<xref target="persistent.tear-down"/>), the | (<xref target="persistent.tear-down"/>), the | |||
| connection will not persist after the current response; else,</li> | connection will not persist after the current response; else,</li> | |||
| <li>If the received protocol is HTTP/1.1 (or later), the connecti on will | <li>If the received protocol is HTTP/1.1 (or later), the connecti on will | |||
| persist after the current response; else,</li> | persist after the current response; else,</li> | |||
| <li>If the received protocol is HTTP/1.0, the "keep-alive" connec tion | <li>If the received protocol is HTTP/1.0, the "keep-alive" connec tion | |||
| option is present, either the recipient is not a proxy or the | option is present, either the recipient is not a proxy or the | |||
| message is a response, and the recipient wishes to honor the | message is a response, and the recipient wishes to honor the | |||
| HTTP/1.0 "keep-alive" mechanism, the connection will persist after | HTTP/1.0 "keep-alive" mechanism, the connection will persist after | |||
| the current response; otherwise,</li> | the current response; otherwise,</li> | |||
| <li>The connection will close after the current response.</li> | <li>The connection will close after the current response.</li> | |||
| </ul> | </ul> | |||
| <t> | <t> | |||
| A client that does not support <xref target="persistent.connections" format=" none">persistent connections</xref> | A client that does not support <xref target="persistent.connections" format=" none">persistent connections</xref> | |||
| <bcp14>MUST</bcp14> | <bcp14>MUST</bcp14> | |||
| send the <xref target="persistent.tear-down" format="none">close</xref> conne ction option in every request message. | send the "<xref target="persistent.tear-down" format="none">close</xref>" con nection option in every request message. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A server that does not support <xref target="persistent.connections" format=" none">persistent connections</xref> | A server that does not support <xref target="persistent.connections" format=" none">persistent connections</xref> | |||
| <bcp14>MUST</bcp14> | <bcp14>MUST</bcp14> | |||
| send the <xref target="persistent.tear-down" format="none">close</xref> conne ction option in every response message | send the "<xref target="persistent.tear-down" format="none">close</xref>" con nection option in every response message | |||
| that does not have a 1xx (Informational) status code. | that does not have a 1xx (Informational) status code. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A client <bcp14>MAY</bcp14> send additional requests on a persistent connecti on until it | A client <bcp14>MAY</bcp14> send additional requests on a persistent connecti on until it | |||
| sends or receives a <xref target="persistent.tear-down" format="none">close</ xref> connection option or receives an | sends or receives a "<xref target="persistent.tear-down" format="none">close< /xref>" connection option or receives an | |||
| HTTP/1.0 response without a "keep-alive" connection option. | HTTP/1.0 response without a "keep-alive" connection option. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| In order to remain persistent, all messages on a connection need to | In order to remain persistent, all messages on a connection need to | |||
| have a self-defined message length (i.e., one not defined by closure | have a self-defined message length (i.e., one not defined by closure | |||
| of the connection), as described in <xref target="message.body"/>. | of the connection), as described in <xref target="message.body"/>. | |||
| A server <bcp14>MUST</bcp14> read the entire request message body or close | A server <bcp14>MUST</bcp14> read the entire request message body or close | |||
| the connection after sending its response, since otherwise the | the connection after sending its response; otherwise, the | |||
| remaining data on a persistent connection would be misinterpreted | remaining data on a persistent connection would be misinterpreted | |||
| as the next request. Likewise, | as the next request. Likewise, | |||
| a client <bcp14>MUST</bcp14> read the entire response message body if it inte nds | a client <bcp14>MUST</bcp14> read the entire response message body if it inte nds | |||
| to reuse the same connection for a subsequent request. | to reuse the same connection for a subsequent request. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A proxy server <bcp14>MUST NOT</bcp14> maintain a persistent connection with an | A proxy server <bcp14>MUST NOT</bcp14> maintain a persistent connection with an | |||
| HTTP/1.0 client (see <xref target="RFC2068" section="19.7.1"/> for | HTTP/1.0 client (see <xref target="compatibility.with.http.1.0.persistent.con nections"/> for | |||
| information and discussion of the problems with the Keep-Alive header field | information and discussion of the problems with the Keep-Alive header field | |||
| implemented by many HTTP/1.0 clients). | implemented by many HTTP/1.0 clients). | |||
| </t> | </t> | |||
| <t> | <t> | |||
| See <xref target="compatibility.with.http.1.0.persistent.connections"/> | See <xref target="compatibility.with.http.1.0.persistent.connections"/> | |||
| for more information on backwards compatibility with HTTP/1.0 clients. | for more information on backwards compatibility with HTTP/1.0 clients. | |||
| </t> | </t> | |||
| <section anchor="persistent.retrying.requests" title="Retrying Reque sts"> | <section anchor="persistent.retrying.requests" title="Retrying Reque sts"> | |||
| <t> | <t> | |||
| 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 | Implementations ought to anticipate the need to recover | |||
| from asynchronous close events. The conditions under which a client can | from asynchronous close events. The conditions under which a client can | |||
| automatically retry a sequence of outstanding requests are defined in | automatically retry a sequence of outstanding requests are defined in | |||
| <xref target="HTTP" section="9.2.2"/>. | <xref target="HTTP" section="9.2.2"/>. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="pipelining" title="Pipelining"> | <section anchor="pipelining" title="Pipelining"> | |||
| <t> | <t> | |||
| A client that supports persistent connections <bcp14>MAY</bcp14> | A client that supports persistent connections <bcp14>MAY</bcp14> "pipeline" | |||
| <em>pipeline</em> | ||||
| its requests (i.e., send multiple requests without waiting for each | its requests (i.e., send multiple requests without waiting for each | |||
| response). A server <bcp14>MAY</bcp14> process a sequence of pipelined reques ts in | response). A server <bcp14>MAY</bcp14> process a sequence of pipelined reques ts in | |||
| parallel if they all have safe methods (<xref target="HTTP" section="9.2.1"/> ), but it <bcp14>MUST</bcp14> send | parallel if they all have safe methods (<xref target="HTTP" section="9.2.1"/> ), but it <bcp14>MUST</bcp14> send | |||
| the corresponding responses in the same order that the requests were | the corresponding responses in the same order that the requests were | |||
| received. | received. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A client that pipelines requests <bcp14>SHOULD</bcp14> retry unanswered reque sts if the | A client that pipelines requests <bcp14>SHOULD</bcp14> retry unanswered reque sts if the | |||
| connection closes before it receives all of the corresponding responses. | connection closes before it receives all of the corresponding responses. | |||
| When retrying pipelined requests after a failed connection (a connection | When retrying pipelined requests after a failed connection (a connection | |||
| skipping to change at line 1739 ¶ | skipping to change at line 1709 ¶ | |||
| <t> | <t> | |||
| A client, server, or proxy <bcp14>MAY</bcp14> close the transport connection at any | A client, server, or proxy <bcp14>MAY</bcp14> close the transport connection at any | |||
| time. For example, a client might have started to send a new request | time. For example, a client might have started to send a new request | |||
| at the same time that the server has decided to close the "idle" | at the same time that the server has decided to close the "idle" | |||
| connection. From the server's point of view, the connection is being | connection. From the server's point of view, the connection is being | |||
| closed while it was idle, but from the client's point of view, a | closed while it was idle, but from the client's point of view, a | |||
| request is in progress. | request is in progress. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A server <bcp14>SHOULD</bcp14> sustain persistent connections, when possible, and allow | A server <bcp14>SHOULD</bcp14> sustain persistent connections, when possible, and allow | |||
| the underlying transport's flow-control mechanisms to resolve temporary overl oads, rather | the underlying transport's flow-control mechanisms to resolve temporary overl oads rather | |||
| than terminate connections with the expectation that clients will retry. | than terminate connections with the expectation that clients will retry. | |||
| The latter technique can exacerbate network congestion or server load. | The latter technique can exacerbate network congestion or server load. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A client sending a message body <bcp14>SHOULD</bcp14> monitor | A client sending a message body <bcp14>SHOULD</bcp14> monitor | |||
| the network connection for an error response while it is transmitting | the network connection for an error response while it is transmitting | |||
| the request. If the client sees a response that indicates the server does | the request. If the client sees a response that indicates the server does | |||
| not wish to receive the message body and is closing the connection, the | not wish to receive the message body and is closing the connection, the | |||
| client <bcp14>SHOULD</bcp14> immediately cease transmitting the body and clos e its side | client <bcp14>SHOULD</bcp14> immediately cease transmitting the body and clos e its side | |||
| of the connection. | of the connection. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="persistent.tear-down" title="Tear-down"> | <section anchor="persistent.tear-down" title="Tear-down"> | |||
| <iref primary="false" item="Connection header field"/> | <iref primary="false" item="Connection header field"/> | |||
| <iref primary="true" item="close"/> | <iref primary="true" item="close"/> | |||
| <t> | <t> | |||
| The "close" connection option is defined as a signal that the sender | The "close" connection option is defined as a signal that the sender | |||
| will close this connection after completion of the response. | will close this connection after completion of the response. | |||
| A sender <bcp14>SHOULD</bcp14> send a Connection header field | A sender <bcp14>SHOULD</bcp14> send a Connection header field | |||
| (<xref target="HTTP" section="7.6.1"/>) containing the close connection optio n | (<xref target="HTTP" section="7.6.1"/>) containing the "close" connection opt ion | |||
| when it intends to close a connection. For example, | when it intends to close a connection. For example, | |||
| </t> | </t> | |||
| <sourcecode type="http-message"><![CDATA[Connection: close | <sourcecode type="http-message"><![CDATA[Connection: close | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t> | <t> | |||
| as a request header field indicates that this is the last request that | as a request header field indicates that this is the last request that | |||
| the client will send on this connection, while in a response the same | the client will send on this connection, while in a response, the same | |||
| field indicates that the server is going to close this connection after | field indicates that the server is going to close this connection after | |||
| the response message is complete. | the response message is complete. | |||
| </t> | </t> | |||
| <t anchor="field.close"> | <t anchor="field.close"> | |||
| <iref primary="true" item="Fields" subitem="Close"/> | <iref primary="true" item="Fields" subitem="Close"/> | |||
| Note that the field name "Close" is reserved, since using that name as a | Note that the field name "Close" is reserved, since using that name as a | |||
| header field might conflict with the close connection option. | header field might conflict with the "close" connection option. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A client that sends a close connection option <bcp14>MUST NOT</bcp14> | A client that sends a "close" connection option <bcp14>MUST NOT</bcp14> | |||
| send further requests on that connection (after the one containing the | send further requests on that connection (after the one containing the | |||
| close) and <bcp14>MUST</bcp14> close the connection after reading the | "close") and <bcp14>MUST</bcp14> close the connection after reading the | |||
| final response message corresponding to this request. | final response message corresponding to this request. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A server that receives a close connection option <bcp14>MUST</bcp14> | A server that receives a "close" connection option <bcp14>MUST</bcp14> | |||
| initiate closure of the connection (see below) after it sends the | initiate closure of the connection (see below) after it sends the | |||
| final response to the request that contained the close connection option. | final response to the request that contained the "close" connection option. | |||
| The server <bcp14>SHOULD</bcp14> send a close connection option in its final | The server <bcp14>SHOULD</bcp14> send a "close" connection option in its fina | |||
| response | l response | |||
| on that connection. The server <bcp14>MUST NOT</bcp14> process any further re quests | on that connection. The server <bcp14>MUST NOT</bcp14> process any further re quests | |||
| received on that connection. | received on that connection. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A server that sends a close connection option <bcp14>MUST</bcp14> | A server that sends a "close" connection option <bcp14>MUST</bcp14> | |||
| initiate closure of the connection (see below) after it sends the | initiate closure of the connection (see below) after it sends the | |||
| response containing the close connection option. The server <bcp14>MUST NOT</ bcp14> process | response containing the "close" connection option. The server <bcp14>MUST NOT </bcp14> process | |||
| any further requests received on that connection. | any further requests received on that connection. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A client that receives a close connection option <bcp14>MUST</bcp14> | A client that receives a "close" connection option <bcp14>MUST</bcp14> | |||
| cease sending requests on that connection and close the connection | cease sending requests on that connection and close the connection | |||
| after reading the response message containing the close connection option; | after reading the response message containing the "close" connection option; | |||
| if additional pipelined requests had been sent on the connection, | if additional pipelined requests had been sent on the connection, | |||
| the client <bcp14>SHOULD NOT</bcp14> assume that they will be processed by th e server. | the client <bcp14>SHOULD NOT</bcp14> assume that they will be processed by th e server. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| If a server performs an immediate close of a TCP connection, there is a | If a server performs an immediate close of a TCP connection, there is a | |||
| significant risk that the client will not be able to read the last HTTP | significant risk that the client will not be able to read the last HTTP | |||
| response. If the server receives additional data from the client on a | response. If the server receives additional data from the client on a | |||
| fully closed connection, such as another request sent by the | fully closed connection, such as another request sent by the | |||
| client before receiving the server's response, the server's TCP stack will | client before receiving the server's response, the server's TCP stack will | |||
| send a reset packet to the client; unfortunately, the reset packet might | send a reset packet to the client; unfortunately, the reset packet might | |||
| skipping to change at line 1843 ¶ | skipping to change at line 1813 ¶ | |||
| <section anchor="tls.connection.initiation" title="TLS Connection Initi ation"> | <section anchor="tls.connection.initiation" title="TLS Connection Initi ation"> | |||
| <t> | <t> | |||
| Conceptually, HTTP/TLS is simply sending HTTP messages over a connection | Conceptually, HTTP/TLS is simply sending HTTP messages over a connection | |||
| secured via TLS <xref target="TLS13"/>. | secured via TLS <xref target="TLS13"/>. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The HTTP client also acts as the TLS client. It initiates a connection to | The HTTP client also acts as the TLS client. It initiates a connection to | |||
| the server on the appropriate port and sends the TLS ClientHello to begin | the server on the appropriate port and sends the TLS ClientHello to begin | |||
| the TLS handshake. When the TLS handshake has finished, the client may then | the TLS handshake. When the TLS handshake has finished, the client may then | |||
| initiate the first HTTP request. All HTTP data <bcp14>MUST</bcp14> be sent as TLS | initiate the first HTTP request. All HTTP data <bcp14>MUST</bcp14> be sent as TLS | |||
| "application data", but is otherwise treated like a normal connection for | "application data" but is otherwise treated like a normal connection for | |||
| HTTP (including potential reuse as a persistent connection). | HTTP (including potential reuse as a persistent connection). | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="tls.connection.closure" title="TLS Connection Closure" > | <section anchor="tls.connection.closure" title="TLS Connection Closure" > | |||
| <t> | <t> | |||
| TLS uses an exchange of closure alerts prior to (non-error) connection | TLS uses an exchange of closure alerts prior to (non-error) connection | |||
| closure to provide secure connection closure; see <xref target="TLS13" sectio n="6.1"/>. When a | closure to provide secure connection closure; see <xref target="TLS13" sectio n="6.1"/>. When a | |||
| valid closure alert is received, an implementation can be assured that no | valid closure alert is received, an implementation can be assured that no | |||
| further data will be received on that connection. | further data will be received on that connection. | |||
| </t> | </t> | |||
| skipping to change at line 1865 ¶ | skipping to change at line 1835 ¶ | |||
| When an implementation knows that it has sent or received all the | When an implementation knows that it has sent or received all the | |||
| message data that it cares about, typically by detecting HTTP message | message data that it cares about, typically by detecting HTTP message | |||
| boundaries, it might generate an "incomplete close" by sending a | boundaries, it might generate an "incomplete close" by sending a | |||
| closure alert and then closing the connection without waiting to | closure alert and then closing the connection without waiting to | |||
| receive the corresponding closure alert from its peer. | receive the corresponding closure alert from its peer. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| An incomplete close does not call into question the security of the data | An incomplete close does not call into question the security of the data | |||
| already received, but it could indicate that subsequent data might have been | already received, but it could indicate that subsequent data might have been | |||
| truncated. As TLS is not directly aware of HTTP message framing, it is | truncated. As TLS is not directly aware of HTTP message framing, it is | |||
| necessary to examine the HTTP data itself to determine whether messages were | necessary to examine the HTTP data itself to determine whether messages are | |||
| complete. Handling of incomplete messages is defined in | complete. Handling of incomplete messages is defined in | |||
| <xref target="incomplete.messages"/>. | <xref target="incomplete.messages"/>. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| When encountering an incomplete close, a client <bcp14>SHOULD</bcp14> treat a s completed | When encountering an incomplete close, a client <bcp14>SHOULD</bcp14> treat a s completed | |||
| all requests for which it has received as much data as specified in the | all requests for which it has received either | |||
| <xref target="body.content-length" format="none">Content-Length</xref> header | </t> | |||
| or, when a | <ol> | |||
| <xref target="field.transfer-encoding" format="none">Transfer-Encoding</xref> | <li> | |||
| of chunked is used, for which the terminal | as much data as specified in the <xref target="body.content-length" format=" | |||
| zero-length chunk has been received. A response that has neither chunked | none">Content-Length</xref> header | |||
| field or | ||||
| </li> | ||||
| <li> | ||||
| the terminal zero-length chunk (when <xref target="field.transfer-encoding" | ||||
| format="none">Transfer-Encoding</xref> of chunked is used). | ||||
| </li> | ||||
| </ol> | ||||
| <t> | ||||
| A response that has neither chunked | ||||
| transfer coding nor Content-Length is complete only if a valid closure alert | transfer coding nor Content-Length is complete only if a valid closure alert | |||
| has been received. Treating an incomplete message as complete could expose | has been received. Treating an incomplete message as complete could expose | |||
| implementations to attack. | implementations to attack. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A client detecting an incomplete close <bcp14>SHOULD</bcp14> recover graceful ly. | A client detecting an incomplete close <bcp14>SHOULD</bcp14> recover graceful ly. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Clients <bcp14>MUST</bcp14> send a closure alert before closing the connectio n. | Clients <bcp14>MUST</bcp14> send a closure alert before closing the connectio n. | |||
| Clients that do not expect to receive any more data <bcp14>MAY</bcp14> choose not | Clients that do not expect to receive any more data <bcp14>MAY</bcp14> choose not | |||
| to wait for the server's closure alert and simply close the | to wait for the server's closure alert and simply close the | |||
| connection, thus generating an incomplete close on the server side. | connection, thus generating an incomplete close on the server side. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Servers <bcp14>SHOULD</bcp14> be prepared to receive an incomplete close from the client, | Servers <bcp14>SHOULD</bcp14> be prepared to receive an incomplete close from the client, | |||
| since the client can often determine when the end of server data is. | since the client can often locate the end of server data. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Servers <bcp14>MUST</bcp14> attempt to initiate an exchange of closure alerts with | Servers <bcp14>MUST</bcp14> attempt to initiate an exchange of closure alerts with | |||
| the client before closing the connection. Servers <bcp14>MAY</bcp14> close th e | the client before closing the connection. Servers <bcp14>MAY</bcp14> close th e | |||
| connection after sending the closure alert, thus generating an | connection after sending the closure alert, thus generating an | |||
| incomplete close on the client side. | incomplete close on the client side. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="enclosing.messages" title="Enclosing Messages as Data"> | <section anchor="enclosing.messages" title="Enclosing Messages as Data"> | |||
| <section anchor="media.type.message.http" title="Media Type message/htt p"> | <section anchor="media.type.message.http" title="Media Type message/htt p"> | |||
| <iref item="Media Type" subitem="message/http" primary="true"/> | <iref item="Media Type" subitem="message/http" primary="true"/> | |||
| <iref item="message/http Media Type" primary="true"/> | <iref item="message/http Media Type" primary="true"/> | |||
| <t> | <t> | |||
| The message/http media type can be used to enclose a single HTTP request or | The "message/http" media type can be used to enclose a single HTTP request or | |||
| response message, provided that it obeys the MIME restrictions for all | response message, provided that it obeys the MIME restrictions for all | |||
| "message" types regarding line length and encodings. Because of the line | "message" types regarding line length and encodings. Because of the line leng | |||
| length limitations, field values within message/http are allowed to use | th | |||
| limitations, field values within "message/http" are allowed to use | ||||
| line folding (<xref target="line.folding" format="none">obs-fold</xref>), as described in | line folding (<xref target="line.folding" format="none">obs-fold</xref>), as described in | |||
| <xref target="line.folding"/>, to convey the field value over multiple | <xref target="line.folding"/>, to convey the field value over multiple | |||
| lines. A recipient of message/http data <bcp14>MUST</bcp14> replace any obsol ete line | lines. A recipient of "message/http" data <bcp14>MUST</bcp14> replace any obs olete line | |||
| folding with one or more SP characters when the message is consumed. | folding with one or more SP characters when the message is consumed. | |||
| </t> | </t> | |||
| <dl> | <dl> | |||
| <dt>Type name:</dt> | <dt>Type name:</dt> | |||
| <dd>message</dd> | <dd>message</dd> | |||
| <dt>Subtype name:</dt> | <dt>Subtype name:</dt> | |||
| <dd>http</dd> | <dd>http</dd> | |||
| <dt>Required parameters:</dt> | <dt>Required parameters:</dt> | |||
| <dd>N/A</dd> | <dd>N/A</dd> | |||
| <dt>Optional parameters:</dt> | <dt>Optional parameters:</dt> | |||
| skipping to change at line 1933 ¶ | skipping to change at line 1912 ¶ | |||
| <t>version, msgtype</t> | <t>version, msgtype</t> | |||
| <dl> | <dl> | |||
| <dt>version:</dt> | <dt>version:</dt> | |||
| <dd> | <dd> | |||
| The HTTP-version number of the enclosed message | The HTTP-version number of the enclosed message | |||
| (e.g., "1.1"). If not present, the version can be | (e.g., "1.1"). If not present, the version can be | |||
| determined from the first line of the body. | determined from the first line of the body. | |||
| </dd> | </dd> | |||
| <dt>msgtype:</dt> | <dt>msgtype:</dt> | |||
| <dd> | <dd> | |||
| The message type — "request" or "response". If not | The message type -- "request" or "response". If not | |||
| present, the type can be determined from the first | present, the type can be determined from the first | |||
| line of the body. | line of the body. | |||
| </dd> | </dd> | |||
| </dl> | </dl> | |||
| </dd> | </dd> | |||
| <dt>Encoding considerations:</dt> | <dt>Encoding considerations:</dt> | |||
| <dd>only "7bit", "8bit", or "binary" are permitted</dd> | <dd>only "7bit", "8bit", or "binary" are permitted</dd> | |||
| <dt>Security considerations:</dt> | <dt>Security considerations:</dt> | |||
| <dd>see <xref target="security.considerations"/> | <dd>see <xref target="security.considerations"/> | |||
| </dd> | </dd> | |||
| <dt>Interoperability considerations:</dt> | <dt>Interoperability considerations:</dt> | |||
| <dd>N/A</dd> | <dd>N/A</dd> | |||
| <dt>Published specification:</dt> | <dt>Published specification:</dt> | |||
| <dd>This specification (see <xref target="media.type.message.http "/>).</dd> | <dd>RFC 9112 (see <xref target="media.type.message.http"/>).</dd> | |||
| <dt>Applications that use this media type:</dt> | <dt>Applications that use this media type:</dt> | |||
| <dd>N/A</dd> | <dd>N/A</dd> | |||
| <dt>Fragment identifier considerations:</dt> | <dt>Fragment identifier considerations:</dt> | |||
| <dd>N/A</dd> | <dd>N/A</dd> | |||
| <dt>Additional information:</dt> | <dt>Additional information:</dt> | |||
| <dd> | <dd> | |||
| <dl> | <dl> | |||
| <dt>Magic number(s):</dt> | <dt>Magic number(s):</dt> | |||
| <dd>N/A</dd> | <dd>N/A</dd> | |||
| <dt>Deprecated alias names for this type:</dt> | <dt>Deprecated alias names for this type:</dt> | |||
| <dd>N/A</dd> | <dd>N/A</dd> | |||
| <dt>File extension(s):</dt> | <dt>File extension(s):</dt> | |||
| <dd>N/A</dd> | <dd>N/A</dd> | |||
| <dt>Macintosh file type code(s):</dt> | <dt>Macintosh file type code(s):</dt> | |||
| <dd>N/A</dd> | <dd>N/A</dd> | |||
| </dl> | </dl> | |||
| </dd> | </dd> | |||
| <dt>Person and email address to contact for further information:< /dt> | <dt>Person and email address to contact for further information:< /dt> | |||
| <dd>See Authors' Addresses section.</dd> | <dd>See Authors' Addresses section.</dd> | |||
| <dt>Intended usage:</dt> | <dt>Intended usage:</dt> | |||
| <dd>COMMON</dd> | <dd>COMMON</dd> | |||
| <dt>Restrictions on usage:</dt> | <dt>Restrictions on usage:</dt> | |||
| <dd>N/A</dd> | <dd>N/A</dd> | |||
| <dt>Author:</dt> | <dt>Author:</dt> | |||
| <dd>See Authors' Addresses section.</dd> | <dd>See Authors' Addresses section.</dd> | |||
| <dt>Change controller:</dt> | <dt>Change controller:</dt> | |||
| <dd>IESG</dd> | <dd>IESG</dd> | |||
| </dl> | </dl> | |||
| </section> | </section> | |||
| <section anchor="media.type.application.http" | <section anchor="media.type.application.http" | |||
| title="Media Type application/http"> | title="Media Type application/http"> | |||
| <iref item="Media Type" subitem="application/http" primary="true"/> | <iref item="Media Type" subitem="application/http" primary="true"/> | |||
| <iref item="application/http Media Type" primary="true"/> | <iref item="application/http Media Type" primary="true"/> | |||
| <t> | <t> | |||
| The application/http media type can be used to enclose a pipeline of one or m ore | The "application/http" media type can be used to enclose a pipeline of one or more | |||
| HTTP request or response messages (not intermixed). | HTTP request or response messages (not intermixed). | |||
| </t> | </t> | |||
| <dl> | <dl> | |||
| <dt>Type name:</dt> | <dt>Type name:</dt> | |||
| <dd>application</dd> | <dd>application</dd> | |||
| <dt>Subtype name:</dt> | <dt>Subtype name:</dt> | |||
| <dd>http</dd> | <dd>http</dd> | |||
| <dt>Required parameters:</dt> | <dt>Required parameters:</dt> | |||
| <dd>N/A</dd> | <dd>N/A</dd> | |||
| <dt>Optional parameters:</dt> | <dt>Optional parameters:</dt> | |||
| skipping to change at line 2006 ¶ | skipping to change at line 1985 ¶ | |||
| </t> | </t> | |||
| <dl> | <dl> | |||
| <dt>version:</dt> | <dt>version:</dt> | |||
| <dd> | <dd> | |||
| The HTTP-version number of the enclosed messages | The HTTP-version number of the enclosed messages | |||
| (e.g., "1.1"). If not present, the version can be | (e.g., "1.1"). If not present, the version can be | |||
| determined from the first line of the body. | determined from the first line of the body. | |||
| </dd> | </dd> | |||
| <dt>msgtype:</dt> | <dt>msgtype:</dt> | |||
| <dd> | <dd> | |||
| The message type — "request" or "response". If not | The message type -- "request" or "response". If not | |||
| present, the type can be determined from the first | present, the type can be determined from the first | |||
| line of the body. | line of the body. | |||
| </dd> | </dd> | |||
| </dl> | </dl> | |||
| </dd> | </dd> | |||
| <dt>Encoding considerations:</dt> | <dt>Encoding considerations:</dt> | |||
| <dd> | <dd> | |||
| HTTP messages enclosed by this type | HTTP messages enclosed by this type | |||
| are in "binary" format; use of an appropriate | are in "binary" format; use of an appropriate | |||
| Content-Transfer-Encoding is required when | Content-Transfer-Encoding is required when | |||
| transmitted via email. | transmitted via email. | |||
| </dd> | </dd> | |||
| <dt>Security considerations:</dt> | <dt>Security considerations:</dt> | |||
| <dd> | <dd> | |||
| see <xref target="security.considerations"/> | see <xref target="security.considerations"/> | |||
| </dd> | </dd> | |||
| <dt>Interoperability considerations:</dt> | <dt>Interoperability considerations:</dt> | |||
| <dd>N/A</dd> | <dd>N/A</dd> | |||
| <dt>Published specification:</dt> | <dt>Published specification:</dt> | |||
| <dd> | <dd> | |||
| This specification (see <xref target="media.type.application.http"/>). | RFC 9112 (see <xref target="media.type.application.http"/>). | |||
| </dd> | </dd> | |||
| <dt>Applications that use this media type:</dt> | <dt>Applications that use this media type:</dt> | |||
| <dd>N/A</dd> | <dd>N/A</dd> | |||
| <dt>Fragment identifier considerations:</dt> | <dt>Fragment identifier considerations:</dt> | |||
| <dd>N/A</dd> | <dd>N/A</dd> | |||
| <dt>Additional information:</dt> | <dt>Additional information:</dt> | |||
| <dd> | <dd> | |||
| <dl> | <dl> | |||
| <dt>Deprecated alias names for this type:</dt> | <dt>Deprecated alias names for this type:</dt> | |||
| <dd>N/A</dd> | <dd>N/A</dd> | |||
| <dt>Magic number(s):</dt> | <dt>Magic number(s):</dt> | |||
| <dd>N/A</dd> | <dd>N/A</dd> | |||
| <dt>File extension(s):</dt> | <dt>File extension(s):</dt> | |||
| <dd>N/A</dd> | <dd>N/A</dd> | |||
| <dt>Macintosh file type code(s):</dt> | <dt>Macintosh file type code(s):</dt> | |||
| <dd>N/A</dd> | <dd>N/A</dd> | |||
| </dl> | </dl> | |||
| </dd> | </dd> | |||
| <dt>Person and email address to contact for further information:< /dt> | <dt>Person and email address to contact for further information:< /dt> | |||
| <dd>See Authors' Addresses section.</dd> | <dd>See Authors' Addresses section.</dd> | |||
| <dt>Intended usage:</dt> | <dt>Intended usage:</dt> | |||
| <dd>COMMON</dd> | <dd>COMMON</dd> | |||
| <dt>Restrictions on usage:</dt> | <dt>Restrictions on usage:</dt> | |||
| <dd>N/A</dd> | <dd>N/A</dd> | |||
| <dt>Author:</dt> | <dt>Author:</dt> | |||
| <dd>See Authors' Addresses section.</dd> | <dd>See Authors' Addresses section.</dd> | |||
| <dt>Change controller:</dt> | <dt>Change controller:</dt> | |||
| <dd>IESG</dd> | <dd>IESG</dd> | |||
| </dl> | </dl> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="security.considerations" title="Security Considerations"> | <section anchor="security.considerations" title="Security Considerations"> | |||
| <t> | <t> | |||
| This section is meant to inform developers, information providers, and | This section is meant to inform developers, information providers, and | |||
| users about known security considerations relevant to HTTP message syntax | users about known security considerations relevant to HTTP message syntax | |||
| and parsing. Security considerations about HTTP semantics, | and parsing. Security considerations about HTTP semantics, | |||
| content, and routing are addressed in <xref target="HTTP"/>. | content, and routing are addressed in <xref target="HTTP"/>. | |||
| </t> | </t> | |||
| <section anchor="response.splitting" title="Response Splitting"> | <section anchor="response.splitting" title="Response Splitting"> | |||
| <t> | <t> | |||
| Response splitting (a.k.a., CRLF injection) is a common technique, used in | Response splitting (a.k.a. CRLF injection) is a common technique, used i n | |||
| various attacks on Web usage, that exploits the line-based nature of HTTP | various attacks on Web usage, that exploits the line-based nature of HTTP | |||
| message framing and the ordered association of requests to responses on | message framing and the ordered association of requests to responses on | |||
| persistent connections <xref target="Klein"/>. This technique can be | persistent connections <xref target="Klein"/>. This technique can be | |||
| particularly damaging when the requests pass through a shared cache. | particularly damaging when the requests pass through a shared cache. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Response splitting exploits a vulnerability in servers (usually within an | Response splitting exploits a vulnerability in servers (usually within an | |||
| application server) where an attacker can send encoded data within some | application server) where an attacker can send encoded data within some | |||
| parameter of the request that is later decoded and echoed within any of the | parameter of the request that is later decoded and echoed within any of the | |||
| response header fields of the response. If the decoded data is crafted to | response header fields of the response. If the decoded data is crafted to | |||
| look like the response has ended and a subsequent response has begun, the | look like the response has ended and a subsequent response has begun, the | |||
| response has been split and the content within the apparent second response | response has been split, and the content within the apparent second response | |||
| is controlled by the attacker. The attacker can then make any other request | is controlled by the attacker. The attacker can then make any other request | |||
| on the same persistent connection and trick the recipients (including | on the same persistent connection and trick the recipients (including | |||
| intermediaries) into believing that the second half of the split is an | intermediaries) into believing that the second half of the split is an | |||
| authoritative answer to the second request. | authoritative answer to the second request. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| For example, a parameter within the request-target might be read by an | For example, a parameter within the request-target might be read by an | |||
| application server and reused within a redirect, resulting in the same | application server and reused within a redirect, resulting in the same | |||
| parameter being echoed in the Location header field of the | parameter being echoed in the Location header field of the | |||
| response. If the parameter is decoded by the application and not properly | response. If the parameter is decoded by the application and not properly | |||
| encoded when placed in the response field, the attacker can send encoded | encoded when placed in the response field, the attacker can send encoded | |||
| CRLF octets and other content that will make the application's single | CRLF octets and other content that will make the application's single | |||
| response look like two or more responses. | response look like two or more responses. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A common defense against response splitting is to filter requests for data | A common defense against response splitting is to filter requests for data | |||
| that looks like encoded CR and LF (e.g., "%0D" and "%0A"). However, that | that looks like encoded CR and LF (e.g., "%0D" and "%0A"). However, that | |||
| assumes the application server is only performing URI decoding, rather | assumes the application server is only performing URI decoding rather | |||
| than more obscure data transformations like charset transcoding, XML entity | than more obscure data transformations like charset transcoding, XML entity | |||
| translation, base64 decoding, sprintf reformatting, etc. A more effective | translation, base64 decoding, sprintf reformatting, etc. A more effective | |||
| mitigation is to prevent anything other than the server's core protocol | mitigation is to prevent anything other than the server's core protocol | |||
| libraries from sending a CR or LF within the header section, which means | libraries from sending a CR or LF within the header section, which means | |||
| restricting the output of header fields to APIs that filter for bad octets | restricting the output of header fields to APIs that filter for bad octets | |||
| and not allowing application servers to write directly to the protocol | and not allowing application servers to write directly to the protocol | |||
| stream. | stream. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="request.smuggling" title="Request Smuggling"> | <section anchor="request.smuggling" title="Request Smuggling"> | |||
| skipping to change at line 2137 ¶ | skipping to change at line 2116 ¶ | |||
| protocols and the use of length or chunk-delimited framing to detect | protocols and the use of length or chunk-delimited framing to detect | |||
| completeness. Historically, the lack of | completeness. Historically, the lack of | |||
| a single integrity mechanism has been justified by the informal nature of | a single integrity mechanism has been justified by the informal nature of | |||
| most HTTP communication. However, the prevalence of HTTP as an information | most HTTP communication. However, the prevalence of HTTP as an information | |||
| access mechanism has resulted in its increasing use within environments | access mechanism has resulted in its increasing use within environments | |||
| where verification of message integrity is crucial. | where verification of message integrity is crucial. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The mechanisms provided with the "https" scheme, such as authenticated | The mechanisms provided with the "https" scheme, such as authenticated | |||
| encryption, provide protection against modification of messages. Care | encryption, provide protection against modification of messages. Care | |||
| is needed however to ensure that connection closure cannot be used to | is needed, however, to ensure that connection closure cannot be used to | |||
| truncate messages (see <xref target="tls.connection.closure"/>). User agents | truncate messages (see <xref target="tls.connection.closure"/>). User agents | |||
| might refuse to accept incomplete messages or treat them specially. For | might refuse to accept incomplete messages or treat them specially. For | |||
| example, a browser being used to view medical history or drug interaction | example, a browser being used to view medical history or drug interaction | |||
| information needs to indicate to the user when such information is detected | information needs to indicate to the user when such information is detected | |||
| by the protocol to be incomplete, expired, or corrupted during transfer. | by the protocol to be incomplete, expired, or corrupted during transfer. | |||
| Such mechanisms might be selectively enabled via user agent extensions or | Such mechanisms might be selectively enabled via user agent extensions or | |||
| the presence of message integrity metadata in a response. | the presence of message integrity metadata in a response. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The "http" scheme provides no protection against accidental or malicious | The "http" scheme provides no protection against accidental or malicious | |||
| skipping to change at line 2167 ¶ | skipping to change at line 2146 ¶ | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="message.confidentiality" title="Message Confidentialit y"> | <section anchor="message.confidentiality" title="Message Confidentialit y"> | |||
| <t> | <t> | |||
| HTTP relies on underlying transport protocols to provide message | HTTP relies on underlying transport protocols to provide message | |||
| confidentiality when that is desired. HTTP has been specifically designed | confidentiality when that is desired. HTTP has been specifically designed | |||
| to be independent of the transport protocol, such that it can be used | to be independent of the transport protocol, such that it can be used | |||
| over many forms of encrypted connection, with the selection of | over many forms of encrypted connection, with the selection of | |||
| such transports being identified by the choice of URI scheme or within | such transports being identified by the choice of URI scheme or within | |||
| user agent configuration. | user agent configuration. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The "https" scheme can be used to identify resources that require a | The "https" scheme can be used to identify resources that require a | |||
| confidential connection, as described in <xref target="HTTP" section="4.2.2"/ >. | confidential connection, as described in <xref target="HTTP" section="4.2.2"/ >. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="IANA.considerations" title="IANA Considerations"> | <section anchor="IANA.considerations" title="IANA Considerations"> | |||
| <t> | <t> | |||
| The change controller for the following registrations is: | The change controller for the following registrations is: | |||
| "IETF (iesg@ietf.org) - Internet Engineering Task Force". | "IETF (iesg@ietf.org) - Internet Engineering Task Force". | |||
| </t> | </t> | |||
| <section anchor="field.name.registration" title="Field Name Registratio n"> | <section anchor="field.name.registration" title="Field Name Registratio n"> | |||
| <t> | <t> | |||
| First, introduce the new "Hypertext Transfer Protocol (HTTP) Field | IANA has added the following field names to the "Hypertext Transfer Protocol | |||
| Name Registry" at <eref target="https://www.iana.org/assignments/http-fields" | (HTTP) Field | |||
| brackets="angle"/> | Name Registry" at <eref target="https://www.iana.org/assignments/http-fields" | |||
| as described in | brackets="angle"/>, | |||
| <xref target="HTTP" section="18.4"/>. | as described in <xref target="HTTP" section="18.4"/>. | |||
| </t> | ||||
| <t> | ||||
| Then, please update the registry with the field names listed in the table | ||||
| below: | ||||
| </t> | </t> | |||
| <!--AUTOGENERATED FROM extract-header-defs.xslt, do not edit manuall y--> | ||||
| <table align="left" anchor="iana.header.registration.table"> | <table align="left" anchor="iana.header.registration.table"> | |||
| <thead> | <thead> | |||
| <tr> | <tr> | |||
| <th>Field Name</th> | <th>Field Name</th> | |||
| <th>Status</th> | <th>Status</th> | |||
| <th>Ref.</th> | <th>Section</th> | |||
| <th>Comments</th> | <th>Comments</th> | |||
| </tr> | </tr> | |||
| </thead> | </thead> | |||
| <tbody> | <tbody> | |||
| <tr> | <tr> | |||
| <td>Close</td> | <td>Close</td> | |||
| <td>standard</td> | <td>permanent</td> | |||
| <td> | <td> | |||
| <xref target="persistent.tear-down" format="counter"/> | <xref target="persistent.tear-down" format="counter"/> | |||
| </td> | </td> | |||
| <td>(reserved)</td> | <td>(reserved)</td> | |||
| </tr> | </tr> | |||
| <tr> | <tr> | |||
| <td>MIME-Version</td> | <td>MIME-Version</td> | |||
| <td>standard</td> | <td>permanent</td> | |||
| <td> | <td> | |||
| <xref target="mime-version" format="counter"/> | <xref target="mime-version" format="counter"/> | |||
| </td> | </td> | |||
| <td/> | <td/> | |||
| </tr> | </tr> | |||
| <tr> | <tr> | |||
| <td>Transfer-Encoding</td> | <td>Transfer-Encoding</td> | |||
| <td>standard</td> | <td>permanent</td> | |||
| <td> | <td> | |||
| <xref target="field.transfer-encoding" format="counter"/ > | <xref target="field.transfer-encoding" format="counter"/ > | |||
| </td> | </td> | |||
| <td/> | <td/> | |||
| </tr> | </tr> | |||
| </tbody> | </tbody> | |||
| </table> | </table> | |||
| <!--(END)--> | ||||
| </section> | </section> | |||
| <section anchor="media.type.http" title="Media Type Registration"> | <section anchor="media.type.http" title="Media Type Registration"> | |||
| <t> | <t> | |||
| Please update the "Media Types" registry at | IANA has updated the "Media Types" registry at | |||
| <eref target="https://www.iana.org/assignments/media-types" brackets="angle"/ > | <eref target="https://www.iana.org/assignments/media-types" brackets="angle"/ > | |||
| with the registration information in | with the registration information in Sections | |||
| <xref target="media.type.message.http"/> and | <xref target="media.type.message.http" format="counter"/> and | |||
| <xref target="media.type.application.http"/> for the media types | <xref target="media.type.application.http" format="counter"/> for the media t | |||
| ypes | ||||
| "message/http" and "application/http", respectively. | "message/http" and "application/http", respectively. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="transfer.coding.registration" | <section anchor="transfer.coding.registration" | |||
| title="Transfer Coding Registration"> | title="Transfer Coding Registration"> | |||
| <t> | <t> | |||
| Please update the "HTTP Transfer Coding Registry" at | IANA has updated the "HTTP Transfer Coding Registry" at | |||
| <eref target="https://www.iana.org/assignments/http-parameters/" | <eref target="https://www.iana.org/assignments/http-parameters/" | |||
| brackets="angle"/> | brackets="angle"/> | |||
| with the registration procedure of <xref target="transfer.coding.registry"/> | with the registration procedure of <xref target="transfer.coding.registry"/> | |||
| and the content coding names summarized in the table below. | and the content coding names summarized in the table below. | |||
| </t> | </t> | |||
| <table align="left" anchor="iana.transfer.coding.registration.table" > | <table align="left" anchor="iana.transfer.coding.registration.table" > | |||
| <thead> | <thead> | |||
| <tr> | <tr> | |||
| <th>Name</th> | <th>Name</th> | |||
| <th>Description</th> | <th>Description</th> | |||
| <th>Reference</th> | <th>Section</th> | |||
| </tr> | </tr> | |||
| </thead> | </thead> | |||
| <tbody> | <tbody> | |||
| <tr> | <tr> | |||
| <td>chunked</td> | <td>chunked</td> | |||
| <td>Transfer in a series of chunks</td> | <td>Transfer in a series of chunks</td> | |||
| <td> | <td> | |||
| <xref target="chunked.encoding"/> | <xref target="chunked.encoding" format="counter"/> | |||
| </td> | </td> | |||
| </tr> | </tr> | |||
| <tr> | <tr> | |||
| <td>compress</td> | <td>compress</td> | |||
| <td>UNIX "compress" data format <xref target="Welch"/> | <td>UNIX "compress" data format <xref target="Welch"/> | |||
| </td> | </td> | |||
| <td> | <td> | |||
| <xref target="compression.codings"/> | <xref target="compression.codings" format="counter"/> | |||
| </td> | </td> | |||
| </tr> | </tr> | |||
| <tr> | <tr> | |||
| <td>deflate</td> | <td>deflate</td> | |||
| <td>"deflate" compressed data (<xref target="RFC1951"/>) in side | <td>"deflate" compressed data (<xref target="RFC1951"/>) in side | |||
| the "zlib" data format (<xref target="RFC1950"/>)</td> | the "zlib" data format (<xref target="RFC1950"/>) | |||
| </td> | ||||
| <td> | <td> | |||
| <xref target="compression.codings"/> | <xref target="compression.codings" format="counter"/> | |||
| </td> | </td> | |||
| </tr> | </tr> | |||
| <tr> | <tr> | |||
| <td>gzip</td> | <td>gzip</td> | |||
| <td>GZIP file format <xref target="RFC1952"/> | <td>GZIP file format <xref target="RFC1952"/> | |||
| </td> | </td> | |||
| <td> | <td> | |||
| <xref target="compression.codings"/> | <xref target="compression.codings" format="counter"/> | |||
| </td> | </td> | |||
| </tr> | </tr> | |||
| <tr> | <tr> | |||
| <td>trailers</td> | <td>trailers</td> | |||
| <td>(reserved)</td> | <td>(reserved)</td> | |||
| <td> | <td> | |||
| <xref target="transfer.coding.registration"/> | <xref target="transfer.coding.registration" format="coun ter"/> | |||
| </td> | </td> | |||
| </tr> | </tr> | |||
| <tr> | <tr> | |||
| <td>x-compress</td> | <td>x-compress</td> | |||
| <td>Deprecated (alias for compress)</td> | <td>Deprecated (alias for compress)</td> | |||
| <td> | <td> | |||
| <xref target="compression.codings"/> | <xref target="compression.codings" format="counter"/> | |||
| </td> | </td> | |||
| </tr> | </tr> | |||
| <tr> | <tr> | |||
| <td>x-gzip</td> | <td>x-gzip</td> | |||
| <td>Deprecated (alias for gzip)</td> | <td>Deprecated (alias for gzip)</td> | |||
| <td> | <td> | |||
| <xref target="compression.codings"/> | <xref target="compression.codings" format="counter"/> | |||
| </td> | </td> | |||
| </tr> | </tr> | |||
| </tbody> | </tbody> | |||
| </table> | </table> | |||
| <aside> | <aside> | |||
| <t> | <t> | |||
| <strong>Note:</strong> the coding name "trailers" is reserved | <strong>Note:</strong> the coding name "trailers" is reserved because its use | |||
| because its use would | would | |||
| conflict with the keyword "trailers" in the TE | conflict with the keyword "trailers" in the TE | |||
| header field (<xref target="HTTP" section="10.1.4"/>). | header field (<xref target="HTTP" section="10.1.4"/>). | |||
| </t> | </t> | |||
| </aside> | </aside> | |||
| </section> | </section> | |||
| <section anchor="alpn.registration" title="ALPN Protocol ID Registratio n"> | <section anchor="alpn.registration" title="ALPN Protocol ID Registratio n"> | |||
| <t> | <t> | |||
| Please update the | IANA has updated the | |||
| "TLS Application-Layer Protocol Negotiation (ALPN) Protocol IDs" registry at | "TLS Application-Layer Protocol Negotiation (ALPN) Protocol IDs" registry at | |||
| <eref target="https://www.iana.org/assignments/tls-extensiontype-values/tls-e xtensiontype-values.xhtml" | <eref target="https://www.iana.org/assignments/tls-extensiontype-values/" | |||
| brackets="angle"/> | brackets="angle"/> | |||
| with the registration below: | with the registration below: | |||
| </t> | </t> | |||
| <table> | <table> | |||
| <thead> | <thead> | |||
| <tr> | <tr> | |||
| <th>Protocol</th> | <th>Protocol</th> | |||
| <th>Identification Sequence</th> | <th>Identification Sequence</th> | |||
| <th>Reference</th> | <th>Reference</th> | |||
| </tr> | </tr> | |||
| </thead> | </thead> | |||
| <tbody> | <tbody> | |||
| <tr> | <tr> | |||
| <td>HTTP/1.1</td> | <td>HTTP/1.1</td> | |||
| <td>0x68 0x74 0x74 0x70 0x2f 0x31 0x2e 0x31 ("http/1.1")</t d> | <td>0x68 0x74 0x74 0x70 0x2f 0x31 0x2e 0x31 ("http/1.1")</t d> | |||
| <td>(this specification)</td> | <td>RFC 9112</td> | |||
| </tr> | </tr> | |||
| </tbody> | </tbody> | |||
| </table> | </table> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| </middle> | </middle> | |||
| <back> | <back> | |||
| <displayreference xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
| xmlns:x="http://purl.org/net/xml2rfc/ext" | <displayreference target="HTTP10" to="HTTP/1.0"/> | |||
| target="HTTP10" | ||||
| to="HTTP/1.0"/> | ||||
| <references> | <references> | |||
| <name>References</name> | <name>References</name> | |||
| <references> | <references> | |||
| <name>Normative References</name> | <name>Normative References</name> | |||
| <reference anchor="HTTP"><!--included from draft-ietf-httpbis-semant | ||||
| ics-latest.xml--> | <!-- [HTTP][I-D.ietf-httpbis-semantics]; companion document RFC 9110 --> | |||
| <front> | <reference anchor='HTTP' target='https://www.rfc-editor.org/info/rfc9110'> | |||
| <title>HTTP Semantics</title> | <front> | |||
| <author fullname="Roy T. Fielding" | <title>HTTP Semantics</title> | |||
| initials="R." | <author initials='R' surname='Fielding' fullname='Roy T. Fielding' role='editor' | |||
| surname="Fielding" | > | |||
| role="editor"> | <organization /> | |||
| <organization>Adobe</organization> | </author> | |||
| <address> | <author initials='M' surname='Nottingham' fullname='Mark Nottingham' role='edito | |||
| <postal> | r'> | |||
| <postalLine>345 Park Ave</postalLine> | <organization /> | |||
| <postalLine>San Jose, CA 95110</postalLine> | </author> | |||
| <postalLine>United States of America</postalLine> | <author initials='J' surname='Reschke' fullname='Julian Reschke' role='editor'> | |||
| </postal> | <organization /> | |||
| <email>fielding@gbiv.com</email> | </author> | |||
| <uri>https://roy.gbiv.com/</uri> | <date year='2022' month='June'/> | |||
| </address> | </front> | |||
| </author> | <seriesInfo name="STD" value="97"/> | |||
| <author fullname="Mark Nottingham" | <seriesInfo name="RFC" value="9110"/> | |||
| initials="M." | <seriesInfo name="DOI" value="10.17487/RFC9110"/> | |||
| surname="Nottingham" | </reference> | |||
| role="editor"> | ||||
| <organization>Fastly</organization> | <!-- [CACHING][I-D.ietf-httpbis-cache]; companion document RFC 9111 --> | |||
| <address> | <reference anchor='CACHING' target='https://www.rfc-editor.org/info/ | |||
| <postal> | rfc9111'> | |||
| <postalLine>Prahran VIC</postalLine> | ||||
| <postalLine>Australia</postalLine> | ||||
| </postal> | ||||
| <email>mnot@mnot.net</email> | ||||
| <uri>https://www.mnot.net/</uri> | ||||
| </address> | ||||
| </author> | ||||
| <author fullname="Julian Reschke" | ||||
| initials="J." | ||||
| surname="Reschke" | ||||
| role="editor"> | ||||
| <organization abbrev="greenbytes">greenbytes GmbH</organiza | ||||
| tion> | ||||
| <address> | ||||
| <postal> | ||||
| <postalLine>Hafenweg 16</postalLine> | ||||
| <postalLine>48155 Münster</postalLine> | ||||
| <postalLine>Germany</postalLine> | ||||
| </postal> | ||||
| <email>julian.reschke@greenbytes.de</email> | ||||
| <uri>https://greenbytes.de/tech/webdav/</uri> | ||||
| </address> | ||||
| </author> | ||||
| <date year="2021" month="September" day="10"/> | ||||
| </front> | ||||
| <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-seman | ||||
| tics-19"/> | ||||
| </reference> | ||||
| <reference anchor="CACHING"><!--included from draft-ietf-httpbis-cac | ||||
| he-latest.xml--> | ||||
| <front> | <front> | |||
| <title>HTTP Caching</title> | <title>HTTP Caching</title> | |||
| <author fullname="Roy T. Fielding" | <author initials='R' surname='Fielding' fullname='Roy Fielding | |||
| initials="R." | ' role='editor'> | |||
| surname="Fielding" | <organization /> | |||
| role="editor"> | ||||
| <organization>Adobe</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <postalLine>345 Park Ave</postalLine> | ||||
| <postalLine>San Jose, CA 95110</postalLine> | ||||
| <postalLine>United States of America</postalLine> | ||||
| </postal> | ||||
| <email>fielding@gbiv.com</email> | ||||
| <uri>https://roy.gbiv.com/</uri> | ||||
| </address> | ||||
| </author> | </author> | |||
| <author fullname="Mark Nottingham" | <author initials='M' surname='Nottingham' fullname='Mark Notti | |||
| initials="M." | ngham' role='editor'> | |||
| surname="Nottingham" | <organization /> | |||
| role="editor"> | ||||
| <organization>Fastly</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <postalLine>Prahran VIC</postalLine> | ||||
| <postalLine>Australia</postalLine> | ||||
| </postal> | ||||
| <email>mnot@mnot.net</email> | ||||
| <uri>https://www.mnot.net/</uri> | ||||
| </address> | ||||
| </author> | </author> | |||
| <author fullname="Julian Reschke" | <author initials='J' surname='Reschke' fullname='Julian Reschk | |||
| initials="J." | e' role='editor'> | |||
| surname="Reschke" | <organization /> | |||
| role="editor"> | ||||
| <organization abbrev="greenbytes">greenbytes GmbH</organiza | ||||
| tion> | ||||
| <address> | ||||
| <postal> | ||||
| <postalLine>Hafenweg 16</postalLine> | ||||
| <postalLine>48155 Münster</postalLine> | ||||
| <postalLine>Germany</postalLine> | ||||
| </postal> | ||||
| <email>julian.reschke@greenbytes.de</email> | ||||
| <uri>https://greenbytes.de/tech/webdav/</uri> | ||||
| </address> | ||||
| </author> | </author> | |||
| <date year="2021" month="September" day="10"/> | <date year='2022' month='June'/> | |||
| </front> | </front> | |||
| <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-cache | <seriesInfo name="STD" value="98"/> | |||
| -19"/> | <seriesInfo name="RFC" value="9111"/> | |||
| <seriesInfo name="DOI" value="10.17487/RFC9111"/> | ||||
| </reference> | </reference> | |||
| <reference anchor="URI" target="https://www.rfc-editor.org/info/rfc3 986"> | <reference anchor="URI" target="https://www.rfc-editor.org/info/rfc3 986"> | |||
| <front> | <front> | |||
| <title abbrev="URI Generic Syntax">Uniform Resource Identifier (URI): Generic Syntax</title> | <title abbrev="URI Generic Syntax">Uniform Resource Identifier (URI): Generic Syntax</title> | |||
| <author initials="T." surname="Berners-Lee" fullname="Tim Bern ers-Lee"/> | <author initials="T." surname="Berners-Lee" fullname="Tim Bern ers-Lee"/> | |||
| <author initials="R." surname="Fielding" fullname="Roy T. Fiel ding"/> | <author initials="R." surname="Fielding" fullname="Roy T. Fiel ding"/> | |||
| <author initials="L." surname="Masinter" fullname="Larry Masin ter"/> | <author initials="L." surname="Masinter" fullname="Larry Masin ter"/> | |||
| <date month="January" year="2005"/> | <date month="January" year="2005"/> | |||
| </front> | </front> | |||
| <seriesInfo name="STD" value="66"/> | <seriesInfo name="STD" value="66"/> | |||
| <seriesInfo name="RFC" value="3986"/> | <seriesInfo name="RFC" value="3986"/> | |||
| <seriesInfo name="DOI" value="10.17487/RFC3986"/> | <seriesInfo name="DOI" value="10.17487/RFC3986"/> | |||
| </reference> | </reference> | |||
| <reference anchor="RFC5234" target="https://www.rfc-editor.org/info/ | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5234. | |||
| rfc5234"> | xml"/> | |||
| <front> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7405. | |||
| <title abbrev="ABNF for Syntax Specifications">Augmented BNF f | xml"/> | |||
| or Syntax Specifications: ABNF</title> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119. | |||
| <author initials="D." | xml"/> | |||
| surname="Crocker" | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174. | |||
| fullname="Dave Crocker" | xml"/> | |||
| role="editor"/> | ||||
| <author initials="P." surname="Overell" fullname="Paul Overell | ||||
| "/> | ||||
| <date month="January" year="2008"/> | ||||
| </front> | ||||
| <seriesInfo name="STD" value="68"/> | ||||
| <seriesInfo name="RFC" value="5234"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC5234"/> | ||||
| </reference> | ||||
| <reference anchor="RFC7405" target="https://www.rfc-editor.org/info/ | ||||
| rfc7405"> | ||||
| <front> | ||||
| <title>Case-Sensitive String Support in ABNF</title> | ||||
| <author initials="P." surname="Kyzivat" fullname="Dave Kyzivat | ||||
| "/> | ||||
| <date month="December" year="2014"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="7405"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC7405"/> | ||||
| </reference> | ||||
| <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/ | ||||
| rfc2119"> | ||||
| <front> | ||||
| <title>Key words for use in RFCs to Indicate Requirement Level | ||||
| s</title> | ||||
| <author initials="S." surname="Bradner" fullname="Scott Bradne | ||||
| r"/> | ||||
| <date month="March" year="1997"/> | ||||
| </front> | ||||
| <seriesInfo name="BCP" value="14"/> | ||||
| <seriesInfo name="RFC" value="2119"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC2119"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/ | ||||
| rfc8174"> | ||||
| <front> | ||||
| <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Wor | ||||
| ds</title> | ||||
| <author initials="B." surname="Leiba" fullname="Barry Leiba"/> | ||||
| <date year="2017" month="May"/> | ||||
| </front> | ||||
| <seriesInfo name="BCP" value="14"/> | ||||
| <seriesInfo name="RFC" value="8174"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8174"/> | ||||
| </reference> | ||||
| <reference anchor="USASCII"> | <reference anchor="USASCII"> | |||
| <front> | <front> | |||
| <title>Coded Character Set -- 7-bit American Standard Code for Information Interchange</title> | <title>Coded Character Set -- 7-bit American Standard Code for Information Interchange</title> | |||
| <author> | <author> | |||
| <organization>American National Standards Institute</organi zation> | <organization>American National Standards Institute</organi zation> | |||
| </author> | </author> | |||
| <date year="1986"/> | <date year="1986"/> | |||
| </front> | </front> | |||
| <seriesInfo name="ANSI" value="X3.4"/> | <seriesInfo name="ANSI" value="X3.4"/> | |||
| </reference> | </reference> | |||
| <reference anchor="RFC1950" target="https://www.rfc-editor.org/info/ | ||||
| rfc1950"> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1950. | |||
| <front> | xml"/> | |||
| <title>ZLIB Compressed Data Format Specification version 3.3</ | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1951. | |||
| title> | xml"/> | |||
| <author initials="L.P." surname="Deutsch" fullname="L. Peter D | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1952. | |||
| eutsch"/> | xml"/> | |||
| <author initials="J-L." surname="Gailly" fullname="Jean-Loup G | ||||
| ailly"/> | ||||
| <date month="May" year="1996"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="1950"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC1950"/> | ||||
| </reference> | ||||
| <reference anchor="RFC1951" target="https://www.rfc-editor.org/info/ | ||||
| rfc1951"> | ||||
| <front> | ||||
| <title>DEFLATE Compressed Data Format Specification version 1. | ||||
| 3</title> | ||||
| <author initials="P." surname="Deutsch" fullname="L. Peter Deu | ||||
| tsch"/> | ||||
| <date month="May" year="1996"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="1951"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC1951"/> | ||||
| </reference> | ||||
| <reference anchor="RFC1952" target="https://www.rfc-editor.org/info/ | ||||
| rfc1952"> | ||||
| <front> | ||||
| <title>GZIP file format specification version 4.3</title> | ||||
| <author initials="P." surname="Deutsch" fullname="L. Peter Deu | ||||
| tsch"/> | ||||
| <author initials="J-L." surname="Gailly" fullname="Jean-Loup G | ||||
| ailly"/> | ||||
| <author initials="M." surname="Adler" fullname="Mark Adler"/> | ||||
| <author initials="L.P." surname="Deutsch" fullname="L. Peter D | ||||
| eutsch"/> | ||||
| <author initials="G." | ||||
| surname="Randers-Pehrson" | ||||
| fullname="Glenn Randers-Pehrson"/> | ||||
| <date month="May" year="1996"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="1952"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC1952"/> | ||||
| </reference> | ||||
| <reference anchor="TLS13" target="https://www.rfc-editor.org/info/rf c8446"> | <reference anchor="TLS13" target="https://www.rfc-editor.org/info/rf c8446"> | |||
| <front> | <front> | |||
| <title>The Transport Layer Security (TLS) Protocol Version 1.3 </title> | <title>The Transport Layer Security (TLS) Protocol Version 1.3 </title> | |||
| <author initials="E." surname="Rescorla" fullname="E. Rescorla "/> | <author initials="E." surname="Rescorla" fullname="Eric Rescor la"/> | |||
| <date year="2018" month="August"/> | <date year="2018" month="August"/> | |||
| </front> | </front> | |||
| <seriesInfo name="RFC" value="8446"/> | <seriesInfo name="RFC" value="8446"/> | |||
| <seriesInfo name="DOI" value="10.17487/RFC8446"/> | <seriesInfo name="DOI" value="10.17487/RFC8446"/> | |||
| </reference> | </reference> | |||
| <reference anchor="Welch"> | <reference anchor="Welch" target="https://ieeexplore.ieee.org/docume nt/1659158/"> | |||
| <front> | <front> | |||
| <title>A Technique for High-Performance Data Compression</titl e> | <title>A Technique for High-Performance Data Compression</titl e> | |||
| <author initials="T. A." surname="Welch" fullname="Terry A. We lch"/> | <author initials="T." surname="Welch" fullname="Terry A. Welch "/> | |||
| <date month="June" year="1984"/> | <date month="June" year="1984"/> | |||
| </front> | </front> | |||
| <seriesInfo name="IEEE Computer" value="17(6)"/> | <seriesInfo name="DOI" value="10.1109/MC.1984.1659158"/> | |||
| <refcontent>IEEE Computer 17(6)</refcontent> | ||||
| </reference> | </reference> | |||
| </references> | </references> | |||
| <references> | <references> | |||
| <name>Informative References</name> | <name>Informative References</name> | |||
| <reference anchor="HTTP10" target="https://www.rfc-editor.org/info/r fc1945"> | <reference anchor="HTTP10" target="https://www.rfc-editor.org/info/r fc1945"> | |||
| <front> | <front> | |||
| <title abbrev="HTTP/1.0">Hypertext Transfer Protocol -- HTTP/1 .0</title> | <title abbrev="HTTP/1.0">Hypertext Transfer Protocol -- HTTP/1 .0</title> | |||
| <author initials="T." surname="Berners-Lee" fullname="Tim Bern | <author initials="T." surname="Berners-Lee" fullname="T. Berne | |||
| ers-Lee"/> | rs-Lee"/> | |||
| <author initials="R.T." surname="Fielding" fullname="Roy T. Fi | <author initials="R." surname="Fielding" fullname="R. Fielding | |||
| elding"/> | "/> | |||
| <author initials="H.F." surname="Nielsen" fullname="Henrik Fry | <author initials="H." surname="Frystyk" fullname="H. Frystyk"/ | |||
| styk Nielsen"/> | > | |||
| <date month="May" year="1996"/> | <date month="May" year="1996"/> | |||
| </front> | </front> | |||
| <seriesInfo name="RFC" value="1945"/> | <seriesInfo name="RFC" value="1945"/> | |||
| <seriesInfo name="DOI" value="10.17487/RFC1945"/> | <seriesInfo name="DOI" value="10.17487/RFC1945"/> | |||
| </reference> | </reference> | |||
| <reference anchor="RFC2045" target="https://www.rfc-editor.org/info/ | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2045. | |||
| rfc2045"> | xml"/> | |||
| <front> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2046. | |||
| <title abbrev="Internet Message Bodies">Multipurpose Internet | xml"/> | |||
| Mail Extensions (MIME) Part One: Format of Internet Message Bodies</title> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2049. | |||
| <author initials="N." surname="Freed" fullname="Ned Freed"/> | xml"/> | |||
| <author initials="N.S." | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2068. | |||
| surname="Borenstein" | xml"/> | |||
| fullname="Nathaniel S. Borenstein"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2557. | |||
| <date month="November" year="1996"/> | xml"/> | |||
| </front> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5322. | |||
| <seriesInfo name="RFC" value="2045"/> | xml"/> | |||
| <seriesInfo name="DOI" value="10.17487/RFC2045"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7230. | |||
| </reference> | xml"/> | |||
| <reference anchor="RFC2046" target="https://www.rfc-editor.org/info/ | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8126. | |||
| rfc2046"> | xml"/> | |||
| <front> | ||||
| <title abbrev="Media Types">Multipurpose Internet Mail Extensi | <reference anchor="Klein" target="https://packetstormsecurity.com/pa | |||
| ons (MIME) Part Two: Media Types</title> | pers/general/whitepaper_httpresponse.pdf"> | |||
| <author initials="N." surname="Freed" fullname="Ned Freed"/> | ||||
| <author initials="N." | ||||
| surname="Borenstein" | ||||
| fullname="Nathaniel S. Borenstein"/> | ||||
| <date month="November" year="1996"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="2046"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC2046"/> | ||||
| </reference> | ||||
| <reference anchor="RFC2049" target="https://www.rfc-editor.org/info/ | ||||
| rfc2049"> | ||||
| <front> | ||||
| <title abbrev="MIME Conformance">Multipurpose Internet Mail Ex | ||||
| tensions (MIME) Part Five: Conformance Criteria and Examples</title> | ||||
| <author initials="N." surname="Freed" fullname="Ned Freed"/> | ||||
| <author initials="N.S." | ||||
| surname="Borenstein" | ||||
| fullname="Nathaniel S. Borenstein"/> | ||||
| <date month="November" year="1996"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="2049"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC2049"/> | ||||
| </reference> | ||||
| <reference anchor="RFC2068" target="https://www.rfc-editor.org/info/ | ||||
| rfc2068"> | ||||
| <front> | ||||
| <title>Hypertext Transfer Protocol -- HTTP/1.1</title> | ||||
| <author initials="R." surname="Fielding" fullname="Roy T. Fiel | ||||
| ding"/> | ||||
| <author initials="J." surname="Gettys" fullname="Jim Gettys"/> | ||||
| <author initials="J." surname="Mogul" fullname="Jeffrey C. Mog | ||||
| ul"/> | ||||
| <author initials="H." surname="Nielsen" fullname="Henrik Fryst | ||||
| yk Nielsen"/> | ||||
| <author initials="T." surname="Berners-Lee" fullname="Tim Bern | ||||
| ers-Lee"/> | ||||
| <date month="January" year="1997"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="2068"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC2068"/> | ||||
| </reference> | ||||
| <reference anchor="RFC2557" target="https://www.rfc-editor.org/info/ | ||||
| rfc2557"> | ||||
| <front> | ||||
| <title abbrev="MIME Encapsulation of Aggregate Documents">MIME | ||||
| Encapsulation of Aggregate Documents, such as HTML (MHTML)</title> | ||||
| <author initials="F." surname="Palme" fullname="Jacob Palme"/> | ||||
| <author initials="A." surname="Hopmann" fullname="Alex Hopmann | ||||
| "/> | ||||
| <author initials="N." surname="Shelness" fullname="Nick Shelne | ||||
| ss"/> | ||||
| <author initials="E." surname="Stefferud" fullname="Einar Stef | ||||
| ferud"/> | ||||
| <date year="1999" month="March"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="2557"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC2557"/> | ||||
| </reference> | ||||
| <reference anchor="RFC5322" target="https://www.rfc-editor.org/info/ | ||||
| rfc5322"> | ||||
| <front> | ||||
| <title>Internet Message Format</title> | ||||
| <author initials="P." surname="Resnick" fullname="P. Resnick"/ | ||||
| > | ||||
| <date year="2008" month="October"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="5322"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC5322"/> | ||||
| </reference> | ||||
| <reference anchor="RFC7230" target="https://www.rfc-editor.org/info/ | ||||
| rfc7230"> | ||||
| <front> | ||||
| <title>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax | ||||
| and Routing</title> | ||||
| <author initials="R." | ||||
| surname="Fielding" | ||||
| fullname="Roy T. Fielding" | ||||
| role="editor"/> | ||||
| <author initials="J. F." | ||||
| surname="Reschke" | ||||
| fullname="Julian F. Reschke" | ||||
| role="editor"/> | ||||
| <date month="June" year="2014"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="7230"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC7230"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8126" target="https://www.rfc-editor.org/info/ | ||||
| rfc8126"> | ||||
| <front> | ||||
| <title>Guidelines for Writing an IANA Considerations Section i | ||||
| n RFCs</title> | ||||
| <author initials="M." surname="Cotton" fullname="M. Cotton"/> | ||||
| <author initials="B." surname="Leiba" fullname="B. Leiba"/> | ||||
| <author initials="T." surname="Narten" fullname="T. Narten"/> | ||||
| <date year="2017" month="June"/> | ||||
| </front> | ||||
| <seriesInfo name="BCP" value="26"/> | ||||
| <seriesInfo name="RFC" value="8126"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8126"/> | ||||
| </reference> | ||||
| <reference anchor="Klein" | ||||
| target="https://packetstormsecurity.com/papers/general/wh | ||||
| itepaper_httpresponse.pdf"> | ||||
| <front> | <front> | |||
| <title>Divide and Conquer - HTTP Response Splitting, Web Cache Poisoning Attacks, and Related Topics</title> | <title>Divide and Conquer - HTTP Response Splitting, Web Cache Poisoning Attacks, and Related Topics</title> | |||
| <author initials="A." surname="Klein" fullname="Amit Klein"/> | <author initials="A." surname="Klein" fullname="Amit Klein"/> | |||
| <date year="2004" month="March"/> | <date year="2004" month="March"/> | |||
| </front> | </front> | |||
| </reference> | </reference> | |||
| <reference anchor="Linhart" | <reference anchor="Linhart" | |||
| target="https://www.cgisecurity.com/lib/HTTP-Request-Smug gling.pdf"> | target="https://www.cgisecurity.com/lib/HTTP-Request-Smug gling.pdf"> | |||
| <front> | <front> | |||
| <title>HTTP Request Smuggling</title> | <title>HTTP Request Smuggling</title> | |||
| <author initials="C." surname="Linhart" fullname="Chaim Linhar t"/> | <author initials="C." surname="Linhart" fullname="Chaim Linhar t"/> | |||
| <author initials="A." surname="Klein" fullname="Amit Klein"/> | <author initials="A." surname="Klein" fullname="Amit Klein"/> | |||
| <author initials="R." surname="Heled" fullname="Ronen Heled"/> | <author initials="R." surname="Heled" fullname="Ronen Heled"/> | |||
| <author initials="S." surname="Orrin" fullname="Steve Orrin"/> | <author initials="S." surname="Orrin" fullname="Steve Orrin"/> | |||
| <date year="2005" month="June"/> | <date year="2005" month="June"/> | |||
| </front> | </front> | |||
| </reference> | </reference> | |||
| <reference anchor="Err4667" | ||||
| quote-title="false" | ||||
| target="https://www.rfc-editor.org/errata/eid4667"> | ||||
| <front> | ||||
| <title>Erratum ID 4667</title> | ||||
| <author> | ||||
| <organization>RFC Errata</organization> | ||||
| </author> | ||||
| <date/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="7230"/> | ||||
| </reference> | ||||
| </references> | </references> | |||
| </references> | </references> | |||
| <section anchor="collected.abnf" title="Collected ABNF"> | <section anchor="collected.abnf" title="Collected ABNF"> | |||
| <t>In the collected ABNF below, list rules are expanded as per <xref ta | <t>In the collected ABNF below, list rules are expanded per <xref target | |||
| rget="HTTP" section="5.6.1"/>.</t> | ="HTTP" section="5.6.1"/>.</t> | |||
| <sourcecode type="abnf" name="draft-ietf-httpbis-messaging-latest.parse | <sourcecode type="abnf" name="rfc9112.parsed-abnf"><![CDATA[ | |||
| d-abnf"><![CDATA[BWS = <BWS, see [HTTP], Section 5.6.3> | BWS = <BWS, see [HTTP], Section 5.6.3> | |||
| HTTP-message = start-line CRLF *( field-line CRLF ) CRLF [ | HTTP-message = start-line CRLF *( field-line CRLF ) CRLF [ | |||
| message-body ] | message-body ] | |||
| HTTP-name = %x48.54.54.50 ; HTTP | HTTP-name = %x48.54.54.50 ; HTTP | |||
| HTTP-version = HTTP-name "/" DIGIT "." DIGIT | HTTP-version = HTTP-name "/" DIGIT "." DIGIT | |||
| OWS = <OWS, see [HTTP], Section 5.6.3> | OWS = <OWS, see [HTTP], Section 5.6.3> | |||
| RWS = <RWS, see [HTTP], Section 5.6.3> | RWS = <RWS, see [HTTP], Section 5.6.3> | |||
| skipping to change at line 2788 ¶ | skipping to change at line 2535 ¶ | |||
| trailer-section = *( field-line CRLF ) | trailer-section = *( field-line CRLF ) | |||
| transfer-coding = <transfer-coding, see [HTTP], Section 10.1.4> | transfer-coding = <transfer-coding, see [HTTP], Section 10.1.4> | |||
| uri-host = <host, see [URI], Section 3.2.2> | uri-host = <host, see [URI], Section 3.2.2> | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| </section> | </section> | |||
| <section anchor="differences.between.http.and.mime" | <section anchor="differences.between.http.and.mime" | |||
| title="Differences between HTTP and MIME"> | title="Differences between HTTP and MIME"> | |||
| <t> | <t> | |||
| HTTP/1.1 uses many of the constructs defined for the | HTTP/1.1 uses many of the constructs defined for the | |||
| Internet Message Format <xref target="RFC5322"/> and the Multipurpose | Internet Message Format <xref target="RFC5322"/> and Multipurpose | |||
| Internet Mail Extensions (MIME) <xref target="RFC2045"/> to | Internet Mail Extensions (MIME) <xref target="RFC2045"/> to | |||
| allow a message body to be transmitted in an open variety of | allow a message body to be transmitted in an open variety of | |||
| representations and with extensible fields. However, RFC 2045 | representations and with extensible fields. However, some | |||
| is focused only on email; applications of HTTP have many characteristics | of these constructs have been reinterpreted to better fit the needs | |||
| that differ from email; hence, HTTP has features that differ from MIME. | of interactive communication, leading to some differences in how MIME | |||
| These differences were carefully chosen to optimize performance over binary | constructs are used within HTTP. These differences were carefully | |||
| connections, to allow greater freedom in the use of new media types, to | chosen to optimize performance over binary connections, allow | |||
| make date comparisons easier, and to acknowledge the practice of some early | greater freedom in the use of new media types, ease date comparisons, | |||
| HTTP servers and clients. | and accommodate common implementations. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| This appendix describes specific areas where HTTP differs from MIME. | This appendix describes specific areas where HTTP differs from MIME. | |||
| Proxies and gateways to and from strict MIME environments need to be | Proxies and gateways to and from strict MIME environments need to be | |||
| aware of these differences and provide the appropriate conversions | aware of these differences and provide the appropriate conversions | |||
| where necessary. | where necessary. | |||
| </t> | </t> | |||
| <section anchor="mime-version" title="MIME-Version"> | <section anchor="mime-version" title="MIME-Version"> | |||
| <iref primary="true" item="Fields" subitem="MIME-Version"/> | <iref primary="true" item="Fields" subitem="MIME-Version"/> | |||
| <iref primary="true" item="Header Fields" subitem="MIME-Version"/> | <iref primary="true" item="Header Fields" subitem="MIME-Version"/> | |||
| <iref primary="true" item="MIME-Version header field"/> | <iref primary="true" item="MIME-Version header field"/> | |||
| <t> | <t> | |||
| HTTP is not a MIME-compliant protocol. However, messages can | HTTP is not a MIME-compliant protocol. However, messages can | |||
| include a single MIME-Version header field to indicate what | include a single MIME-Version header field to indicate what | |||
| version of the MIME protocol was used to construct the message. Use | version of the MIME protocol was used to construct the message. Use | |||
| of the MIME-Version header field indicates that the message is in | of the MIME-Version header field indicates that the message is in | |||
| full conformance with the MIME protocol (as defined in <xref target="RFC2045" />). | full conformance with the MIME protocol (as defined in <xref target="RFC2045" />). | |||
| Senders are responsible for ensuring full conformance (where | Senders are responsible for ensuring full conformance (where | |||
| possible) when exporting HTTP messages to strict MIME environments. | possible) when exporting HTTP messages to strict MIME environments. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="conversion.to.canonical.form" | <section anchor="conversion.to.canonical.form" | |||
| title="Conversion to Canonical Form"> | title="Conversion to Canonical Form"> | |||
| <t> | <t> | |||
| MIME requires that an Internet mail body part be converted to canonical | MIME requires that an Internet mail body part be converted to canonical | |||
| form prior to being transferred, as described in <xref target="RFC2049" secti on="4"/>, and that content with a type of "text" represent | form prior to being transferred, as described in <xref target="RFC2049" secti on="4"/>, and that content with a type of "text" represents | |||
| line breaks as CRLF, forbidding the use of CR or LF outside of line break | line breaks as CRLF, forbidding the use of CR or LF outside of line break | |||
| sequences <xref target="RFC2046"/>. In contrast, HTTP does not care whether | sequences <xref target="RFC2046"/>. In contrast, HTTP does not care whether | |||
| CRLF, bare CR, or bare LF are used to indicate a line break within content. | CRLF, bare CR, or bare LF are used to indicate a line break within content. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A proxy or gateway from HTTP to a strict MIME | A proxy or gateway from HTTP to a strict MIME | |||
| environment ought to translate all line breaks within text media | environment ought to translate all line breaks within text media | |||
| types to the RFC 2049 canonical form of CRLF. Note, however, | types to the RFC 2049 canonical form of CRLF. Note, however, | |||
| this might be complicated by the presence of a Content-Encoding | this might be complicated by the presence of a Content-Encoding | |||
| and by the fact that HTTP allows the use of some charsets | and by the fact that HTTP allows the use of some charsets | |||
| skipping to change at line 2855 ¶ | skipping to change at line 2602 ¶ | |||
| HTTP/1.1 uses a restricted set of date formats (<xref target="HTTP" section=" 5.6.7"/>) to | HTTP/1.1 uses a restricted set of date formats (<xref target="HTTP" section=" 5.6.7"/>) to | |||
| simplify the process of date comparison. Proxies and gateways from | simplify the process of date comparison. Proxies and gateways from | |||
| other protocols ought to ensure that any Date header field | other protocols ought to ensure that any Date header field | |||
| present in a message conforms to one of the HTTP/1.1 formats and rewrite | present in a message conforms to one of the HTTP/1.1 formats and rewrite | |||
| the date if necessary. | the date if necessary. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="conversion.of.content-encoding" | <section anchor="conversion.of.content-encoding" | |||
| title="Conversion of Content-Encoding"> | title="Conversion of Content-Encoding"> | |||
| <t> | <t> | |||
| MIME does not include any concept equivalent to HTTP/1.1's | MIME does not include any concept equivalent to HTTP's | |||
| Content-Encoding header field. Since this acts as a modifier | Content-Encoding header field. Since this acts as a modifier | |||
| on the media type, proxies and gateways from HTTP to MIME-compliant | on the media type, proxies and gateways from HTTP to MIME-compliant | |||
| protocols ought to either change the value of the Content-Type | protocols ought to either change the value of the Content-Type | |||
| header field or decode the representation before forwarding the message. | header field or decode the representation before forwarding the message. | |||
| (Some experimental applications of Content-Type for Internet mail have used | (Some experimental applications of Content-Type for Internet mail have used | |||
| a media-type parameter of ";conversions=<content-coding>" to perform | a media-type parameter of ";conversions=<content-coding>" to perform | |||
| a function equivalent to Content-Encoding. However, this parameter is | a function equivalent to Content-Encoding. However, this parameter is | |||
| not part of the MIME standards). | not part of the MIME standards.) | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="conversion.of.content-transfer-encoding" | <section anchor="conversion.of.content-transfer-encoding" | |||
| title="Conversion of Content-Transfer-Encoding"> | title="Conversion of Content-Transfer-Encoding"> | |||
| <iref item="Content-Transfer-Encoding header field"/> | <iref item="Content-Transfer-Encoding header field"/> | |||
| <t> | <t> | |||
| HTTP does not use the Content-Transfer-Encoding field of MIME. | HTTP does not use the Content-Transfer-Encoding field of MIME. | |||
| Proxies and gateways from MIME-compliant protocols to HTTP need to remove | Proxies and gateways from MIME-compliant protocols to HTTP need to remove | |||
| any Content-Transfer-Encoding prior to delivering the response message to | any Content-Transfer-Encoding prior to delivering the response message to | |||
| an HTTP client. | an HTTP client. | |||
| skipping to change at line 2886 ¶ | skipping to change at line 2633 ¶ | |||
| Proxies and gateways from HTTP to MIME-compliant protocols are | Proxies and gateways from HTTP to MIME-compliant protocols are | |||
| responsible for ensuring that the message is in the correct format | responsible for ensuring that the message is in the correct format | |||
| and encoding for safe transport on that protocol, where "safe | and encoding for safe transport on that protocol, where "safe | |||
| transport" is defined by the limitations of the protocol being used. | transport" is defined by the limitations of the protocol being used. | |||
| Such a proxy or gateway ought to transform and label the data with an | Such a proxy or gateway ought to transform and label the data with an | |||
| appropriate Content-Transfer-Encoding if doing so will improve the | appropriate Content-Transfer-Encoding if doing so will improve the | |||
| likelihood of safe transport over the destination protocol. | likelihood of safe transport over the destination protocol. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="mhtml.line.length" title="MHTML and Line Length Limita tions"> | <section anchor="mhtml.line.length" title="MHTML and Line Length Limita tions"> | |||
| <t> | <t> | |||
| HTTP implementations that share code with MHTML <xref target="RFC2557"/> | HTTP implementations that share code with MHTML <xref target="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 lines. | Since HTTP does not have this limitation, HTTP does not fold long lines. | |||
| MHTML messages being transported by HTTP follow all conventions of MHTML, | MHTML messages being transported by HTTP follow all conventions of MHTML, | |||
| including line length limitations and folding, canonicalization, etc., | including line length limitations and folding, canonicalization, etc., | |||
| since HTTP transfers message-bodies without modification and, aside from the | since HTTP transfers message-bodies without modification and, aside from the | |||
| "multipart/byteranges" type (<xref target="HTTP" section="14.6"/>), | "multipart/byteranges" type (<xref target="HTTP" section="14.6"/>), | |||
| does not interpret | does not interpret | |||
| the content or any MIME header lines that might be contained therein. | the content or any MIME header lines that might be contained therein. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="changes" title="Changes from previous RFCs"> | <section anchor="changes" title="Changes from Previous RFCs"> | |||
| <section anchor="changes.from.0.9" title="Changes from HTTP/0.9"> | <section anchor="changes.from.0.9" title="Changes from HTTP/0.9"> | |||
| <t> | <t> | |||
| Since HTTP/0.9 did not support header fields in a request, there is no | Since HTTP/0.9 did not support header fields in a request, there is no | |||
| mechanism for it to support name-based virtual hosts (selection of resource | mechanism for it to support name-based virtual hosts (selection of resource | |||
| by inspection of the Host header field). | by inspection of the Host header field). | |||
| Any server that implements name-based virtual hosts ought to disable | Any server that implements name-based virtual hosts ought to disable | |||
| support for HTTP/0.9. Most requests that appear to be HTTP/0.9 are, in | support for HTTP/0.9. Most requests that appear to be HTTP/0.9 are, in | |||
| fact, badly constructed HTTP/1.x requests caused by a client failing to | fact, badly constructed HTTP/1.x requests caused by a client failing to | |||
| properly encode the request-target. | properly encode the request-target. | |||
| </t> | </t> | |||
| skipping to change at line 2923 ¶ | skipping to change at line 2670 ¶ | |||
| title="Multihomed Web Servers"> | title="Multihomed Web Servers"> | |||
| <t> | <t> | |||
| The requirements that clients and servers support the Host | The requirements that clients and servers support the Host | |||
| header field (<xref target="HTTP" section="7.2"/>), report an error if it is | header field (<xref target="HTTP" section="7.2"/>), report an error if it is | |||
| missing from an HTTP/1.1 request, and accept absolute URIs | missing from an HTTP/1.1 request, and accept absolute URIs | |||
| (<xref target="request.target"/>) | (<xref target="request.target"/>) | |||
| are among the most important changes defined by HTTP/1.1. | are among the most important changes defined by HTTP/1.1. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Older HTTP/1.0 clients assumed a one-to-one relationship of IP | Older HTTP/1.0 clients assumed a one-to-one relationship of IP | |||
| addresses and servers; there was no other established mechanism for | addresses and servers; there was no established mechanism for | |||
| distinguishing the intended server of a request than the IP address | distinguishing the intended server of a request other than the IP address | |||
| to which that request was directed. The Host header field was | to which that request was directed. The Host header field was | |||
| introduced during the development of HTTP/1.1 and, though it was | introduced during the development of HTTP/1.1 and, though it was | |||
| quickly implemented by most HTTP/1.0 browsers, additional requirements | quickly implemented by most HTTP/1.0 browsers, additional requirements | |||
| were placed on all HTTP/1.1 requests in order to ensure complete | were placed on all HTTP/1.1 requests in order to ensure complete | |||
| adoption. At the time of this writing, most HTTP-based services | adoption. At the time of this writing, most HTTP-based services | |||
| are dependent upon the Host header field for targeting requests. | are dependent upon the Host header field for targeting requests. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="compatibility.with.http.1.0.persistent.connections" | <section anchor="compatibility.with.http.1.0.persistent.connections" | |||
| title="Keep-Alive Connections"> | title="Keep-Alive Connections"> | |||
| skipping to change at line 2961 ¶ | skipping to change at line 2708 ¶ | |||
| One attempted solution was the introduction of a Proxy-Connection header | One attempted solution was the introduction of a Proxy-Connection header | |||
| field, targeted specifically at proxies. In practice, this was also | field, targeted specifically at proxies. In practice, this was also | |||
| unworkable, because proxies are often deployed in multiple layers, bringing | unworkable, because proxies are often deployed in multiple layers, bringing | |||
| about the same problem discussed above. | about the same problem discussed above. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| As a result, clients are encouraged not to send the Proxy-Connection header | As a result, clients are encouraged not to send the Proxy-Connection header | |||
| field in any requests. | field in any requests. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Clients are also encouraged to consider the use of Connection: keep-alive | Clients are also encouraged to consider the use of "Connection: keep-alive" | |||
| in requests carefully; while they can enable persistent connections with | in requests carefully; while they can enable persistent connections with | |||
| HTTP/1.0 servers, clients using them will need to monitor the | HTTP/1.0 servers, clients using them will need to monitor the | |||
| connection for "hung" requests (which indicate that the client ought to stop | connection for "hung" requests (which indicate that the client ought to stop | |||
| sending the header field), and this mechanism ought not be used by clients | sending the header field), and this mechanism ought not be used by clients | |||
| at all when a proxy is being used. | at all when a proxy is being used. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="introduction.of.transfer-encoding" | <section anchor="introduction.of.transfer-encoding" | |||
| title="Introduction of Transfer-Encoding"> | title="Introduction of Transfer-Encoding"> | |||
| <t> | <t> | |||
| skipping to change at line 2998 ¶ | skipping to change at line 2745 ¶ | |||
| Bare CRs have been prohibited outside of content. | Bare CRs have been prohibited outside of content. | |||
| (<xref target="message.parsing"/>) | (<xref target="message.parsing"/>) | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The ABNF definition of <xref target="authority-form" format="none">authority- form</xref> has changed from the | The ABNF definition of <xref target="authority-form" format="none">authority- form</xref> has changed from the | |||
| more general authority component of a URI (in which port is optional) to | more general authority component of a URI (in which port is optional) to | |||
| the specific host:port format that is required by CONNECT. | the specific host:port format that is required by CONNECT. | |||
| (<xref target="authority-form"/>) | (<xref target="authority-form"/>) | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Required recipients to avoid smuggling/splitting attacks when processing an | Recipients are required to avoid smuggling/splitting attacks when processing an | |||
| ambiguous message framing. | ambiguous message framing. | |||
| (<xref target="field.transfer-encoding"/>) | (<xref target="field.transfer-encoding"/>) | |||
| </t> | </t> | |||
| <t> | <t> | |||
| In the ABNF for chunked extensions, re-introduced (bad) whitespace around | In the ABNF for chunked extensions, (bad) whitespace around | |||
| ";" and "=". Whitespace was removed | ";" and "=" has been reintroduced. Whitespace was removed | |||
| in <xref target="RFC7230"/>, but that change was found to break existing | in <xref target="RFC7230"/>, but that change was found to break existing | |||
| implementations (see <xref target="Err4667"/>). | implementations. (<xref target="chunked.extension"/>) | |||
| (<xref target="chunked.extension"/>) | ||||
| </t> | </t> | |||
| <t> | <t> | |||
| Trailer field semantics now transcend the specifics of chunked encoding. | Trailer field semantics now transcend the specifics of chunked transfer codin g. | |||
| The decoding algorithm for chunked (<xref target="decoding.chunked"/>) has | The decoding algorithm for chunked (<xref target="decoding.chunked"/>) has | |||
| been updated to encourage storage/forwarding of trailer fields separately | been updated to encourage storage/forwarding of trailer fields separately | |||
| from the header section, to only allow merging into the header section if | from the header section, to only allow merging into the header section if | |||
| the recipient knows the corresponding field definition permits and defines | the recipient knows the corresponding field definition permits and defines | |||
| how to merge, and otherwise to discard the trailer fields instead of | 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 | 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. | consistent with the header section and more distinct from a body part. | |||
| (<xref target="chunked.trailer.section"/>) | (<xref target="chunked.trailer.section"/>) | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Disallowed transfer coding parameters called "q" in order to avoid | Transfer coding parameters called "q" are disallowed 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. | |||
| (<xref target="transfer.coding.registry"/>) | (<xref target="transfer.coding.registry"/>) | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="change.log" title="Change Log"> | ||||
| <t>This section is to be removed before publishing as an RFC.</t> | ||||
| <section anchor="changes.since.publication.as.rfc" | ||||
| title="Between RFC7230 and draft 00"> | ||||
| <t> | ||||
| The changes were purely editorial: | ||||
| </t> | ||||
| <ul> | ||||
| <li>Change boilerplate and abstract to indicate the "draft" statu | ||||
| s, and update references to ancestor specifications.</li> | ||||
| <li>Adjust historical notes.</li> | ||||
| <li>Update links to sibling specifications.</li> | ||||
| <li>Replace sections listing changes from RFC 2616 by new empty s | ||||
| ections referring to RFC 723x.</li> | ||||
| <li>Remove acknowledgements specific to RFC 723x.</li> | ||||
| <li>Move "Acknowledgements" to the very end and make them unnumbe | ||||
| red.</li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="changes.since.00" title="Since draft-ietf-httpbis-mess | ||||
| aging-00"> | ||||
| <t> | ||||
| The changes in this draft are editorial, with respect to HTTP as a whole, | ||||
| to move all core HTTP semantics into <xref target="HTTP"/>: | ||||
| </t> | ||||
| <ul> | ||||
| <li>Moved introduction, architecture, conformance, and ABNF exten | ||||
| sions from | ||||
| <xref target="RFC7230" format="none">RFC 7230 (Messaging)</xref> to | ||||
| semantics <xref target="HTTP"/>.</li> | ||||
| <li>Moved discussion of MIME differences from RFC 7231 (Semantics | ||||
| ) to | ||||
| <xref target="differences.between.http.and.mime"/> | ||||
| since they mostly cover transforming 1.1 messages.</li> | ||||
| <li>Moved all extensibility tips, registration procedures, and re | ||||
| gistry | ||||
| tables from the IANA considerations to normative sections, reducing the | ||||
| IANA considerations to just instructions that will be removed prior to | ||||
| publication as an RFC.</li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="changes.since.01" title="Since draft-ietf-httpbis-mess | ||||
| aging-01"> | ||||
| <ul> | ||||
| <li>Cite RFC 8126 instead of RFC 5226 (<eref target="https://gith | ||||
| ub.com/httpwg/http-core/issues/75" brackets="angle"/>)</li> | ||||
| <li>Resolved erratum 4779, no change needed here (<eref target="h | ||||
| ttps://github.com/httpwg/http-core/issues/87" brackets="angle"/>, <eref target=" | ||||
| https://www.rfc-editor.org/errata/eid4779" brackets="angle"/>)</li> | ||||
| <li>In <xref target="transfer.codings"/>, fixed prose claiming tr | ||||
| ansfer parameters allow bare names (<eref target="https://github.com/httpwg/http | ||||
| -core/issues/88" brackets="angle"/>, <eref target="https://www.rfc-editor.org/er | ||||
| rata/eid4839" brackets="angle"/>)</li> | ||||
| <li>Resolved erratum 4225, no change needed here (<eref target="h | ||||
| ttps://github.com/httpwg/http-core/issues/90" brackets="angle"/>, <eref target=" | ||||
| https://www.rfc-editor.org/errata/eid4225" brackets="angle"/>)</li> | ||||
| <li>Replace "response code" with "response status code" (<eref ta | ||||
| rget="https://github.com/httpwg/http-core/issues/94" brackets="angle"/>, <eref t | ||||
| arget="https://www.rfc-editor.org/errata/eid4050" brackets="angle"/>)</li> | ||||
| <li>In <xref target="persistent.connections"/>, clarify statement | ||||
| about HTTP/1.0 keep-alive (<eref target="https://github.com/httpwg/http-core/is | ||||
| sues/96" brackets="angle"/>, <eref target="https://www.rfc-editor.org/errata/eid | ||||
| 4205" brackets="angle"/>)</li> | ||||
| <li>In <xref target="chunked.extension"/>, re-introduce (bad) whi | ||||
| tespace around ";" and "=" (<eref target="https://github.com/httpwg/http-core/is | ||||
| sues/101" | ||||
| brackets="angle"/>, | ||||
| <eref target="https://www.rfc-editor.org/errata/eid4667" brackets="angle"/>, < | ||||
| eref target="https://www.rfc-editor.org/errata/eid4825" brackets="angle"/>)</li> | ||||
| <li>In <xref target="transfer.coding.registry"/>, state that tran | ||||
| sfer codings should not use parameters named "q" (<eref target="https://github.c | ||||
| om/httpwg/http-core/issues/15" brackets="angle"/>, <eref target="https://www.rfc | ||||
| -editor.org/errata/eid4683" brackets="angle"/>)</li> | ||||
| <li>In <xref target="transfer.codings"/>, mark coding name "trail | ||||
| ers" as reserved in the IANA registry (<eref target="https://github.com/httpwg/h | ||||
| ttp-core/issues/108" | ||||
| brackets="angle"/>)</li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="changes.since.02" title="Since draft-ietf-httpbis-mess | ||||
| aging-02"> | ||||
| <ul> | ||||
| <li>In <xref target="status.line"/>, explain why the reason phras | ||||
| e should be ignored by clients (<eref target="https://github.com/httpwg/http-cor | ||||
| e/issues/60" brackets="angle"/>).</li> | ||||
| <li>Add <xref target="associating.response.to.request"/> to expla | ||||
| in how request/response correlation is performed (<eref target="https://github.c | ||||
| om/httpwg/http-core/issues/145" | ||||
| brackets="angle"/>)</li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="changes.since.03" title="Since draft-ietf-httpbis-mess | ||||
| aging-03"> | ||||
| <ul> | ||||
| <li>In <xref target="associating.response.to.request"/>, caution | ||||
| against treating data on a connection as part of a not-yet-issued request (<eref | ||||
| target="https://github.com/httpwg/http-core/issues/26" brackets="angle"/>)</li> | ||||
| <li>In <xref target="transfer.codings"/>, remove the predefined c | ||||
| odings from the ABNF and make it generic instead (<eref target="https://github.c | ||||
| om/httpwg/http-core/issues/66" brackets="angle"/>)</li> | ||||
| <li>Use RFC 7405 ABNF notation for case-sensitive string constant | ||||
| s (<eref target="https://github.com/httpwg/http-core/issues/133" | ||||
| brackets="angle"/>)</li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="changes.since.04" title="Since draft-ietf-httpbis-mess | ||||
| aging-04"> | ||||
| <ul> | ||||
| <li>In <xref target="HTTP" section="7.8"/>, clarify that protocol | ||||
| -name is to be matched case-insensitively (<eref target="https://github.com/http | ||||
| wg/http-core/issues/8" brackets="angle"/>)</li> | ||||
| <li>In <xref target="line.folding"/>, add leading optional whites | ||||
| pace to obs-fold ABNF (<eref target="https://github.com/httpwg/http-core/issues/ | ||||
| 19" brackets="angle"/>, <eref target="https://www.rfc-editor.org/errata/eid4189" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In <xref target="status.line"/>, add clarifications about emp | ||||
| ty reason phrases (<eref target="https://github.com/httpwg/http-core/issues/197" | ||||
| brackets="angle"/>)</li> | ||||
| <li>Move discussion of retries from <xref target="persistent.retr | ||||
| ying.requests"/> into <xref target="HTTP"/> (<eref target="https://github.com/ht | ||||
| tpwg/http-core/issues/230" | ||||
| brackets="angle"/>)</li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="changes.since.05" title="Since draft-ietf-httpbis-mess | ||||
| aging-05"> | ||||
| <ul> | ||||
| <li>In <xref target="chunked.trailer.section"/>, 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 (<eref target="https://github.com/h | ||||
| ttpwg/http-core/issues/16" brackets="angle"/>)</li> | ||||
| <li>In <xref target="message.format"/> and related Sections, move | ||||
| the trailing CRLF from the line grammars into the message format (<eref target= | ||||
| "https://github.com/httpwg/http-core/issues/62" brackets="angle"/>)</li> | ||||
| <li>Moved <xref target="http.version"/> down (<eref target="https | ||||
| ://github.com/httpwg/http-core/issues/68" brackets="angle"/>)</li> | ||||
| <li>In <xref target="HTTP" section="7.8"/>, use 'websocket' inste | ||||
| ad of 'HTTP/2.0' in examples (<eref target="https://github.com/httpwg/http-core/ | ||||
| issues/112" | ||||
| brackets="angle"/>)</li> | ||||
| <li>Move version non-specific text from <xref target="message.bod | ||||
| y"/> into semantics as "payload" (<eref target="https://github.com/httpwg/http-c | ||||
| ore/issues/159" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In <xref target="tls.connection.closure"/>, add text from RFC | ||||
| 2818 (<eref target="https://github.com/httpwg/http-core/issues/236" | ||||
| brackets="angle"/>)</li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="changes.since.06" title="Since draft-ietf-httpbis-mess | ||||
| aging-06"> | ||||
| <ul> | ||||
| <li>In <xref target="alpn.registration"/>, update the ALPN protoc | ||||
| ol ID for HTTP/1.1 (<eref target="https://github.com/httpwg/http-core/issues/49" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In <xref target="header.field.syntax"/>, align with updates t | ||||
| o field terminology in semantics (<eref target="https://github.com/httpwg/http-c | ||||
| ore/issues/111" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In <xref target="HTTP" section="7.6.1"/>, clarify that new co | ||||
| nnection options indeed need to be registered (<eref target="https://github.com/ | ||||
| httpwg/http-core/issues/285" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In <xref target="requirements.notation"/>, reference RFC 8174 | ||||
| as well (<eref target="https://github.com/httpwg/http-core/issues/303" | ||||
| brackets="angle"/>)</li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="changes.since.07" title="Since draft-ietf-httpbis-mess | ||||
| aging-07"> | ||||
| <ul> | ||||
| <li>Move TE: trailers into <xref target="HTTP"/> (<eref target="h | ||||
| ttps://github.com/httpwg/http-core/issues/18" brackets="angle"/>)</li> | ||||
| <li>In <xref target="message.body.length"/>, adjust requirements | ||||
| for handling multiple content-length values (<eref target="https://github.com/ht | ||||
| tpwg/http-core/issues/59" brackets="angle"/>)</li> | ||||
| <li>Throughout, replace "effective request URI" with "target URI" | ||||
| (<eref target="https://github.com/httpwg/http-core/issues/259" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In <xref target="field.transfer-encoding"/>, don't claim Tran | ||||
| sfer-Encoding is supported by HTTP/2 or later (<eref target="https://github.com/ | ||||
| httpwg/http-core/issues/297" | ||||
| brackets="angle"/>)</li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="changes.since.08" title="Since draft-ietf-httpbis-mess | ||||
| aging-08"> | ||||
| <ul> | ||||
| <li>In <xref target="message.parsing"/>, disallow bare CRs (<eref | ||||
| target="https://github.com/httpwg/http-core/issues/31" brackets="angle"/>)</li> | ||||
| <li> | ||||
| <xref target="collected.abnf"/> now uses the sender variant of | ||||
| the "#" list expansion (<eref target="https://github.com/httpwg/http-core/issue | ||||
| s/192" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In <xref target="header.field.syntax"/>, adjust IANA "Close" | ||||
| entry for new registry format (<eref target="https://github.com/httpwg/http-core | ||||
| /issues/273" | ||||
| brackets="angle"/>)</li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="changes.since.09" title="Since draft-ietf-httpbis-mess | ||||
| aging-09"> | ||||
| <ul> | ||||
| <li>Switch to xml2rfc v3 mode for draft generation (<eref target= | ||||
| "https://github.com/httpwg/http-core/issues/394" | ||||
| brackets="angle"/>)</li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="changes.since.10" title="Since draft-ietf-httpbis-mess | ||||
| aging-10"> | ||||
| <ul> | ||||
| <li>In <xref target="message.body.length"/>, note that TCP half-c | ||||
| lose does not delimit a request; talk about corresponding server-side behaviour | ||||
| in <xref target="persistent.tear-down"/> (<eref target="https://github.com/httpw | ||||
| g/http-core/issues/22" brackets="angle"/>)</li> | ||||
| <li>Moved requirements specific to HTTP/1.1 from <xref target="HT | ||||
| TP"/> into <xref target="request.target"/> (<eref target="https://github.com/htt | ||||
| pwg/http-core/issues/182" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In <xref target="field.transfer-encoding"/> (<xref target="fi | ||||
| eld.transfer-encoding" format="none">Transfer-Encoding</xref>), adjust ABNF to a | ||||
| llow empty lists (<eref target="https://github.com/httpwg/http-core/issues/210" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In <xref target="tls.connection.initiation"/>, add text from | ||||
| RFC 2818 (<eref target="https://github.com/httpwg/http-core/issues/236" | ||||
| brackets="angle"/>)</li> | ||||
| <li>Moved definitions of "TE" and "Upgrade" into <xref target="HT | ||||
| TP"/> (<eref target="https://github.com/httpwg/http-core/issues/392" | ||||
| brackets="angle"/>)</li> | ||||
| <li>Moved definition of "Connection" into <xref target="HTTP"/> ( | ||||
| <eref target="https://github.com/httpwg/http-core/issues/407" | ||||
| brackets="angle"/>)</li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="changes.since.11" title="Since draft-ietf-httpbis-mess | ||||
| aging-11"> | ||||
| <ul> | ||||
| <li>Move IANA Upgrade Token Registry instructions to <xref target | ||||
| ="HTTP"/> (<eref target="https://github.com/httpwg/http-core/issues/450" | ||||
| brackets="angle"/>)</li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="changes.since.12" title="Since draft-ietf-httpbis-mess | ||||
| aging-12"> | ||||
| <ul> | ||||
| <li>Moved content of history appendix to Semantics (<eref target= | ||||
| "https://github.com/httpwg/http-core/issues/451" | ||||
| brackets="angle"/>)</li> | ||||
| <li>Moved note about "close" being reserved as field name to <xre | ||||
| f target="persistent.connections"/> (<eref target="https://github.com/httpwg/htt | ||||
| p-core/issues/500" | ||||
| brackets="angle"/>)</li> | ||||
| <li>Moved table of transfer codings into <xref target="transfer.c | ||||
| oding.registration"/> (<eref target="https://github.com/httpwg/http-core/issues/ | ||||
| 506" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In Section 13.2, updated the URI for the <xref target="Linhar | ||||
| t"/> paper (<eref target="https://github.com/httpwg/http-core/issues/517" | ||||
| brackets="angle"/>)</li> | ||||
| <li>Changed document title to just "HTTP/1.1" (<eref target="http | ||||
| s://github.com/httpwg/http-core/issues/524" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In <xref target="transfer.codings"/>, moved transfer-coding A | ||||
| BNF to <xref target="HTTP" section="10.1.4"/> (<eref target="https://github.com/ | ||||
| httpwg/http-core/issues/531" | ||||
| brackets="angle"/>)</li> | ||||
| <li>Changed to using "payload data" when defining requirements ab | ||||
| out the data being conveyed within a message, instead of the terms "payload body | ||||
| " or "response body" or "representation body", since they often get confused wit | ||||
| h the HTTP/1.1 message body (which includes transfer coding) (<eref target="http | ||||
| s://github.com/httpwg/http-core/issues/553" | ||||
| brackets="angle"/>)</li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="changes.since.13" title="Since draft-ietf-httpbis-mess | ||||
| aging-13"> | ||||
| <ul> | ||||
| <li>In <xref target="message.body.length"/>, clarify that a messa | ||||
| ge needs to be checked for both Content-Length and Transfer-Encoding, before pro | ||||
| cessing Transfer-Encoding, and that ought to be treated as an error, but an inte | ||||
| rmediary can choose to forward the message downstream after removing the Content | ||||
| -Length and processing the Transfer-Encoding (<eref target="https://github.com/h | ||||
| ttpwg/http-core/issues/617" | ||||
| brackets="angle"/>)</li> | ||||
| <li>Changed to using "content" instead of "payload" or "payload d | ||||
| ata" to avoid confusion with the payload of version-specific messaging frames (< | ||||
| eref target="https://github.com/httpwg/http-core/issues/654" | ||||
| brackets="angle"/>)</li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="changes.since.14" title="Since draft-ietf-httpbis-mess | ||||
| aging-14"> | ||||
| <ul> | ||||
| <li>In <xref target="persistent.tear-down"/>, define the close co | ||||
| nnection option, since its definition was removed from the Connection header fie | ||||
| ld for being specific to 1.1 (<eref target="https://github.com/httpwg/http-core/ | ||||
| issues/678" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In <xref target="reconstructing.target.uri"/>, clarify how th | ||||
| e target URI is reconstructed when the request-target is not in absolute-form an | ||||
| d highlight risk in selecting a default host (<eref target="https://github.com/h | ||||
| ttpwg/http-core/issues/722" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In <xref target="chunked.encoding"/>, clarify large chunk han | ||||
| dling issues (<eref target="https://github.com/httpwg/http-core/issues/749" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In <xref target="message.parsing"/>, explicitly close the con | ||||
| nection after sending a 400 (<eref target="https://github.com/httpwg/http-core/i | ||||
| ssues/750" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In <xref target="http.version"/>, refine version requirements | ||||
| for intermediaries (<eref target="https://github.com/httpwg/http-core/issues/75 | ||||
| 1" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In <xref target="decoding.chunked"/>, don't remove the Traile | ||||
| r header field (<eref target="https://github.com/httpwg/http-core/issues/793" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In <xref target="authority-form"/>, changed the ABNF definiti | ||||
| on of authority-form from the authority component (in which port is optional) to | ||||
| the host:port format that has always been required by CONNECT (<eref target="ht | ||||
| tps://github.com/httpwg/http-core/issues/806" | ||||
| brackets="angle"/>)</li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="changes.since.15" title="Since draft-ietf-httpbis-mess | ||||
| aging-15"> | ||||
| <ul> | ||||
| <li>None.</li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="changes.since.16" title="Since draft-ietf-httpbis-mess | ||||
| aging-16"> | ||||
| <t> | ||||
| This draft addresses mostly editorial issues raised during or past IETF | ||||
| Last Call; see <eref target="https://github.com/httpwg/http-core/issues?q=labe | ||||
| l%3Ah1-messaging+created%3A%3E2021-05-26" | ||||
| brackets="angle"/> | ||||
| for a summary. | ||||
| </t> | ||||
| <t> | ||||
| Furthermore: | ||||
| </t> | ||||
| <ul> | ||||
| <li>In <xref target="field.transfer-encoding"/>, require recipien | ||||
| ts to avoid smuggling/splitting attacks when processing an ambiguous message fra | ||||
| ming (<eref target="https://github.com/httpwg/http-core/issues/879" | ||||
| brackets="angle"/>)</li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="changes.since.17" title="Since draft-ietf-httpbis-mess | ||||
| aging-17"> | ||||
| <ul> | ||||
| <li>In <xref target="status.line"/>, rephrase text about status c | ||||
| ode definitions in <xref target="HTTP"/> (<eref target="https://github.com/httpw | ||||
| g/http-core/issues/915" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In <xref target="associating.response.to.request"/>, clarify | ||||
| how to match responses to requests (<eref target="https://github.com/httpwg/http | ||||
| -core/issues/915" | ||||
| brackets="angle"/>)</li> | ||||
| <li>Made reference to <xref target="RFC5322"/> normative, as it i | ||||
| s referenced from the ABNF (for "From" header field) (<eref target="https://gith | ||||
| ub.com/httpwg/http-core/issues/915" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In <xref target="line.folding"/>, include text about message/ | ||||
| http that previously was in <xref target="HTTP"/> (<eref target="https://github. | ||||
| com/httpwg/http-core/issues/923" | ||||
| brackets="angle"/>)</li> | ||||
| <li>Throughout, disambiguate "selected representation" and "selec | ||||
| ted response" (now "chosen response") (<eref target="https://github.com/httpwg/h | ||||
| ttp-core/issues/958" | ||||
| brackets="angle"/>)</li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="changes.since.18" title="Since draft-ietf-httpbis-mess | ||||
| aging-18"> | ||||
| <ul> | ||||
| <li>Improve a few crossrefs into <xref target="HTTP"/> (<eref tar | ||||
| get="https://github.com/httpwg/http-core/issues/966" | ||||
| brackets="angle"/>)</li> | ||||
| <li>In <xref target="chunked.trailer.section"/>, improve readabil | ||||
| ity of formerly overlong sentence (<eref target="https://github.com/httpwg/http- | ||||
| core/issues/966" | ||||
| brackets="angle"/>)</li> | ||||
| <li>Slightly rephrase <xref target="tls.connection.closure"/> (<e | ||||
| ref target="https://github.com/httpwg/http-core/pull/972" brackets="angle"/>)</l | ||||
| i> | ||||
| </ul> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="acks" numbered="false" title="Acknowledgements"> | <section anchor="acks" numbered="false" title="Acknowledgements"> | |||
| <t> | <t> | |||
| See Appendix "Acknowledgements" of <xref target="HTTP"/>. | See Appendix "Acknowledgements" of <xref target="HTTP"/>, which applies to thi s document as well. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </back> | </back> | |||
| </rfc> | </rfc> | |||
| End of changes. 208 change blocks. | ||||
| 1028 lines changed or deleted | 354 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||