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/ |