co-Edited by Lem computers d.o.o.
© 2000-2005
Fielding, et al. Standards
Track [Page 163]
RFC 2616
HTTP/1.1
June 1999
19 Appendices
19.1 Internet Media Type message/http and application/http
In addition to defining the
HTTP/1.1 protocol, this document serves
as the specification for the
Internet media type "message/http" and
"application/http". The
message/http type can be used to enclose a
single HTTP request or response
message, provided that it obeys the
MIME restrictions for all
"message" types regarding line length and
encodings. The application/http
type can be used to enclose a
pipeline of one or more HTTP request
or response messages (not
intermixed). The following is to
be registered with IANA [17].
Media Type name: message
Media subtype name: http
Required parameters: none
Optional parameters: version, msgtype
version: The HTTP-Version
number of the enclosed message
(e.g.,
"1.1"). If not present, the version can be
determined from the
first line of the body.
msgtype: The message type --
"request" or "response". If not
present, the type
can be determined from the first
line of the body.
Encoding considerations: only
"7bit", "8bit", or "binary" are
permitted
Security considerations: none
Media Type name: application
Media subtype name: http
Required parameters: none
Optional parameters: version, msgtype
version: The HTTP-Version
number of the enclosed messages
(e.g., "1.1"). If not present, the
version can be
determined from the
first line of the body.
msgtype: The message type --
"request" or "response". If not
present, the type
can be determined from the first
line of the body.
Encoding considerations: HTTP
messages enclosed by this type
are in
"binary" format; use of an appropriate
Content-Transfer-Encoding is required when
transmitted via E-mail.
Security considerations: none
Fielding, et al. Standards
Track [Page 164]
RFC 2616
HTTP/1.1
June 1999
19.2 Internet Media Type multipart/byteranges
When an HTTP 206 (Partial Content)
response message includes the
content of multiple ranges (a
response to a request for multiple
non-overlapping ranges), these are
transmitted as a multipart
message-body. The media type for
this purpose is called
"multipart/byteranges".
The multipart/byteranges media
type includes two or more parts, each
with its own Content-Type and
Content-Range fields. The required
boundary parameter specifies the
boundary string used to separate
each body-part.
Media Type name: multipart
Media subtype name: byteranges
Required parameters: boundary
Optional parameters: none
Encoding considerations: only
"7bit", "8bit", or "binary" are
permitted
Security considerations: none
For example:
HTTP/1.1 206 Partial Content
Date: Wed, 15 Nov 1995 06:25:24
GMT
Last-Modified: Wed, 15 Nov 1995
04:58:08 GMT
Content-type: multipart/byteranges;
boundary=THIS_STRING_SEPARATES
--THIS_STRING_SEPARATES
Content-type: application/pdf
Content-range: bytes 500-999/8000
...the first range...
--THIS_STRING_SEPARATES
Content-type: application/pdf
Content-range: bytes
7000-7999/8000
...the second range
--THIS_STRING_SEPARATES--
Notes:
1) Additional CRLFs may precede
the first boundary string in the
entity.
Fielding, et al. Standards
Track [Page 165]
RFC 2616
HTTP/1.1
June 1999
2) Although RFC 2046 [40]
permits the boundary string to be
quoted, some existing
implementations handle a quoted boundary
string incorrectly.
3) A number of browsers and
servers were coded to an early draft
of the byteranges
specification to use a media type of
multipart/x-byteranges,
which is almost, but not quite
compatible with the version
documented in HTTP/1.1.
Although this document specifies
the requirements for the generation
of HTTP/1.1 messages, not all
applications will be correct in their
implementation. We therefore
recommend that operational applications
be tolerant of deviations whenever
those deviations can be
interpreted unambiguously.
Clients SHOULD be tolerant in
parsing the Status-Line and servers
tolerant when parsing the
Request-Line. In particular, they SHOULD
accept any amount of SP or HT
characters between fields, even though
only a single SP is required.
The line terminator for
message-header fields is the sequence CRLF.
However, we recommend that
applications, when parsing such headers,
recognize a single LF as a line
terminator and ignore the leading CR.
The character set of an
entity-body SHOULD be labeled as the lowest
common denominator of the
character codes used within that body, with
the exception that not labeling
the entity is preferred over labeling
the entity with the labels
US-ASCII or ISO-8859-1. See section 3.7.1
and 3.4.1.
Additional rules for requirements
on parsing and encoding of dates
and other potential problems with
date encodings include:
- HTTP/1.1 clients and caches
SHOULD assume that an RFC-850 date
which appears to be more than
50 years in the future is in fact
in the past (this helps solve
the "year 2000" problem).
- An HTTP/1.1 implementation
MAY internally represent a parsed
Expires date as earlier than
the proper value, but MUST NOT
internally represent a parsed
Expires date as later than the
proper value.
- All expiration-related
calculations MUST be done in GMT. The
local time zone MUST NOT
influence the calculation or comparison
of an age or expiration time.
Fielding, et al. Standards
Track [Page 166]
RFC 2616
HTTP/1.1
June 1999
- If an HTTP header incorrectly
carries a date value with a time
zone other than GMT, it MUST
be converted into GMT using the
most conservative possible
conversion.
19.4 Differences Between HTTP Entities and RFC 2045 Entities
HTTP/1.1 uses many of the
constructs defined for Internet Mail (RFC
822 [9]) and the Multipurpose
Internet Mail Extensions (MIME [7]) to
allow entities to be transmitted
in an open variety of
representations and with
extensible mechanisms. However, RFC 2045
discusses mail, and HTTP has a few
features that are different from
those described in RFC 2045. These
differences were carefully chosen
to optimize performance over
binary connections, to allow greater
freedom in the use of new media
types, to make date comparisons
easier, and to acknowledge the
practice of some early HTTP servers
and clients.
This appendix describes specific
areas where HTTP differs from RFC
2045. Proxies and gateways to
strict MIME environments SHOULD be
aware of these differences and
provide the appropriate conversions
where necessary. Proxies and
gateways from MIME environments to HTTP
also need to be aware of the
differences because some conversions
might be required.
HTTP is not a MIME-compliant protocol.
However, HTTP/1.1 messages MAY
include a single MIME-Version
general-header field to indicate what
version of the MIME protocol was
used to construct the message. Use
of the MIME-Version header field
indicates that the message is in
full compliance with the MIME
protocol (as defined in RFC 2045[7]).
Proxies/gateways are responsible
for ensuring full compliance (where
possible) when exporting HTTP
messages to strict MIME environments.
MIME-Version = "MIME-Version" ":" 1*DIGIT
"." 1*DIGIT
MIME version "1.0" is
the default for use in HTTP/1.1. However,
HTTP/1.1 message parsing and
semantics are defined by this document
and not the MIME specification.
19.4.2 Conversion to Canonical Form
RFC 2045 [7] requires that an
Internet mail entity be converted to
canonical form prior to being
transferred, as described in section 4
of RFC 2049 [48]. Section 3.7.1 of
this document describes the forms
allowed for subtypes of the
"text" media type when transmitted over
HTTP. RFC 2046 requires that
content with a type of "text" represent
line breaks as CRLF and forbids
the use of CR or LF outside of line
Fielding, et al. Standards
Track [Page 167]
RFC 2616 HTTP/1.1 June 1999
break sequences. HTTP allows CRLF,
bare CR, and bare LF to indicate a
line break within text content
when a message is transmitted over
HTTP.
Where it is possible, a proxy or gateway
from HTTP to a strict MIME
environment SHOULD translate all
line breaks within the text media
types described in section 3.7.1
of this document to the RFC 2049
canonical form of CRLF. Note,
however, that this might be complicated
by the presence of a
Content-Encoding and by the fact that HTTP
allows the use of some character
sets which do not use octets 13 and
10 to represent CR and LF, as is
the case for some multi-byte
character sets.
Implementors should note that
conversion will break any cryptographic
checksums applied to the original
content unless the original content
is already in canonical form.
Therefore, the canonical form is
recommended for any content that
uses such checksums in HTTP.
19.4.3 Conversion of Date Formats
HTTP/1.1 uses a restricted set of
date formats (section 3.3.1) to
simplify the process of date
comparison. Proxies and gateways from
other protocols SHOULD ensure that
any Date header field present in a
message conforms to one of the
HTTP/1.1 formats and rewrite the date
if necessary.
19.4.4 Introduction of Content-Encoding
RFC 2045 does not include any
concept equivalent to HTTP/1.1's
Content-Encoding header field.
Since this acts as a modifier on the
media type, proxies and gateways
from HTTP to MIME-compliant
protocols MUST either change the
value of the Content-Type header
field or decode the entity-body
before forwarding the message. (Some
experimental applications of
Content-Type for Internet mail have used
a media-type parameter of
";conversions=<content-coding>" to perform
a function equivalent to
Content-Encoding. However, this parameter is
not part of RFC 2045.)
19.4.5 No Content-Transfer-Encoding
HTTP does not use the Content-Transfer-Encoding
(CTE) field of RFC
2045. Proxies and gateways from
MIME-compliant protocols to HTTP MUST
remove any non-identity CTE
("quoted-printable" or "base64") encoding
prior to delivering the response
message to an HTTP client.
Proxies and gateways from HTTP to
MIME-compliant protocols are
responsible for ensuring that the
message is in the correct format
and encoding for safe transport on
that protocol, where "safe
Fielding, et al. Standards
Track [Page 168]
RFC 2616
HTTP/1.1
June 1999
transport" is defined by the
limitations of the protocol being used.
Such a proxy or gateway SHOULD
label the data with an appropriate
Content-Transfer-Encoding if doing
so will improve the likelihood of
safe transport over the
destination protocol.
19.4.6 Introduction of Transfer-Encoding
HTTP/1.1 introduces the
Transfer-Encoding header field (section
14.41). Proxies/gateways MUST
remove any transfer-coding prior to
forwarding a message via a
MIME-compliant protocol.
A process for decoding the
"chunked" transfer-coding (section 3.6)
can be represented in pseudo-code
as:
length := 0
read chunk-size, chunk-extension
(if any) and CRLF
while (chunk-size > 0) {
read chunk-data and CRLF
append chunk-data to
entity-body
length := length +
chunk-size
read chunk-size and CRLF
}
read entity-header
while (entity-header not empty) {
append entity-header to
existing header fields
read entity-header
}
Content-Length := length
Remove "chunked"
from Transfer-Encoding
19.4.7 MHTML and Line Length Limitations
HTTP implementations which share
code with MHTML [45] implementations
need to be aware of MIME line
length limitations. Since HTTP does not
have this limitation, HTTP does
not fold long lines. MHTML messages
being transported by HTTP follow
all conventions of MHTML, including
line length limitations and
folding, canonicalization, etc., since
HTTP transports all message-bodies
as payload (see section 3.7.2) and
does not interpret the content or
any MIME header lines that might be
contained therein.
RFC 1945 and RFC 2068 document
protocol elements used by some
existing HTTP implementations, but
not consistently and correctly
across most HTTP/1.1 applications.
Implementors are advised to be
aware of these features, but
cannot rely upon their presence in, or
interoperability with, other
HTTP/1.1 applications. Some of these
Fielding, et al. Standards
Track [Page 169]
RFC 2616
HTTP/1.1 June 1999
describe proposed experimental
features, and some describe features
that experimental deployment found
lacking that are now addressed in
the base HTTP/1.1 specification.
A number of other headers, such as
Content-Disposition and Title,
from SMTP and MIME are also often
implemented (see RFC 2076 [37]).
The Content-Disposition
response-header field has been proposed as a
means for the origin server to
suggest a default filename if the user
requests that the content is saved
to a file. This usage is derived
from the definition of
Content-Disposition in RFC 1806 [35].
content-disposition =
"Content-Disposition" ":"
disposition-type *( ";" disposition-parm )
disposition-type =
"attachment" | disp-extension-token
disposition-parm =
filename-parm | disp-extension-parm
filename-parm =
"filename" "=" quoted-string
disp-extension-token = token
disp-extension-parm = token
"=" ( token | quoted-string )
An example is
Content-Disposition:
attachment; filename="fname.ext"
The receiving user agent SHOULD
NOT respect any directory path
information present in the filename-parm
parameter, which is the only
parameter believed to apply to
HTTP implementations at this time. The
filename SHOULD be treated as a
terminal component only.
If this header is used in a
response with the application/octet-
stream content-type, the implied
suggestion is that the user agent
should not display the response,
but directly enter a `save response
as...' dialog.
See section 15.5 for
Content-Disposition security issues.
19.6 Compatibility with Previous Versions
It is beyond the scope of a protocol specification to mandate
compliance with previous versions.
HTTP/1.1 was deliberately
designed, however, to make
supporting previous versions easy. It is
worth noting that, at the time of
composing this specification
(1996), we would expect commercial
HTTP/1.1 servers to:
- recognize the format of the
Request-Line for HTTP/0.9, 1.0, and
1.1 requests;
Fielding, et al. Standards
Track [Page 170]
RFC 2616 HTTP/1.1 June 1999
- understand any valid request
in the format of HTTP/0.9, 1.0, or
1.1;
- respond appropriately with a
message in the same major version
used by the client.
And we would expect HTTP/1.1
clients to:
- recognize the format of the
Status-Line for HTTP/1.0 and 1.1
responses;
- understand any valid response
in the format of HTTP/0.9, 1.0, or
1.1.
For most implementations of
HTTP/1.0, each connection is established
by the client prior to the request
and closed by the server after
sending the response. Some
implementations implement the Keep-Alive
version of persistent connections
described in section 19.7.1 of RFC
2068 [33].
This section summarizes major
differences between versions HTTP/1.0
and HTTP/1.1.
19.6.1.1 Changes to Simplify Multi-homed Web Servers and Conserve IP
Addresses
The requirements that clients and servers
support the Host request-
header, report an error if the
Host request-header (section 14.23) is
missing from an HTTP/1.1 request,
and accept absolute URIs (section
5.1.2) are among the most
important changes defined by this
specification.
Older HTTP/1.0 clients assumed a
one-to-one relationship of IP
addresses and servers; there was
no other established mechanism for
distinguishing the intended server
of a request than the IP address
to which that request was
directed. The changes outlined above will
allow the Internet, once older
HTTP clients are no longer common, to
support multiple Web sites from a
single IP address, greatly
simplifying large operational Web
servers, where allocation of many
IP addresses to a single host has
created serious problems. The
Internet will also be able to
recover the IP addresses that have been
allocated for the sole purpose of
allowing special-purpose domain
names to be used in root-level
HTTP URLs. Given the rate of growth of
the Web, and the number of servers
already deployed, it is extremely
Fielding, et al. Standards
Track [Page 171]
RFC 2616
HTTP/1.1
June 1999
important that all implementations
of HTTP (including updates to
existing HTTP/1.0 applications)
correctly implement these
requirements:
- Both clients and servers MUST
support the Host request-header.
- A client that sends an
HTTP/1.1 request MUST send a Host header.
- Servers MUST report a 400
(Bad Request) error if an HTTP/1.1
request does not include a
Host request-header.
- Servers MUST accept absolute
URIs.
19.6.2 Compatibility with HTTP/1.0 Persistent Connections
Some clients and servers might
wish to be compatible with some
previous implementations of
persistent connections in HTTP/1.0
clients and servers. Persistent
connections in HTTP/1.0 are
explicitly negotiated as they are
not the default behavior. HTTP/1.0
experimental implementations of
persistent connections are faulty,
and the new facilities in HTTP/1.1
are designed to rectify these
problems. The problem was that
some existing 1.0 clients may be
sending Keep-Alive to a proxy server
that doesn't understand
Connection, which would then
erroneously forward it to the next
inbound server, which would
establish the Keep-Alive connection and
result in a hung HTTP/1.0 proxy
waiting for the close on the
response. The result is that
HTTP/1.0 clients must be prevented from
using Keep-Alive when talking to
proxies.
However, talking to proxies is the
most important use of persistent
connections, so that prohibition
is clearly unacceptable. Therefore,
we need some other mechanism for
indicating a persistent connection
is desired, which is safe to use
even when talking to an old proxy
that ignores Connection.
Persistent connections are the default for
HTTP/1.1 messages; we introduce a
new keyword (Connection: close) for
declaring non-persistence. See
section 14.10.
The original HTTP/1.0 form of
persistent connections (the Connection:
Keep-Alive and Keep-Alive header)
is documented in RFC 2068. [33]
This specification has been carefully audited
to correct and
disambiguate key word usage; RFC
2068 had many problems in respect to
the conventions laid out in RFC
2119 [34].
Clarified which error code should
be used for inbound server failures
(e.g. DNS failures). (Section 10.5.5).
Fielding, et al. Standards
Track [Page 172]
RFC 2616
HTTP/1.1
June 1999
CREATE had a race that required an
Etag be sent when a resource is
first created. (Section 10.2.2).
Content-Base was deleted from the
specification: it was not
implemented widely, and there is
no simple, safe way to introduce it
without a robust extension
mechanism. In addition, it is used in a
similar, but not identical fashion
in MHTML [45].
Transfer-coding and message
lengths all interact in ways that
required fixing exactly when
chunked encoding is used (to allow for
transfer encoding that may not be
self delimiting); it was important
to straighten out exactly how
message lengths are computed. (Sections
3.6, 4.4, 7.2.2, 13.5.2, 14.13,
14.16)
A content-coding of
"identity" was introduced, to solve problems
discovered in caching. (section
3.5)
Quality Values of zero should
indicate that "I don't want something"
to allow clients to refuse a
representation. (Section 3.9)
The use and interpretation of HTTP
version numbers has been clarified
by RFC 2145. Require proxies to
upgrade requests to highest protocol
version they support to deal with
problems discovered in HTTP/1.0
implementations (Section 3.1)
Charset wildcarding is introduced
to avoid explosion of character set
names in accept headers. (Section
14.2)
A case was missed in the
Cache-Control model of HTTP/1.1; s-maxage
was introduced to add this missing
case. (Sections 13.4, 14.8, 14.9,
14.9.3)
The Cache-Control: max-age
directive was not properly defined for
responses. (Section 14.9.3)
There are situations where a
server (especially a proxy) does not
know the full length of a response
but is capable of serving a
byterange request. We therefore
need a mechanism to allow byteranges
with a content-range not
indicating the full length of the message.
(Section 14.16)
Range request responses would
become very verbose if all meta-data
were always returned; by allowing
the server to only send needed
headers in a 206 response, this
problem can be avoided. (Section
10.2.7, 13.5.3, and 14.27)
Fielding, et al. Standards
Track [Page 173]
RFC 2616
HTTP/1.1
June 1999
Fix problem with unsatisfiable
range requests; there are two cases:
syntactic problems, and range
doesn't exist in the document. The 416
status code was needed to resolve
this ambiguity needed to indicate
an error for a byte range request
that falls outside of the actual
contents of a document. (Section
10.4.17, 14.16)
Rewrite of message transmission
requirements to make it much harder
for implementors to get it wrong,
as the consequences of errors here
can have significant impact on the
Internet, and to deal with the
following problems:
1. Changing "HTTP/1.1 or
later" to "HTTP/1.1", in contexts where
this was incorrectly placing
a requirement on the behavior of
an implementation of a
future version of HTTP/1.x
2. Made it clear that
user-agents should retry requests, not
"clients" in
general.
3. Converted requirements for
clients to ignore unexpected 100
(Continue) responses, and
for proxies to forward 100 responses,
into a general requirement
for 1xx responses.
4. Modified some TCP-specific
language, to make it clearer that
non-TCP transports are
possible for HTTP.
5. Require that the origin
server MUST NOT wait for the request
body before it sends a
required 100 (Continue) response.
6. Allow, rather than require,
a server to omit 100 (Continue) if
it has already seen some of
the request body.
7. Allow servers to defend
against denial-of-service attacks and
broken clients.
This change adds the Expect header
and 417 status code. The message
transmission requirements fixes
are in sections 8.2, 10.4.18,
8.1.2.2, 13.11, and 14.20.
Proxies should be able to add
Content-Length when appropriate.
(Section 13.5.2)
Clean up confusion between 403 and
404 responses. (Section 10.4.4,
10.4.5, and 10.4.11)
Warnings could be cached
incorrectly, or not updated appropriately.
(Section 13.1.2, 13.2.4, 13.5.2,
13.5.3, 14.9.3, and 14.46) Warning
also needed to be a general
header, as PUT or other methods may have
need for it in requests.
Fielding, et al. Standards
Track [Page 174]
RFC 2616
HTTP/1.1
June 1999
Transfer-coding had significant
problems, particularly with
interactions with chunked
encoding. The solution is that transfer-
codings become as full fledged as
content-codings. This involves
adding an IANA registry for
transfer-codings (separate from content
codings), a new header field (TE)
and enabling trailer headers in the
future. Transfer encoding is a
major performance benefit, so it was
worth fixing [39]. TE also solves
another, obscure, downward
interoperability problem that
could have occurred due to interactions
between authentication trailers,
chunked encoding and HTTP/1.0
clients.(Section 3.6, 3.6.1, and
14.39)
The PATCH, LINK, UNLINK methods
were defined but not commonly
implemented in previous versions
of this specification. See RFC 2068
[33].
The Alternates, Content-Version,
Derived-From, Link, URI, Public and
Content-Base header fields were
defined in previous versions of this
specification, but not commonly
implemented. See RFC 2068 [33].
20 Index
Please see the PostScript version of this RFC for the INDEX. Fielding, et al. Standards Track [Page 175] RFC 2616 HTTP/1.1 June 1999 21. Full Copyright Statement
Copyright (C) The Internet Society (1999). All Rights Reserved. This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this paragraph are included on all such copies and derivative works. However, this document itself may not be modified in any way, such as by removing the copyright notice or references to the Internet Society or other Internet organizations, except as needed for the purpose of developing Internet standards in which case the procedures for copyrights defined in the Internet Standards process must be followed, or as required to translate it into languages other than English. The limited permissions granted above are perpetual and will not be revoked by the Internet Society or its successors or assigns. This document and the information contained herein is provided on an "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Acknowledgement Funding for the RFC Editor function is currently provided by the Internet Society.