Indicating Character Encoding and Language for HTTP Header Field Parametersgreenbytes GmbHHafenweg 16MünsterNW48155Germanyjulian.reschke@greenbytes.dehttp://greenbytes.de/tech/webdav/
Applications and Real-Time
HTTP Working GroupHTTPheader field parameterinternationalization
By default, header field values in Hypertext Transfer Protocol (HTTP)
messages cannot easily carry characters outside the US-ASCII coded
character set. RFC 2231 defines an encoding mechanism for use in
parameters inside Multipurpose Internet Mail Extensions (MIME) header
field values. This document specifies an encoding suitable for use in
HTTP header fields that is compatible with a simplified profile of the
encoding defined in RFC 2231.
This document obsoletes RFC 5987.
Use of characters outside the US-ASCII coded character set ()
in HTTP header fields () is non-trivial:
The HTTP specification discourages use of non-US-ASCII characters in field
values, placing them into the "obs-text" Augmented Backus-Naur Form (ABNF) production (, Section 3.2).Furthermore, it stays silent about default character encoding schemes for
field values, so any use of non-US-ASCII characters would need to be specific
to the field definition or would require some other kind of out-of-band
information.Finally, some APIs assume a default character encoding scheme in order to
map from the octet sequences (obtained from the HTTP message) to character
sequences:
for instance, the XMLHttpRequest API () uses
the Interface Definition Language type "ByteString",
effectively resulting in the ISO-8859-1 character encoding scheme ()
being used.
On the other hand, RFC 2231 defines an encoding mechanism for parameters
inside MIME header fields (), which, as opposed to
HTTP messages, do need to be sent over non-binary transports.
This document specifies an encoding suitable for use in HTTP header fields
that is compatible with a simplified profile of the encoding defined in RFC 2231.
It can be applied to any HTTP header field that uses the common "parameter"
("name=value") syntax.
This document obsoletes and
moves it to "Historic" status; the changes are summarized
in .
Note: In the remainder of this document, RFC 2231 is only referenced
for the purpose of explaining the choice of features that were adopted;
therefore, they are purely informative.
Note: This encoding does not apply to message payloads
transmitted over HTTP, such as when using the media type "multipart/form-data"
().
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in .
This specification uses the ABNF notation defined in
. The following core rules are included by
reference, as defined in , Appendix B.1:
ALPHA (letters), DIGIT (decimal 0-9), HEXDIG (hexadecimal 0-9/A-F/a-f), and
LWSP (linear whitespace).
This specification uses terminology defined in ,
namely: "character encoding scheme" (abbreviated to
"character encoding" below), "charset",
and "coded character set".
Note that this differs from RFC 2231, which uses the term "character set"
for "character encoding scheme".
RFC 2231 defines several extensions to MIME. The sections below discuss
if and how they apply to HTTP header fields.
In short:
Parameter Continuations aren't needed (),Character Encoding and Language Information are useful, therefore a simple subset
is specified (), andLanguage Specifications in Encoded Words aren't needed ().
Section 3 of defines a mechanism that
deals with the length limitations that apply to MIME headers. These
limitations do not apply to HTTP (, Appendix A.6).
Thus, parameter continuations are not part of the encoding defined by this
specification.
Section 4 of specifies how to embed
language information into parameter values and also how to encode
non-ASCII characters, dealing with restrictions both in MIME and HTTP
header field parameters.
However, RFC 2231 does not specify a mandatory-to-implement character encoding,
making it hard for senders to decide which encoding to use.
Thus, recipients implementing this specification MUST support the
"UTF-8" character encoding .
Furthermore, RFC 2231 allows the character encoding information to be left out.
The encoding defined by this specification does not allow that.
The presence of extended parameter values is usually indicated by a parameter name
ending in an asterisk character. However, note that this is just a convention,
and that the extended parameter values need to be explicitly specified in the definition of the header
field using this extension (see ).
The ABNF for extended parameter values is specified below:
The value part of an extended parameter (ext-value) is a token that consists
of three parts:
the REQUIRED character encoding name (charset),the OPTIONAL language information (language), anda character sequence representing the
actual value (value-chars), separated by single quote
characters.
Note that both character encoding names and
language tags are restricted to the US-ASCII coded character set and are matched
case-insensitively (see Section 2.3 of and
Section 2.1.1 of ).
Inside the value part, characters not contained in attr-char are
encoded into an octet sequence using the specified character encoding. That octet
sequence is then percent-encoded as specified in Section 2.1 of .
Producers MUST use the "UTF-8" () character encoding.
Extension character encodings (mime-charset) are reserved for future use.
Note: Recipients should be prepared to handle encoding
errors, such as malformed or incomplete percent escape sequences, or
non&nbhy;decodable octet sequences, in a robust manner. This specification
does not mandate any specific behavior; for instance, the following
strategies are all acceptable:
ignoring the parameter,stripping a non-decodable octet sequence, andsubstituting a non-decodable octet sequence by a replacement
character, such as the Unicode character U+FFFD (Replacement
Character).
The
RFC 7230 token production (, Section 3.2.6)
differs from the production used in RFC 2231 (imported from Section 5.1 of )
in that curly braces (i.e., "{" and "}") are excluded. Thus, these two
characters are excluded from the attr-char production as well.
The <mime-charset> ABNF defined here differs from
the one in Section 2.3 of in that it does
not allow the single quote character (see also RFC Errata ID 1912 ). In practice, no character encoding names
using that character have been registered at the time of this writing.
For backwards compatibility with RFC 2231, the encoding defined by this
specification deviates from common parameter syntax in that the
quoted-string notation is not allowed. Implementations using generic parser
components might not be able to detect the use of quoted-string notation and
thus might accept that format, although invalid, as well.
did require support for ISO-8859-1 (),
too; for compatibility with legacy code, recipients are encouraged to
support this encoding as well.
Section 5 of extends the encoding
defined in to also support language specification
in encoded words.
RFC 2616, the now-obsolete HTTP/1.1 specification, did refer to RFC 2047
(, Section 2.2). However, it wasn't clear
to which header field it applied. Consequently, the current revision of
the HTTP/1.1 specification has deprecated use of the encoding forms defined in
RFC 2047 (see Section 3.2.4 of ).
Thus, this specification does not include this feature.
Specifications of HTTP header fields that use the extensions defined
in ought to clearly
state that. A simple way to achieve this is to normatively reference
this specification and to include the ext-value
production into the ABNF for specific header field parameters.
Note: The Parameter Value Continuation feature defined in
Section 3 of makes it impossible to
have multiple instances of extended parameters with identical names,
as the processing of continuations would become ambiguous. Thus, specifications
using this extension are advised to disallow this case for compatibility
with RFC 2231.
Note: This specification does not automatically assign a new
interpretation to parameter names ending in an asterisk. As pointed out
above, it's up to the specification for the non&nbhy;extended parameter to "opt
in" to the syntax defined here. That being said, some existing
implementations are known to automatically switch to using this
notation when a parameter name ends with an asterisk; thus, using parameter
names ending in an asterisk for something else is likely to cause
interoperability problems.
Section 4.2 of requires that protocol
elements containing human-readable text be able to carry language
information. Thus, the ext-value
production ought to always be used when the parameter value is of a textual
nature and its language is known.
Furthermore, the extension ought to also be used whenever the parameter value
needs to carry characters not present in the US-ASCII coded character set
(); note that it would be unacceptable to define a new parameter that
would be restricted to a subset of the Unicode character set.
Header field specifications need to define whether multiple
instances of parameters with identical names are allowed and
how they should be processed. This specification suggests that a parameter using the
extended syntax takes precedence. This would allow producers to use both
formats without breaking recipients that do not understand the extended syntax
yet.
The format described in this document makes it possible to transport
non-ASCII characters, and thus enables character "spoofing" scenarios
in which a displayed value appears to be something other than it is.
Furthermore, there are known attack scenarios related to decoding UTF-8.
See Section 10 of for more information on
both topics.
In addition, the extension specified in this document makes it possible
to transport multiple language variants for a single parameter, and such use
might allow spoofing attacks where
different language versions of the same parameter are not equivalent.
Whether this attack is effective as an attack depends on the parameter
specified.
This document does not require any IANA actions.
ASCII format for network interchangeKey words for use in RFCs to Indicate Requirement LevelsIANA Charset Registration ProceduresUTF-8, a transformation format of ISO 10646Uniform Resource Identifier (URI): Generic SyntaxTags for Identifying LanguagesAugmented BNF for Syntax Specifications: ABNFHypertext Transfer Protocol (HTTP/1.1): Message Syntax and RoutingThe Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document provides an overview of HTTP architecture and its associated terminology, defines the "http" and "https" Uniform Resource Identifier (URI) schemes, defines the HTTP/1.1 message syntax and parsing requirements, and describes related security concerns for implementations.Hypertext Transfer Protocol (HTTP/1.1): Semantics and ContentThe Hypertext Transfer Protocol (HTTP) is a stateless \%application- level protocol for distributed, collaborative, hypertext information systems. This document defines the semantics of HTTP/1.1 messages, as expressed by request methods, request header fields, response status codes, and response header fields, along with the payload of messages (metadata and body content) and mechanisms for content negotiation.Erratum ID 1912, RFC 2978RFC ErrataInformation technology -- 8-bit single-byte coded graphic character sets -- Part 1: Latin alphabet No. 1International Organization for StandardizationMultipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message BodiesThis initial document specifies the various headers used to describe the structure of MIME messages. [STANDARDS-TRACK]MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII TextThis particular document is the third document in the series. It describes extensions to RFC 822 to allow non-US-ASCII text data in Internet mail header fields. [STANDARDS-TRACK]MIME Parameter Value and Encoded Word Extensions: Character Sets, Languages, and ContinuationsThis memo defines extensions to the RFC 2045 media type and RFC 2183 disposition parameter value mechanisms. This memo also defines an extension to the encoded words defined in RFC 2047 to allow the specification of the language to be used for display as well as the character set. [STANDARDS-TRACK]IETF Policy on Character Sets and LanguagesThis document is the current policies being applied by the Internet Engineering Steering Group (IESG) towards the standardization efforts in the Internet Engineering Task Force (IETF) in order to help Internet protocols fulfill these requirements. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.Hypertext Transfer Protocol -- HTTP/1.1HTTP has been in use by the World-Wide Web global information initiative since 1990. This specification defines the protocol referred to as "HTTP/1.1", and is an update to RFC 2068. [STANDARDS-TRACK]Character Set and Language Encoding for Hypertext Transfer Protocol (HTTP) Header Field ParametersBy default, message header field parameters in Hypertext Transfer Protocol (HTTP) messages cannot carry characters outside the ISO- 8859-1 character set. RFC 2231 defines an encoding mechanism for use in Multipurpose Internet Mail Extensions (MIME) headers. This document specifies an encoding suitable for use in HTTP header fields that is compatible with a profile of the encoding defined in RFC 2231. [STANDARDS-TRACK]Web LinkingThis document specifies relation types for Web links, and defines a registry for them. It also defines the use of such links in HTTP headers with the Link header field. [STANDARDS-TRACK]Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)RFC 2616 defines the Content-Disposition response header field, but points out that it is not part of the HTTP/1.1 Standard. This specification takes over the definition and registration of Content-Disposition, as used in HTTP, and clarifies internationalization aspects. [STANDARDS-TRACK]Terminology Used in Internationalization in the IETFThis document provides a list of terms used in the IETF when discussing internationalization. The purpose is to help frame discussions of internationalization in the various areas of the IETF and to help introduce the main concepts to IETF participants. This memo documents an Internet Best Current Practice.Returning Values from Forms: multipart/form-dataThis specification defines the multipart/form-data media type, which can be used by a wide variety of applications and transported by a wide variety of protocols as a way of returning a set of values as the result of a user filling out a form. This document obsoletes RFC 2388.HTTP Digest Access AuthenticationThe Hypertext Transfer Protocol (HTTP) provides a simple challenge- response authentication mechanism that may be used by a server to challenge a client request and by a client to provide authentication information. This document defines the HTTP Digest Authentication scheme that can be used with the HTTP authentication mechanism.HTTP Authentication Extensions for Interactive ClientsThis document specifies extensions for the HTTP authentication framework for interactive clients. Currently, fundamental features of HTTP-level authentication are insufficient for complex requirements of various Web-based applications. This forces these applications to implement their own authentication frameworks by means such as HTML forms, which becomes one of the hurdles against introducing secure authentication mechanisms handled jointly by servers and user agents. The extended framework fills gaps between Web application requirements and HTTP authentication provisions to solve the above problems, while maintaining compatibility with existing Web and non-Web uses of HTTP authentication.XMLHttpRequestWhatWG
This section summarizes the changes compared to :
The document title was changed to "Indicating Character Encoding and Language for HTTP Header Field Parameters".
The introduction was rewritten to better explain the issues around non-ASCII characters in field values.
The requirement to support the "ISO-8859-1" encoding was removed.
This document no longer attempts to redefine a generic "parameter" ABNF
(it turned out that
there really isn't a generic definition of parameters in HTTP; for instance,
there are subtle differences with respect to whitespace handling).
A note about defects in error handling in current implementations was
removed, as it was no longer accurate.
The encoding defined in this document is currently used in four different
HTTP header fields:
"Authentication-Control", defined in ,
"Authorization" (as used in HTTP Digest Authentication, defined in ),
"Content-Disposition", defined in , and
"Link", defined in .
As the encoding is a profile/clarification of the one defined in
in 1997, many user agents already supported it for
use in "Content-Disposition" when was published.
Since the publication of , three more popular desktop
user agents have added support for this encoding; see
for details. At this time, the current versions of all major desktop
user agents support it.
Note that the implementation in Internet Explorer 9 does not support the
ISO-8859-1 character encoding; this document revision acknowledges that UTF-8 is
sufficient for expressing all code points and removes the requirement
to support ISO-8859-1.
The "Link" header field, on the other hand, was more recently specified
in . At the time of this writing, no user agent
except Firefox supported the "title*" parameter (starting with release 15).
Section 3.4 of defines the "username*"
parameter for use in HTTP Digest Authentication. At the time of writing, no
user agent implemented this extension.
Thanks to Martin Dürst and Frank Ellermann for help figuring out ABNF details,
to Graham Klyne and Alexey Melnikov for general review, to
Chris Newman for pointing out an RFC 2231 incompatibility, and to
Benjamin Carlyle, Roar Lauritzsen, Eric Lawrence, and James Manger for implementers feedback.
Furthermore, thanks to the members of the IETF HTTP Working Group for
the feedback specific to this update of RFC 5987.