| < draft-reschke-rfc2231-in-http-11.txt | draft-reschke-rfc2231-in-http-12.txt > | |||
|---|---|---|---|---|
| Network Working Group J. Reschke | Network Working Group J. Reschke | |||
| Internet-Draft greenbytes | Internet-Draft greenbytes | |||
| Intended status: Standards Track March 30, 2010 | Intended status: Standards Track April 30, 2010 | |||
| Expires: October 1, 2010 | Expires: November 1, 2010 | |||
| Application of RFC 2231 Encoding to | Character Set and Language Encoding for Hypertext Transfer Protocol | |||
| Hypertext Transfer Protocol (HTTP) Header Fields | (HTTP) Header Field Parameters | |||
| draft-reschke-rfc2231-in-http-11 | draft-reschke-rfc2231-in-http-12 | |||
| Abstract | Abstract | |||
| By default, message header field parameters in Hypertext Transfer | By default, message header field parameters in Hypertext Transfer | |||
| Protocol (HTTP) messages can not carry characters outside the ISO- | Protocol (HTTP) messages can not carry characters outside the ISO- | |||
| 8859-1 character set. RFC 2231 defines an escaping mechanism for use | 8859-1 character set. RFC 2231 defines an encoding mechanism for use | |||
| in Multipurpose Internet Mail Extensions (MIME) headers. This | in Multipurpose Internet Mail Extensions (MIME) headers. This | |||
| document specifies a profile of that encoding suitable for use in | document specifies an encoding suitable for use in HTTP header fields | |||
| HTTP header fields. | which is compatible to a profile of the encoding defined in RFC 2231. | |||
| Editorial Note (To be removed by RFC Editor before publication) | Editorial Note (To be removed by RFC Editor before publication) | |||
| There are multiple HTTP header fields that already use RFC 2231 | There are multiple HTTP header fields that already use RFC 2231 | |||
| encoding in practice (Content-Disposition) or might use it in the | encoding in practice (Content-Disposition) or might use it in the | |||
| future (Link). The purpose of this document is to provide a single | future (Link). The purpose of this document is to provide a single | |||
| place where the generic aspects of RFC 2231 encoding in HTTP header | place where the generic aspects of RFC 2231 encoding in HTTP header | |||
| fields are defined. | fields are defined. | |||
| Distribution of this document is unlimited. Although this is not a | Distribution of this document is unlimited. Although this is not a | |||
| skipping to change at page 2, line 4 ¶ | skipping to change at page 2, line 4 ¶ | |||
| available from | available from | |||
| <http://greenbytes.de/tech/webdav/#draft-reschke-rfc2231-in-http>. A | <http://greenbytes.de/tech/webdav/#draft-reschke-rfc2231-in-http>. A | |||
| collection of test cases is available at | collection of test cases is available at | |||
| <http://greenbytes.de/tech/tc2231/>. | <http://greenbytes.de/tech/tc2231/>. | |||
| Note: as of February 2010, there were at least three independent | Note: as of February 2010, there were at least three independent | |||
| implementations of the encoding defined in Section 3.2: Konqueror | implementations of the encoding defined in Section 3.2: Konqueror | |||
| (starting with 4.4.1), Mozilla Firefox, and Opera. | (starting with 4.4.1), Mozilla Firefox, and Opera. | |||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted to IETF in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
| provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF), its areas, and its working groups. Note that | Task Force (IETF). Note that other groups may also distribute | |||
| other groups may also distribute working documents as Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts. | Drafts is at http://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| The list of current Internet-Drafts can be accessed at | This Internet-Draft will expire on November 1, 2010. | |||
| http://www.ietf.org/ietf/1id-abstracts.txt. | ||||
| The list of Internet-Draft Shadow Directories can be accessed at | ||||
| http://www.ietf.org/shadow.html. | ||||
| This Internet-Draft will expire on October 1, 2010. | ||||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2010 IETF Trust and the persons identified as the | Copyright (c) 2010 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (http://trustee.ietf.org/license-info) in effect on the date of | (http://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
| the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
| described in the BSD License. | described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2. Notational Conventions . . . . . . . . . . . . . . . . . . . . 4 | 2. Notational Conventions . . . . . . . . . . . . . . . . . . . . 4 | |||
| 3. A Profile of RFC 2231 for Use in HTTP . . . . . . . . . . . . 4 | 3. Comparison to RFC 2231 and Definition of the Encoding . . . . 4 | |||
| 3.1. Parameter Continuations . . . . . . . . . . . . . . . . . 5 | 3.1. Parameter Continuations . . . . . . . . . . . . . . . . . 5 | |||
| 3.2. Parameter Value Character Set and Language Information . . 5 | 3.2. Parameter Value Character Set and Language Information . . 5 | |||
| 3.2.1. Examples . . . . . . . . . . . . . . . . . . . . . . . 7 | 3.2.1. Definition . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 3.2.2. Examples . . . . . . . . . . . . . . . . . . . . . . . 7 | ||||
| 3.3. Language specification in Encoded Words . . . . . . . . . 8 | 3.3. Language specification in Encoded Words . . . . . . . . . 8 | |||
| 4. Guidelines for Usage in HTTP Header Field Definitions . . . . 8 | 4. Guidelines for Usage in HTTP Header Field Definitions . . . . 8 | |||
| 4.1. When to Use the Extension . . . . . . . . . . . . . . . . 9 | 4.1. When to Use the Extension . . . . . . . . . . . . . . . . 9 | |||
| 4.2. Error Handling . . . . . . . . . . . . . . . . . . . . . . 9 | 4.2. Error Handling . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 5. Security Considerations . . . . . . . . . . . . . . . . . . . 10 | 5. Security Considerations . . . . . . . . . . . . . . . . . . . 10 | |||
| 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 10 | 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 7. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 10 | 7. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 8. References . . . . . . . . . . . . . . . . . . . . . . . . . . 10 | 8. References . . . . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 8.1. Normative References . . . . . . . . . . . . . . . . . . . 10 | 8.1. Normative References . . . . . . . . . . . . . . . . . . . 10 | |||
| 8.2. Informative References . . . . . . . . . . . . . . . . . . 11 | 8.2. Informative References . . . . . . . . . . . . . . . . . . 11 | |||
| skipping to change at page 3, line 38 ¶ | skipping to change at page 3, line 39 ¶ | |||
| B.2. Since draft-reschke-rfc2231-in-http-01 . . . . . . . . . . 12 | B.2. Since draft-reschke-rfc2231-in-http-01 . . . . . . . . . . 12 | |||
| B.3. Since draft-reschke-rfc2231-in-http-02 . . . . . . . . . . 13 | B.3. Since draft-reschke-rfc2231-in-http-02 . . . . . . . . . . 13 | |||
| B.4. Since draft-reschke-rfc2231-in-http-03 . . . . . . . . . . 13 | B.4. Since draft-reschke-rfc2231-in-http-03 . . . . . . . . . . 13 | |||
| B.5. Since draft-reschke-rfc2231-in-http-04 . . . . . . . . . . 13 | B.5. Since draft-reschke-rfc2231-in-http-04 . . . . . . . . . . 13 | |||
| B.6. Since draft-reschke-rfc2231-in-http-05 . . . . . . . . . . 13 | B.6. Since draft-reschke-rfc2231-in-http-05 . . . . . . . . . . 13 | |||
| B.7. Since draft-reschke-rfc2231-in-http-06 . . . . . . . . . . 13 | B.7. Since draft-reschke-rfc2231-in-http-06 . . . . . . . . . . 13 | |||
| B.8. Since draft-reschke-rfc2231-in-http-07 . . . . . . . . . . 13 | B.8. Since draft-reschke-rfc2231-in-http-07 . . . . . . . . . . 13 | |||
| B.9. Since draft-reschke-rfc2231-in-http-08 . . . . . . . . . . 13 | B.9. Since draft-reschke-rfc2231-in-http-08 . . . . . . . . . . 13 | |||
| B.10. Since draft-reschke-rfc2231-in-http-09 . . . . . . . . . . 13 | B.10. Since draft-reschke-rfc2231-in-http-09 . . . . . . . . . . 13 | |||
| B.11. Since draft-reschke-rfc2231-in-http-10 . . . . . . . . . . 13 | B.11. Since draft-reschke-rfc2231-in-http-10 . . . . . . . . . . 13 | |||
| B.12. Since draft-reschke-rfc2231-in-http-11 . . . . . . . . . . 14 | ||||
| Appendix C. Resolved issues (to be removed by RFC Editor | Appendix C. Resolved issues (to be removed by RFC Editor | |||
| before publication) . . . . . . . . . . . . . . . . . 14 | before publication) . . . . . . . . . . . . . . . . . 14 | |||
| C.1. edit . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 | C.1. edit . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| C.2. charset-registered . . . . . . . . . . . . . . . . . . . . 14 | C.2. nonorm2231 . . . . . . . . . . . . . . . . . . . . . . . . 14 | |||
| C.3. parameter-abnf . . . . . . . . . . . . . . . . . . . . . . 14 | ||||
| C.4. value-abnf . . . . . . . . . . . . . . . . . . . . . . . . 14 | ||||
| C.5. iso8859 . . . . . . . . . . . . . . . . . . . . . . . . . 15 | ||||
| C.6. when-ext-value . . . . . . . . . . . . . . . . . . . . . . 15 | ||||
| C.7. repeated-param . . . . . . . . . . . . . . . . . . . . . . 15 | ||||
| C.8. handling-multiple . . . . . . . . . . . . . . . . . . . . 16 | ||||
| C.9. i18n-spoofing . . . . . . . . . . . . . . . . . . . . . . 17 | ||||
| C.10. multiple-inst-spoofing . . . . . . . . . . . . . . . . . . 17 | ||||
| 1. Introduction | 1. Introduction | |||
| By default, message header field parameters in HTTP ([RFC2616]) | By default, message header field parameters in HTTP ([RFC2616]) | |||
| messages can not carry characters outside the ISO-8859-1 character | messages can not carry characters outside the ISO-8859-1 character | |||
| set ([ISO-8859-1]). RFC 2231 (Appendix of [RFC2231]) defines an | set ([ISO-8859-1]). RFC 2231 ([RFC2231]) defines an encoding | |||
| escaping mechanism for use in MIME headers. This document specifies | mechanism for use in MIME headers. This document specifies an | |||
| a profile of that encoding for use in HTTP header fields. | encoding suitable for use in HTTP header fields which is compatible | |||
| to a profile of the encoding defined in RFC 2231. | ||||
| Note: this profile does not apply to message payloads transmitted | Note: in the remainder of this document, RFC 2231 is only | |||
| referenced for the purpose of explaining the choice of features | ||||
| that were adopted; they are therefore purely informative. | ||||
| Note: this encoding does not apply to message payloads transmitted | ||||
| over HTTP, such as when using the media type "multipart/form-data" | over HTTP, such as when using the media type "multipart/form-data" | |||
| ([RFC2388]). | ([RFC2388]). | |||
| 2. Notational Conventions | 2. Notational Conventions | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | |||
| document are to be interpreted as described in [RFC2119]. | document are to be interpreted as described in [RFC2119]. | |||
| This specification uses the ABNF (Augmented Backus-Naur Form) | This specification uses the ABNF (Augmented Backus-Naur Form) | |||
| notation defined in [RFC5234]. The following core rules are included | notation defined in [RFC5234]. The following core rules are included | |||
| by reference, as defined in [RFC5234], Appendix B.1: ALPHA (letters), | by reference, as defined in [RFC5234], Appendix B.1: ALPHA (letters), | |||
| DIGIT (decimal 0-9), HEXDIG (hexadecimal 0-9/A-F/a-f) and LWSP | DIGIT (decimal 0-9), HEXDIG (hexadecimal 0-9/A-F/a-f) and LWSP | |||
| (linear white space). | (linear white space). | |||
| Note that this specification uses the term "character set" for | Note that this specification uses the term "character set" for | |||
| consistency with other IETF specifications such as RFC 2277 (see | consistency with other IETF specifications such as RFC 2277 (see | |||
| [RFC2277], Section 3). A more accurate term would be "character | [RFC2277], Section 3). A more accurate term would be "character | |||
| encoding" (a mapping of code points to octet sequences). | encoding" (a mapping of code points to octet sequences). | |||
| 3. A Profile of RFC 2231 for Use in HTTP | 3. Comparison to RFC 2231 and Definition of the Encoding | |||
| RFC 2231 defines several extensions to MIME. The sections below | RFC 2231 defines several extensions to MIME. The sections below | |||
| discuss if and how they apply to HTTP. | discuss if and how they apply to HTTP header fields. | |||
| In short: | In short: | |||
| o Parameter Continuations aren't needed (Section 3.1), | o Parameter Continuations aren't needed (Section 3.1), | |||
| o Character Set and Language Information are useful, therefore a | o Character Set and Language Information are useful, therefore a | |||
| simple subset is specified (Section 3.2), and | simple subset is specified (Section 3.2), and | |||
| o Language Specifications in Encoded Words aren't needed | o Language Specifications in Encoded Words aren't needed | |||
| (Section 3.3). | (Section 3.3). | |||
| 3.1. Parameter Continuations | 3.1. Parameter Continuations | |||
| Section 3 of [RFC2231] defines a mechanism that deals with the length | Section 3 of [RFC2231] defines a mechanism that deals with the length | |||
| limitations that apply to MIME headers. These limitations do not | limitations that apply to MIME headers. These limitations do not | |||
| apply to HTTP ([RFC2616], Section 19.4.7). | apply to HTTP ([RFC2616], Section 19.4.7). | |||
| Thus in HTTP, senders MUST NOT use parameter continuations, and | Thus, parameter continuations are not part of the encoding defined by | |||
| therefore recipients do not need to support them. | this specification. | |||
| 3.2. Parameter Value Character Set and Language Information | 3.2. Parameter Value Character Set and Language Information | |||
| Section 4 of [RFC2231] specifies how to embed language information | Section 4 of [RFC2231] specifies how to embed language information | |||
| into parameter values, and also how to encode non-ASCII characters, | into parameter values, and also how to encode non-ASCII characters, | |||
| dealing with restrictions both in MIME and HTTP header parameters. | dealing with restrictions both in MIME and HTTP header parameters. | |||
| However, RFC 2231 does not specify a mandatory-to-implement character | However, RFC 2231 does not specify a mandatory-to-implement character | |||
| set, making it hard for senders to decide which character set to use. | set, making it hard for senders to decide which character set to use. | |||
| Thus, recipients implementing this specification MUST support the | Thus, recipients implementing this specification MUST support the | |||
| character sets "ISO-8859-1" [ISO-8859-1] and "UTF-8" [RFC3629]. | character sets "ISO-8859-1" [ISO-8859-1] and "UTF-8" [RFC3629]. | |||
| Furthermore, RFC 2231 allows leaving out the character set | Furthermore, RFC 2231 allows leaving out the character set | |||
| information. The profile defined by this specification does not | information. The encoding defined by this specification does not | |||
| allow that. | allow that. | |||
| 3.2.1. Definition | ||||
| The syntax for parameters is defined in Section 3.6 of [RFC2616] | The syntax for parameters is defined in Section 3.6 of [RFC2616] | |||
| (with RFC 2616 implied LWS translated to RFC 5234 LWSP): | (with RFC 2616 implied LWS translated to RFC 5234 LWSP): | |||
| parameter = attribute LWSP "=" LWSP value | parameter = attribute LWSP "=" LWSP value | |||
| attribute = token | attribute = token | |||
| value = token / quoted-string | value = token / quoted-string | |||
| quoted-string = <quoted-string, defined in [RFC2616], Section 2.2> | quoted-string = <quoted-string, defined in [RFC2616], Section 2.2> | |||
| token = <token, defined in [RFC2616], Section 2.2> | token = <token, defined in [RFC2616], Section 2.2> | |||
| This specification modifies the grammar to: | In order to include character set and language information, this | |||
| specification modifies the RFC 2616 grammar to: | ||||
| parameter = reg-parameter / ext-parameter | parameter = reg-parameter / ext-parameter | |||
| reg-parameter = parmname LWSP "=" LWSP value | reg-parameter = parmname LWSP "=" LWSP value | |||
| ext-parameter = parmname "*" LWSP "=" LWSP ext-value | ext-parameter = parmname "*" LWSP "=" LWSP ext-value | |||
| parmname = 1*attr-char | parmname = 1*attr-char | |||
| ext-value = charset "'" [ language ] "'" value-chars | ext-value = charset "'" [ language ] "'" value-chars | |||
| ; extended-initial-value, | ; like RFC 2231's <extended-initial-value> | |||
| ; defined in [RFC2231], Section 7 | ; (see [RFC2231], Section 7) | |||
| charset = "UTF-8" / "ISO-8859-1" / mime-charset | charset = "UTF-8" / "ISO-8859-1" / mime-charset | |||
| mime-charset = 1*mime-charsetc | mime-charset = 1*mime-charsetc | |||
| mime-charsetc = ALPHA / DIGIT | mime-charsetc = ALPHA / DIGIT | |||
| / "!" / "#" / "$" / "%" / "&" | / "!" / "#" / "$" / "%" / "&" | |||
| / "+" / "-" / "^" / "_" / "`" | / "+" / "-" / "^" / "_" / "`" | |||
| / "{" / "}" / "~" | / "{" / "}" / "~" | |||
| ; as <mime-charset> in Section 2.3 of [RFC2978] | ; as <mime-charset> in Section 2.3 of [RFC2978] | |||
| ; except that the single quote is not included | ; except that the single quote is not included | |||
| skipping to change at page 7, line 12 ¶ | skipping to change at page 7, line 12 ¶ | |||
| single quote characters. Note that both character set names and | single quote characters. Note that both character set names and | |||
| language tags are restricted to the US-ASCII character set, and are | language tags are restricted to the US-ASCII character set, and are | |||
| matched case-insensitively (see [RFC2978], Section 2.3 and [RFC5646], | matched case-insensitively (see [RFC2978], Section 2.3 and [RFC5646], | |||
| Section 2.1.1). | Section 2.1.1). | |||
| Inside the value part, characters not contained in attr-char are | Inside the value part, characters not contained in attr-char are | |||
| encoded into an octet sequence using the specified character set. | encoded into an octet sequence using the specified character set. | |||
| That octet sequence then is percent-encoded as specified in Section | That octet sequence then is percent-encoded as specified in Section | |||
| 2.1 of [RFC3986]. | 2.1 of [RFC3986]. | |||
| Producers MUST NOT use character sets other than "UTF-8" ([RFC3629]) | Producers MUST use either the "UTF-8" ([RFC3629]) or the "ISO-8859-1" | |||
| or "ISO-8859-1" ([ISO-8859-1]). Extension character sets (ext- | ([ISO-8859-1]) character set. Extension character sets (mime- | |||
| charset) are reserved for future use. | charset) are reserved for future use. | |||
| Note: recipients should be prepared to handle encoding errors, | Note: recipients should be prepared to handle encoding errors, | |||
| such as malformed or incomplete percent escape sequences, or non- | such as malformed or incomplete percent escape sequences, or non- | |||
| decodable octet sequences, in a robust manner. This specification | decodable octet sequences, in a robust manner. This specification | |||
| does not mandate any specific behavior, for instance the following | does not mandate any specific behavior, for instance the following | |||
| strategies are all acceptable: | strategies are all acceptable: | |||
| * ignoring the parameter, | * ignoring the parameter, | |||
| skipping to change at page 7, line 42 ¶ | skipping to change at page 7, line 42 ¶ | |||
| Section 5.1 of [RFC2045]) in that curly braces ("{" and "}") are | Section 5.1 of [RFC2045]) in that curly braces ("{" and "}") are | |||
| excluded. Thus, these two characters are excluded from the attr- | excluded. Thus, these two characters are excluded from the attr- | |||
| char production as well. | char production as well. | |||
| Note: the <mime-charset> ABNF defined here differs from the one in | Note: the <mime-charset> ABNF defined here differs from the one in | |||
| Section 2.3 of [RFC2978] in that it does not allow the single | Section 2.3 of [RFC2978] in that it does not allow the single | |||
| quote character (see also RFC Editor Errata ID 1912 [3]). In | quote character (see also RFC Editor Errata ID 1912 [3]). In | |||
| practice, no character set names using that character have been | practice, no character set names using that character have been | |||
| registered at the time of this writing. | registered at the time of this writing. | |||
| 3.2.1. Examples | 3.2.2. Examples | |||
| Non-extended notation, using "token": | Non-extended notation, using "token": | |||
| foo: bar; title=Economy | foo: bar; title=Economy | |||
| Non-extended notation, using "quoted-string": | Non-extended notation, using "quoted-string": | |||
| foo: bar; title="US-$ rates" | foo: bar; title="US-$ rates" | |||
| Extended notation, using the unicode character U+00A3 (POUND SIGN): | Extended notation, using the unicode character U+00A3 (POUND SIGN): | |||
| skipping to change at page 8, line 36 ¶ | skipping to change at page 8, line 36 ¶ | |||
| 3.3. Language specification in Encoded Words | 3.3. Language specification in Encoded Words | |||
| Section 5 of [RFC2231] extends the encoding defined in [RFC2047] to | Section 5 of [RFC2231] extends the encoding defined in [RFC2047] to | |||
| also support language specification in encoded words. Although the | also support language specification in encoded words. Although the | |||
| HTTP/1.1 specification does refer to RFC 2047 ([RFC2616], Section | HTTP/1.1 specification does refer to RFC 2047 ([RFC2616], Section | |||
| 2.2), it's not clear to which header field exactly it applies, and | 2.2), it's not clear to which header field exactly it applies, and | |||
| whether it is implemented in practice (see | whether it is implemented in practice (see | |||
| <http://tools.ietf.org/wg/httpbis/trac/ticket/111> for details). | <http://tools.ietf.org/wg/httpbis/trac/ticket/111> for details). | |||
| Thus, the RFC 2231 profile defined by this specification does not | Thus, this specification does not include this feature. | |||
| include this feature. | ||||
| 4. Guidelines for Usage in HTTP Header Field Definitions | 4. Guidelines for Usage in HTTP Header Field Definitions | |||
| Specifications of HTTP header fields that use the extensions defined | Specifications of HTTP header fields that use the extensions defined | |||
| in Section 3.2 should clearly state that. A simple way to achieve | in Section 3.2 ought to clearly state that. A simple way to achieve | |||
| this is to normatively reference this specification, and to include | this is to normatively reference this specification, and to include | |||
| the ext-value production into the ABNF for that header field. | the ext-value production into the ABNF for that header field. | |||
| For instance: | For instance: | |||
| foo-header = "foo" LWSP ":" LWSP token ";" LWSP title-param | foo-header = "foo" LWSP ":" LWSP token ";" LWSP title-param | |||
| title-param = "title" LWSP "=" LWSP value | title-param = "title" LWSP "=" LWSP value | |||
| / "title*" LWSP "=" LWSP ext-value | / "title*" LWSP "=" LWSP ext-value | |||
| ext-value = <see RFCxxxx, Section 3.2> | ext-value = <see RFCxxxx, Section 3.2> | |||
| [[rfcno: Note to RFC Editor: in the figure above, please replace | [[rfcno: Note to RFC Editor: in the figure above, please replace | |||
| "xxxx" by the RFC number assigned to this specification.]] | "xxxx" by the RFC number assigned to this specification.]] | |||
| Note: The Parameter Value Continuation feature defined in Section | Note: The Parameter Value Continuation feature defined in Section | |||
| 3 of [RFC2231] makes it impossible to have multiple instances of | 3 of [RFC2231] makes it impossible to have multiple instances of | |||
| extended parameters with identical parmname components, as the | extended parameters with identical parmname components, as the | |||
| processing of continuations would become ambiguous. Thus, | processing of continuations would become ambiguous. Thus, | |||
| specifications using this extension are recommended to disallow | specifications using this extension are advised to disallow this | |||
| this case for compatibility with RFC 2231. | case for compatibility with RFC 2231. | |||
| 4.1. When to Use the Extension | 4.1. When to Use the Extension | |||
| Section 4.2 of [RFC2277] requires that protocol elements containing | Section 4.2 of [RFC2277] requires that protocol elements containing | |||
| text are able to carry language information. Thus, the ext-value | human-readable text are able to carry language information. Thus, | |||
| production should always be used when the parameter value is of | the ext-value production ought to be always used when the parameter | |||
| textual nature and its language is known. | value is of textual nature and its language is known. | |||
| Furthermore, the extension should also be used whenever the parameter | Furthermore, the extension ought to also be used whenever the | |||
| value needs to carry characters not present in the US-ASCII | parameter value needs to carry characters not present in the US-ASCII | |||
| ([USASCII]) character set (note that it would be unacceptable to | ([USASCII]) character set (note that it would be unacceptable to | |||
| define a new parameter that would be restricted to a subset of the | define a new parameter that would be restricted to a subset of the | |||
| Unicode character set). | Unicode character set). | |||
| 4.2. Error Handling | 4.2. Error Handling | |||
| Header field specifications need to define whether multiple instances | Header field specifications need to define whether multiple instances | |||
| of parameters with identical parmname components are allowed, and how | of parameters with identical parmname components are allowed, and how | |||
| they should processed. It is recommended that a parameter using the | they should processed. This specification suggests that a parameter | |||
| extended syntax takes precedence. This could be used by producers to | using the extended syntax takes precedence. This could be used by | |||
| use both formats without breaking recipients that do not understand | producers to use both formats without breaking recipients that do not | |||
| the extended syntax yet. | understand the extended syntax yet. | |||
| Example: | Example: | |||
| foo: bar; title="EURO exchange rates"; | foo: bar; title="EURO exchange rates"; | |||
| title*=utf-8''%e2%82%ac%20exchange%20rates | title*=utf-8''%e2%82%ac%20exchange%20rates | |||
| In this case, the sender provides an ASCII version of the title for | In this case, the sender provides an ASCII version of the title for | |||
| legacy recipients, but also includes an internationalized version for | legacy recipients, but also includes an internationalized version for | |||
| recipients understanding this specification -- the latter obviously | recipients understanding this specification -- the latter obviously | |||
| should prefer the new syntax over the old one. | ought to prefer the new syntax over the old one. | |||
| Note: at the time of this writing, many implementations failed to | Note: at the time of this writing, many implementations failed to | |||
| ignore the form they do not understand, or prioritize the ASCII | ignore the form they do not understand, or prioritize the ASCII | |||
| form although the extended syntax was present. | form although the extended syntax was present. | |||
| 5. Security Considerations | 5. Security Considerations | |||
| The format described in this document makes it possible to transport | The format described in this document makes it possible to transport | |||
| non-ASCII characters, and thus enables character "spoofing" | non-ASCII characters, and thus enables character "spoofing" | |||
| scenarios, in which a displayed value appears to be something other | scenarios, in which a displayed value appears to be something other | |||
| skipping to change at page 14, line 5 ¶ | skipping to change at page 14, line 5 ¶ | |||
| B.11. Since draft-reschke-rfc2231-in-http-10 | B.11. Since draft-reschke-rfc2231-in-http-10 | |||
| Resolve issues "i18n-spoofing", "iso8859", "parameter-abnf", and | Resolve issues "i18n-spoofing", "iso8859", "parameter-abnf", and | |||
| "when-ext-value". | "when-ext-value". | |||
| Add and resolve issue "charset-registered", "handling-multiple", | Add and resolve issue "charset-registered", "handling-multiple", | |||
| "multiple-inst-spoofing", "repeated-param" and "value-abnf". | "multiple-inst-spoofing", "repeated-param" and "value-abnf". | |||
| Update the KDE implementation note. | Update the KDE implementation note. | |||
| B.12. Since draft-reschke-rfc2231-in-http-11 | ||||
| In the prose in Section 3.2, "ext-charset" -> "mime-charset". In | ||||
| Section 4, avoid the use of "should" and "recommended". In | ||||
| Section 4.1 clarify that the RFC 2277 requirement is about human- | ||||
| readable text. Clarify parts that made it look as if this spec has a | ||||
| normative dependency on RFC 2231 (new issue "nonorm2231"). | ||||
| Appendix C. Resolved issues (to be removed by RFC Editor before | Appendix C. Resolved issues (to be removed by RFC Editor before | |||
| publication) | publication) | |||
| Issues that were either rejected or resolved in this version of this | Issues that were either rejected or resolved in this version of this | |||
| document. | document. | |||
| C.1. edit | C.1. edit | |||
| Type: edit | Type: edit | |||
| julian.reschke@greenbytes.de (2009-04-17): Umbrella issue for | julian.reschke@greenbytes.de (2009-04-17): Umbrella issue for | |||
| editorial fixes/enhancements. | editorial fixes/enhancements. | |||
| C.2. charset-registered | C.2. nonorm2231 | |||
| In Section 3.2: | ||||
| Type: change | ||||
| julian.reschke@greenbytes.de (2010-02-20): Mention to use only | ||||
| registered charset names? (reported by Alexey Melnikov). | ||||
| Resolution (2010-03-29): State this in the ABNF. | ||||
| C.3. parameter-abnf | ||||
| In Section 3.2: | ||||
| Type: change | ||||
| julian.reschke@greenbytes.de (2010-02-20): The ABNF for reg-parameter | ||||
| and ext-parameter is ambiguous, as "*" is a valid token character; | ||||
| furthermore, RFC 2616's "attribute" production allows "*" while RFC | ||||
| 2231's does not. (reported by Alexey Melnikov). | ||||
| julian.reschke@greenbytes.de (2010-02-21): Proposal: restrict the | ||||
| allowable character set in parameter names to exclude "*" (and maybe | ||||
| even more non-name characters?). Also, consider extending the set of | ||||
| value characters (for the right hand side) to allow more characters | ||||
| that can be unambiguously parsed outside quoted strings, such as "/". | ||||
| Resolution: Introduced parmname, disallowing "*" / "'" / "%". Moving | ||||
| the value ABNF discussion into a separate issue ("value-abnf"). | ||||
| C.4. value-abnf | ||||
| In Section 3.2: | ||||
| Type: change | ||||
| julian.reschke@greenbytes.de (2010-02-26): Consider extending the | ||||
| right-hand side ABNF - both for regular and extended parameters - to | ||||
| include more characters that can be unambiguously parsed outside | ||||
| quoted strings, such as "/". | ||||
| Resolution (2010-03-29): No change due to lack of feedback. | ||||
| Potentially defer to future versions of HTTP/1.1 (defining guidelines | ||||
| for header definitions), or a revision of this spec. | ||||
| C.5. iso8859 | ||||
| In Section 3.2: | ||||
| Type: change | ||||
| julian.reschke@greenbytes.de (2010-02-20): The protocol could be | ||||
| further simplified by mandating UTF-8 only (reported by Alexey | ||||
| Melnikov). On the other hand and not surprinsingly, testing shows | ||||
| that ISO-8859-1 support is widely implemented. The author is looking | ||||
| for community feedback on this choice. | ||||
| Resolution (2010-03-29): Further feedback was requested during IETF | ||||
| LC; but none was received. Thus defaulting to no change; keeping the | ||||
| support for ISO-8859-1. | ||||
| C.6. when-ext-value | ||||
| In Section 4.1: | ||||
| Type: change | ||||
| julian.reschke@greenbytes.de (2010-02-18): There's no point in using | ||||
| ext-value when the language is unknown and no "special" characters | ||||
| are present. | ||||
| Resolution (2010-02-23): Fixed. | ||||
| C.7. repeated-param | ||||
| In Section 4: | ||||
| Type: change | ||||
| Chris.Newman@Sun.COM (2010-03-22): RFC 2231 did not allow two | ||||
| parameters with the same name but different languages, at least in | ||||
| the context of continuations that was impossible. Absent | ||||
| continuations, RFC 2231 was otherwise silent on that topic. | ||||
| So section 4.3 adds a new feature over and above what RFC 2231 did. | ||||
| It's a feature that will make implementations significantly more | ||||
| complex and is likely to cause interoperability problems. | ||||
| Much of the experience with deployment of both language tagging and | ||||
| language variants in the IETF seems to result in unnecessary | ||||
| complexity. While there are good abstract arguments for language | ||||
| tagging in theory, it seems more often than not that the parties in | ||||
| the exchange are unable to put anything useful in the field in which | ||||
| case it falls into the realm of unnecessary complexity. In addition, | ||||
| we have experience where we attempted to allow language variants | ||||
| (multipart/alternative) and not only did that usage not deploy, it is | ||||
| actively broken despite being an explicit example in RFC 1766. | ||||
| The one place where I've seen language variants mostly work is when | ||||
| the language tag is actually included in the attribute name (LDAP | ||||
| does this) and the "search" mechanism allows wildcarding of | ||||
| languages. But having two attributes with the same name seems | ||||
| dangerous. | ||||
| My recommendation is to remove this feature as I believe it will not | ||||
| be used in practice and will add unnecessary complexity that is | ||||
| likely to create interoperability problems. | ||||
| Resolution (2010-03-29): State the issue. Remove section 4.3. | ||||
| Rephrase 4.2 accordingly. | ||||
| C.8. handling-multiple | ||||
| In Section 4.2: | ||||
| Type: change | ||||
| <http://www.ietf.org/mail-archive/web/apps-discuss/current/ | ||||
| msg01344.html> | ||||
| roessler@gmail.com (2010-02-24): Leaving the choice of precedence to | ||||
| the header specification implies that parsers need to special-case. | ||||
| It would seem reasonable to make a choice in this specification that | ||||
| for properties which can only occur once, the traditional syntax | ||||
| takes precedence. | ||||
| julian.reschke@greenbytes.de (2010-02-26): That would rule out the | ||||
| use case where the traditional syntax is used as a fallback for | ||||
| clients that do not support the new syntax, as discussed in that | ||||
| section: ... http://greenbytes.de/tech/tc2231/#attfnboth2 is a test | ||||
| case that shows that using this technique, both variants can be | ||||
| served to clients, and those that understand the ext-parameter | ||||
| encoding will indeed pick the "better" parameter. Unfortunately, | ||||
| this appears to depend on parameter ordering, which I didn't want to | ||||
| mention in this spec. Maybe I should? | ||||
| Resolution (2010-03-29): Just state that when repetitions are not | ||||
| allowed, the extended form should take precedence. | ||||
| C.9. i18n-spoofing | ||||
| In Section 5: | ||||
| Type: change | ||||
| <http://www.ietf.org/mail-archive/web/apps-discuss/current/ | ||||
| msg01329.html> | ||||
| GK@ninebynine.org (2010-02-20): I note that the security | ||||
| considerations section says nothing about possible character | ||||
| "spoofing" - i.e. making a displayed prompt or value appear to be | ||||
| something other than it is. E.g. Non-ASCII characters have been | ||||
| used to set up exploits involving dodgy URIs that may appear to a | ||||
| user to be legitimate. | ||||
| Resolution (2010-02-23): Mention the problem, and point to RFC 3629's | ||||
| security considerations which mention this as well. While at it, | ||||
| also mention the other UTF-8 related attack scenario. | ||||
| C.10. multiple-inst-spoofing | ||||
| In Section 5: | ||||
| Type: change | Type: edit | |||
| kivinen@iki.fi (2010-03-01): Yes, but the impact of them is | julian.reschke@greenbytes.de (2010-04-23): It's not totally clear | |||
| different. For example it does not really matter if the filename | that the mentions of RFC 2231 really are all informative. | |||
| parameters having different languages differ, but there might be | ||||
| parameters where this really matters. | ||||
| As this document does not define any exact parameters, it might be | ||||
| enough to comment something like that "This document specifies way to | ||||
| transport multiple language variants for parameters, and such use | ||||
| might allow spoofing attacks, where different language versions of | ||||
| the same parameters do not match. Whether this attack is useful as | ||||
| an attack depends on the parameter specified." | ||||
| Resolution (2010-03-01): Add text based on the recommendation. | Resolution (2010-04-28): Clarify title of the spec, plus text talking | |||
| about RFC 2231. Avoid saying "profile" in general. | ||||
| Author's Address | Author's Address | |||
| Julian F. Reschke | Julian F. Reschke | |||
| greenbytes GmbH | greenbytes GmbH | |||
| Hafenweg 16 | Hafenweg 16 | |||
| Muenster, NW 48155 | Muenster, NW 48155 | |||
| Germany | Germany | |||
| EMail: julian.reschke@greenbytes.de | EMail: julian.reschke@greenbytes.de | |||
| End of changes. 35 change blocks. | ||||
| 232 lines changed or deleted | 70 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/ | ||||