draft-ietf-httpbis-content-disp-06.txt | draft-ietf-httpbis-content-disp-latest.txt | |||
---|---|---|---|---|
HTTPbis Working Group J. Reschke | HTTPbis Working Group J. Reschke | |||
Internet-Draft greenbytes | Internet-Draft greenbytes | |||
Updates: 2616 (if approved) February 26, 2011 | Updates: 2616 (if approved) June 2011 | |||
Intended status: Standards Track | Intended status: Standards Track | |||
Expires: August 30, 2011 | Expires: December 3, 2011 | |||
Use of the Content-Disposition Header Field in the | Use of the Content-Disposition Header Field in the | |||
Hypertext Transfer Protocol (HTTP) | Hypertext Transfer Protocol (HTTP) | |||
draft-ietf-httpbis-content-disp-06 | draft-ietf-httpbis-content-disp-latest | |||
Abstract | Abstract | |||
RFC 2616 defines the Content-Disposition response header field, but | RFC 2616 defines the Content-Disposition response header field, but | |||
points out that it is not part of the HTTP/1.1 Standard. This | points out that it is not part of the HTTP/1.1 Standard. This | |||
specification takes over the definition and registration of Content- | specification takes over the definition and registration of Content- | |||
Disposition, as used in HTTP, and clarifies internationalization | Disposition, as used in HTTP, and clarifies internationalization | |||
aspects. | aspects. | |||
Editorial Note (To be removed by RFC Editor before publication) | ||||
This specification is expected to replace the definition of Content- | ||||
Disposition in the HTTP/1.1 specification, as currently revised by | ||||
the IETF HTTPbis working group. See also | ||||
<http://trac.tools.ietf.org/wg/httpbis/trac/ticket/123>. | ||||
Discussion of this draft should take place on the HTTPBIS working | ||||
group mailing list (ietf-http-wg@w3.org). The current issues list is | ||||
at <http://trac.tools.ietf.org/wg/httpbis/trac/ | ||||
query?component=content-disp> and related documents (including fancy | ||||
diffs) can be found at <http://tools.ietf.org/wg/httpbis/>. | ||||
The changes in this draft are summarized in Appendix E.10. | ||||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted 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). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at http://datatracker.ietf.org/drafts/current/. | 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." | |||
This Internet-Draft will expire on August 30, 2011. | ||||
This Internet-Draft will expire on December 3, 2011. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2011 IETF Trust and the persons identified as the | Copyright (c) 2011 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 Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
2. Notational Conventions . . . . . . . . . . . . . . . . . . . . 4 | 2. Notational Conventions . . . . . . . . . . . . . . . . . . . . 3 | |||
3. Conformance and Error Handling . . . . . . . . . . . . . . . . 4 | 3. Conformance and Error Handling . . . . . . . . . . . . . . . . 3 | |||
4. Header Field Definition . . . . . . . . . . . . . . . . . . . 5 | 4. Header Field Definition . . . . . . . . . . . . . . . . . . . 4 | |||
4.1. Grammar . . . . . . . . . . . . . . . . . . . . . . . . . 5 | 4.1. Grammar . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
4.2. Disposition Type . . . . . . . . . . . . . . . . . . . . . 6 | 4.2. Disposition Type . . . . . . . . . . . . . . . . . . . . . 5 | |||
4.3. Disposition Parameter: 'Filename' . . . . . . . . . . . . 6 | 4.3. Disposition Parameter: 'Filename' . . . . . . . . . . . . 5 | |||
4.4. Disposition Parameter: Extensions . . . . . . . . . . . . 7 | 4.4. Disposition Parameter: Extensions . . . . . . . . . . . . 6 | |||
4.5. Extensibility . . . . . . . . . . . . . . . . . . . . . . 7 | 4.5. Extensibility . . . . . . . . . . . . . . . . . . . . . . 6 | |||
5. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 | 5. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
6. Internationalization Considerations . . . . . . . . . . . . . 8 | 6. Internationalization Considerations . . . . . . . . . . . . . 7 | |||
7. Security Considerations . . . . . . . . . . . . . . . . . . . 9 | 7. Security Considerations . . . . . . . . . . . . . . . . . . . 8 | |||
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 9 | 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 8 | |||
8.1. Registry for Disposition Values and Parameter . . . . . . 9 | 8.1. Registry for Disposition Values and Parameters . . . . . . 8 | |||
8.2. Header Field Registration . . . . . . . . . . . . . . . . 9 | 8.2. Header Field Registration . . . . . . . . . . . . . . . . 8 | |||
9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 9 | 9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 9 | 10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
10.1. Normative References . . . . . . . . . . . . . . . . . . . 9 | 10.1. Normative References . . . . . . . . . . . . . . . . . . . 8 | |||
10.2. Informative References . . . . . . . . . . . . . . . . . . 10 | 10.2. Informative References . . . . . . . . . . . . . . . . . . 9 | |||
Appendix A. Changes from the RFC 2616 Definition . . . . . . . . 10 | Appendix A. Changes from the RFC 2616 Definition . . . . . . . . 10 | |||
Appendix B. Differences compared to RFC 2183 . . . . . . . . . . 11 | Appendix B. Differences Compared to RFC 2183 . . . . . . . . . . 10 | |||
Appendix C. Alternative Approaches to Internationalization . . . 11 | Appendix C. Alternative Approaches to Internationalization . . . 10 | |||
C.1. RFC 2047 Encoding . . . . . . . . . . . . . . . . . . . . 11 | C.1. RFC 2047 Encoding . . . . . . . . . . . . . . . . . . . . 11 | |||
C.2. Percent Encoding . . . . . . . . . . . . . . . . . . . . . 12 | C.2. Percent Encoding . . . . . . . . . . . . . . . . . . . . . 11 | |||
C.3. Encoding Sniffing . . . . . . . . . . . . . . . . . . . . 12 | C.3. Encoding Sniffing . . . . . . . . . . . . . . . . . . . . 11 | |||
C.4. Implementations (to be removed by RFC Editor before | ||||
publication) . . . . . . . . . . . . . . . . . . . . . . . 12 | ||||
Appendix D. Advice on Generating Content-Disposition Header | Appendix D. Advice on Generating Content-Disposition Header | |||
Fields . . . . . . . . . . . . . . . . . . . . . . . 13 | Fields . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
Appendix E. Change Log (to be removed by RFC Editor before | ||||
publication) . . . . . . . . . . . . . . . . . . . . 14 | ||||
E.1. Since draft-reschke-rfc2183-in-http-00 . . . . . . . . . . 14 | ||||
E.2. Since draft-reschke-rfc2183-in-http-01 . . . . . . . . . . 14 | ||||
E.3. Since draft-reschke-rfc2183-in-http-02 . . . . . . . . . . 14 | ||||
E.4. Since draft-reschke-rfc2183-in-http-03 . . . . . . . . . . 15 | ||||
E.5. Since draft-ietf-httpbis-content-disp-00 . . . . . . . . . 15 | ||||
E.6. Since draft-ietf-httpbis-content-disp-01 . . . . . . . . . 15 | ||||
E.7. Since draft-ietf-httpbis-content-disp-02 . . . . . . . . . 15 | ||||
E.8. Since draft-ietf-httpbis-content-disp-03 . . . . . . . . . 15 | ||||
E.9. Since draft-ietf-httpbis-content-disp-04 . . . . . . . . . 16 | ||||
E.10. Since draft-ietf-httpbis-content-disp-05 . . . . . . . . . 16 | ||||
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 | ||||
1. Introduction | 1. Introduction | |||
RFC 2616 defines the Content-Disposition response header field in | RFC 2616 defines the Content-Disposition response header field | |||
Section 19.5.1 of [RFC2616], but points out that it is not part of | (Section 19.5.1 of [RFC2616]) but points out that it is not part of | |||
the HTTP/1.1 Standard (Section 15.5): | the HTTP/1.1 Standard (Section 15.5): | |||
Content-Disposition is not part of the HTTP standard, but since it | Content-Disposition is not part of the HTTP standard, but since it | |||
is widely implemented, we are documenting its use and risks for | is widely implemented, we are documenting its use and risks for | |||
implementers. | implementers. | |||
This specification takes over the definition and registration of | This specification takes over the definition and registration of | |||
Content-Disposition, as used in HTTP. Based on interoperability | Content-Disposition, as used in HTTP. Based on interoperability | |||
testing with existing User Agents, it fully defines a profile of the | testing with existing user agents (UAs), it fully defines a profile | |||
features defined in the Multipurpose Internet Mail Extensions (MIME) | of the features defined in the Multipurpose Internet Mail Extensions | |||
variant ([RFC2183]) of the header field, and also clarifies | (MIME) variant ([RFC2183]) of the header field, and also clarifies | |||
internationalization aspects. | internationalization aspects. | |||
Note: this document does not apply to Content-Disposition header | Note: This document does not apply to Content-Disposition header | |||
fields appearing in payload bodies transmitted over HTTP, such as | fields appearing in payload bodies transmitted over HTTP, such as | |||
when using the media type "multipart/form-data" ([RFC2388]). | when using the media type "multipart/form-data" ([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 augmented BNF notation defined in Section | This specification uses the augmented BNF (ABNF) notation defined in | |||
2.1 of [RFC2616], including its rules for implied linear whitespace | Section 2.1 of [RFC2616], including its rules for implied linear | |||
(LWS). | whitespace (LWS). | |||
3. Conformance and Error Handling | 3. Conformance and Error Handling | |||
This specification defines conformance criteria for both senders | This specification defines conformance criteria for both senders | |||
(usually, HTTP origin servers) and recipients (usually, HTTP user | (usually, HTTP origin servers) and recipients (usually, HTTP user | |||
agents) of the Content-Disposition header field. An implementation | agents) of the Content-Disposition header field. An implementation | |||
is considered conformant if it complies with all of the requirements | is considered conformant if it complies with all of the requirements | |||
associated with its role. | associated with its role. | |||
This specification also defines certain forms of the header field- | This specification also defines certain forms of the header field | |||
value to be invalid, using both ABNF and prose requirements, but it | value to be invalid, using both ABNF and prose requirements | |||
does not define special handling of these invalid field-values. | (Section 4), but it does not define special handling of these invalid | |||
field values. | ||||
Senders MUST NOT generate Content-Disposition header fields that are | Senders MUST NOT generate Content-Disposition header fields that are | |||
invalid. | invalid. | |||
Recipients MAY take steps to recover a usable field-value from an | Recipients MAY take steps to recover a usable field value from an | |||
invalid header field, but SHOULD NOT reject the message outright, | invalid header field, but SHOULD NOT reject the message outright, | |||
unless this is explicitly desirable behaviour (e.g., the | unless this is explicitly desirable behavior (e.g., the | |||
implementation is a validator). As such, the default handling of | implementation is a validator). As such, the default handling of | |||
invalid fields is to ignore them. | invalid fields is to ignore them. | |||
4. Header Field Definition | 4. Header Field Definition | |||
The Content-Disposition response header field is used to convey | The Content-Disposition response header field is used to convey | |||
additional information about how to process the response payload, and | additional information about how to process the response payload, and | |||
also can be used to attach additional metadata, such as the filename | also can be used to attach additional metadata, such as the filename | |||
to use when saving the response payload locally. | to use when saving the response payload locally. | |||
skipping to change at page 5, line 44 ¶ | skipping to change at page 4, line 45 ¶ | |||
token = <token, defined in [RFC2616], Section 2.2> | token = <token, defined in [RFC2616], Section 2.2> | |||
quoted-string = <quoted-string, defined in [RFC2616], Section 2.2> | quoted-string = <quoted-string, defined in [RFC2616], Section 2.2> | |||
value = <value, defined in [RFC2616], Section 3.6> | value = <value, defined in [RFC2616], Section 3.6> | |||
; token | quoted-string | ; token | quoted-string | |||
Defined in [RFC5987]: | Defined in [RFC5987]: | |||
ext-value = <ext-value, defined in [RFC5987], Section 3.2> | ext-value = <ext-value, defined in [RFC5987], Section 3.2> | |||
Header field values with multiple instances of the same parameter | Content-Disposition header field values with multiple instances of | |||
name are invalid. | the same parameter name are invalid. | |||
Note that due to the rules for implied linear whitespace (Section 2.1 | Note that due to the rules for implied linear whitespace (Section 2.1 | |||
of [RFC2616]), OPTIONAL whitespace can appear between words (token or | of [RFC2616]), OPTIONAL whitespace can appear between words (token or | |||
quoted-string) and separator characters. | quoted-string) and separator characters. | |||
Furthermore note that the format used for ext-value allows specifying | Furthermore, note that the format used for ext-value allows | |||
a natural language; this is of limited use for filenames and is | specifying a natural language (e.g., "en"); this is of limited use | |||
likely to be ignored by recipients. | for filenames and is likely to be ignored by recipients. | |||
4.2. Disposition Type | 4.2. Disposition Type | |||
If the disposition type matches "attachment" (case-insensitively), | If the disposition type matches "attachment" (case-insensitively), | |||
this indicates that the recipient should prompt the user to save the | this indicates that the recipient should prompt the user to save the | |||
response locally, rather than process it normally (as per its media | response locally, rather than process it normally (as per its media | |||
type). | type). | |||
On the other hand, if it matches "inline" (case-insensitively), this | On the other hand, if it matches "inline" (case-insensitively), this | |||
implies default processing. Therefore, the disposition type "inline" | implies default processing. Therefore, the disposition type "inline" | |||
skipping to change at page 6, line 52 ¶ | skipping to change at page 5, line 52 ¶ | |||
Many user agent implementations predating this specification do not | Many user agent implementations predating this specification do not | |||
understand the "filename*" parameter. Therefore, when both | understand the "filename*" parameter. Therefore, when both | |||
"filename" and "filename*" are present in a single header field | "filename" and "filename*" are present in a single header field | |||
value, recipients SHOULD pick "filename*" and ignore "filename". | value, recipients SHOULD pick "filename*" and ignore "filename". | |||
This way, senders can avoid special-casing specific user agents by | This way, senders can avoid special-casing specific user agents by | |||
sending both the more expressive "filename*" parameter, and the | sending both the more expressive "filename*" parameter, and the | |||
"filename" parameter as fallback for legacy recipients (see Section 5 | "filename" parameter as fallback for legacy recipients (see Section 5 | |||
for an example). | for an example). | |||
It is essential that recipients treat the specified filename as | It is essential that recipients treat the specified filename as | |||
advisory only, thus be very careful in extracting the desired | advisory only, and thus be very careful in extracting the desired | |||
information. In particular: | information. In particular: | |||
o When the value contains path separator characters ("\" or "/"), | o Recipients MUST NOT be able to write into any location other than | |||
recipients SHOULD ignore all but the last path segment. This | one to which they are specifically entitled. To illustrate the | |||
prevents unintentional overwriting of well-known file system | problem, consider the consequences of being able to overwrite | |||
locations (such as "/etc/passwd"). | well-known system locations (such as "/etc/passwd"). One strategy | |||
to achieve this is to never trust folder name information in the | ||||
filename parameter, for instance by stripping all but the last | ||||
path segment and only considering the actual filename (where 'path | ||||
segments' are the components of the field value delimited by the | ||||
path separator characters "\" and "/"). | ||||
o Many platforms do not use Internet Media Types ([RFC2046]) to hold | o Many platforms do not use Internet Media Types ([RFC2046]) to hold | |||
type information in the file system, but rely on filename | type information in the file system, but rely on filename | |||
extensions instead. Trusting the server-provided file extension | extensions instead. Trusting the server-provided file extension | |||
could introduce a privilege escalation when the saved file is | could introduce a privilege escalation when the saved file is | |||
later opened (consider ".exe"). Thus, recipients need to ensure | later opened (consider ".exe"). Thus, recipients that make use of | |||
that a file extension is used that is safe, optimally matching the | file extensions to determine the media type MUST ensure that a | |||
media type of the received payload. | file extension is used that is safe, optimally matching the media | |||
type of the received payload. | ||||
o Recipients are advised to strip or replace character sequences | o Recipients SHOULD strip or replace character sequences that are | |||
that are known to cause confusion both in user interfaces and in | known to cause confusion both in user interfaces and in filenames, | |||
filenames, such as control characters and leading and trailing | such as control characters and leading and trailing whitespace. | |||
whitespace. | ||||
o Other aspects recipients need to be aware of are names that have a | o Other aspects recipients need to be aware of are names that have a | |||
special meaning in the file system or in shell commands, such as | special meaning in the file system or in shell commands, such as | |||
"." and "..", "~", "|", and also device names. | "." and "..", "~", "|", and also device names. Recipients SHOULD | |||
ignore or substitute names like these. | ||||
Note: Many user agents do not properly handle the escape character | Note: Many user agents do not properly handle the escape character | |||
"\" when using the quoted-string form. Furthermore, some user | "\" when using the quoted-string form. Furthermore, some user | |||
agents erroneously try to perform unescaping of "percent" escapes | agents erroneously try to perform unescaping of "percent" escapes | |||
(see Appendix C.2), and thus might misinterpret filenames | (see Appendix C.2), and thus might misinterpret filenames | |||
containing the percent character followed by two hex digits. | containing the percent character followed by two hex digits. | |||
4.4. Disposition Parameter: Extensions | 4.4. Disposition Parameter: Extensions | |||
To enable future extensions, recipients SHOULD ignore unrecognized | To enable future extensions, recipients SHOULD ignore unrecognized | |||
skipping to change at page 8, line 7 ¶ | skipping to change at page 7, line 7 ¶ | |||
4.5. Extensibility | 4.5. Extensibility | |||
Note that Section 9 of [RFC2183] defines IANA registries both for | Note that Section 9 of [RFC2183] defines IANA registries both for | |||
disposition types and disposition parameters. This registry is | disposition types and disposition parameters. This registry is | |||
shared by different protocols using Content-Disposition, such as MIME | shared by different protocols using Content-Disposition, such as MIME | |||
and HTTP. Therefore, not all registered values may make sense in the | and HTTP. Therefore, not all registered values may make sense in the | |||
context of HTTP. | context of HTTP. | |||
5. Examples | 5. Examples | |||
Direct UA to show "save as" dialog, with a filename of | Direct the UA to show "save as" dialog, with a filename of | |||
"example.html": | "example.html": | |||
Content-Disposition: Attachment; filename=example.html | Content-Disposition: Attachment; filename=example.html | |||
Direct UA to behave as if the Content-Disposition header field wasn't | Direct the UA to behave as if the Content-Disposition header field | |||
present, but to remember the filename "an example.html" for a | wasn't present, but to remember the filename "an example.html" for a | |||
subsequent save operation: | subsequent save operation: | |||
Content-Disposition: INLINE; FILENAME= "an example.html" | Content-Disposition: INLINE; FILENAME= "an example.html" | |||
Note: this uses the quoted-string form so that the space character | Note: This uses the quoted-string form so that the space character | |||
can be included. | can be included. | |||
Direct UA to show "save as" dialog, with a filename containing the | Direct the UA to show "save as" dialog, with a filename containing | |||
Unicode character U+20AC (EURO SIGN): | the Unicode character U+20AC (EURO SIGN): | |||
Content-Disposition: attachment; | Content-Disposition: attachment; | |||
filename*= UTF-8''%e2%82%ac%20rates | filename*= UTF-8''%e2%82%ac%20rates | |||
Here, the encoding defined in [RFC5987] is also used to encode the | Here, the encoding defined in [RFC5987] is also used to encode the | |||
non-ISO-8859-1 character. | non-ISO-8859-1 character. | |||
Same as above, but adding the "filename" parameter for compatibility | This example is the same as the one above, but adding the "filename" | |||
with user agents not implementing RFC 5987: | parameter for compatibility with user agents not implementing | |||
RFC 5987: | ||||
Content-Disposition: attachment; | Content-Disposition: attachment; | |||
filename="EURO rates"; | filename="EURO rates"; | |||
filename*=utf-8''%e2%82%ac%20rates | filename*=utf-8''%e2%82%ac%20rates | |||
Note: those user agents that do not support the RFC 5987 encoding | Note: Those user agents that do not support the RFC 5987 encoding | |||
ignore "filename*" when it occurs after "filename". | ignore "filename*" when it occurs after "filename". | |||
6. Internationalization Considerations | 6. Internationalization Considerations | |||
The "filename*" parameter (Section 4.3), using the encoding defined | The "filename*" parameter (Section 4.3), using the encoding defined | |||
in [RFC5987], allows the server to transmit characters outside the | in [RFC5987], allows the server to transmit characters outside the | |||
ISO-8859-1 character set, and also to optionally specify the language | ISO-8859-1 character set, and also to optionally specify the language | |||
in use. | in use. | |||
Future parameters might also require internationalization, in which | Future parameters might also require internationalization, in which | |||
case the same encoding can be used. | case the same encoding can be used. | |||
7. Security Considerations | 7. Security Considerations | |||
Using server-supplied information for constructing local filenames | Using server-supplied information for constructing local filenames | |||
introduces many risks. These are summarized in Section 4.3. | introduces many risks. These are summarized in Section 4.3. | |||
Furthermore, implementers also ought to be aware of the Security | Furthermore, implementers ought to be aware of the security | |||
Considerations applying to HTTP (see Section 15 of [RFC2616]), and | considerations applying to HTTP (see Section 15 of [RFC2616]), and | |||
also the parameter encoding defined in [RFC5987] (see Section 5). | also the parameter encoding defined in [RFC5987] (see Section 5). | |||
8. IANA Considerations | 8. IANA Considerations | |||
8.1. Registry for Disposition Values and Parameter | 8.1. Registry for Disposition Values and Parameters | |||
This specification does not introduce any changes to the registration | This specification does not introduce any changes to the registration | |||
procedures for disposition values and parameters that are defined in | procedures for disposition values and parameters that are defined in | |||
Section 9 of [RFC2183]. | Section 9 of [RFC2183]. | |||
8.2. Header Field Registration | 8.2. Header Field Registration | |||
This document updates the definition of the Content-Disposition HTTP | This document updates the definition of the Content-Disposition HTTP | |||
header field in the permanent HTTP header field registry (see | header field in the permanent HTTP header field registry (see | |||
[RFC3864]). | [RFC3864]). | |||
skipping to change at page 9, line 38 ¶ | skipping to change at page 8, line 38 ¶ | |||
Header field name: Content-Disposition | Header field name: Content-Disposition | |||
Applicable protocol: http | Applicable protocol: http | |||
Status: standard | Status: standard | |||
Author/Change controller: IETF | Author/Change controller: IETF | |||
Specification document: this specification (Section 4) | Specification document: this specification (Section 4) | |||
Related information: none | ||||
9. Acknowledgements | 9. Acknowledgements | |||
Thanks to Adam Barth, Rolf Eike Beer, Bjoern Hoehrmann, Alfred | Thanks to Adam Barth, Rolf Eike Beer, Stewart Bryant, Bjoern | |||
Hoenes, Roar Lauritzsen, Henrik Nordstrom, and Mark Nottingham for | Hoehrmann, Alfred Hoenes, Roar Lauritzsen, Alexey Melnikov, Henrik | |||
their valuable feedback. | Nordstrom, and Mark Nottingham for their valuable feedback. | |||
10. References | 10. References | |||
10.1. Normative References | 10.1. Normative References | |||
[ISO-8859-1] International Organization for Standardization, | [ISO-8859-1] International Organization for Standardization, | |||
"Information technology -- 8-bit single-byte coded | "Information technology -- 8-bit single-byte coded | |||
graphic character sets -- Part 1: Latin alphabet No. | graphic character sets -- Part 1: Latin alphabet | |||
1", ISO/IEC 8859-1:1998, 1998. | No. 1", ISO/IEC 8859-1:1998, 1998. | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, March 1997. | Requirement Levels", BCP 14, RFC 2119, March 1997. | |||
[RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., | [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., | |||
Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext | Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext | |||
Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999. | Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999. | |||
[RFC5987] Reschke, J., "Character Set and Language Encoding for | [RFC5987] Reschke, J., "Character Set and Language Encoding for | |||
Hypertext Transfer Protocol (HTTP) Header Field | Hypertext Transfer Protocol (HTTP) Header Field | |||
skipping to change at page 10, line 26 ¶ | skipping to change at page 9, line 27 ¶ | |||
10.2. Informative References | 10.2. Informative References | |||
[RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet | [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet | |||
Mail Extensions (MIME) Part Two: Media Types", | Mail Extensions (MIME) Part Two: Media Types", | |||
RFC 2046, November 1996. | RFC 2046, November 1996. | |||
[RFC2047] Moore, K., "MIME (Multipurpose Internet Mail | [RFC2047] Moore, K., "MIME (Multipurpose Internet Mail | |||
Extensions) Part Three: Message Header Extensions for | Extensions) Part Three: Message Header Extensions for | |||
Non-ASCII Text", RFC 2047, November 1996. | Non-ASCII Text", RFC 2047, November 1996. | |||
[RFC2183] Troost, R., Dorner, S., and K. Moore, "Communicating | [RFC2183] Troost, R., Dorner, S., and K. Moore, Ed., | |||
Presentation Information in Internet Messages: The | "Communicating Presentation Information in Internet | |||
Content-Disposition Header Field", RFC 2183, | Messages: The Content-Disposition Header Field", | |||
August 1997. | RFC 2183, August 1997. | |||
[RFC2231] Freed, N. and K. Moore, "MIME Parameter Value and | [RFC2231] Freed, N. and K. Moore, "MIME Parameter Value and | |||
Encoded Word Extensions: Character Sets, Languages, and | Encoded Word Extensions: Character Sets, Languages, and | |||
Continuations", RFC 2231, November 1997. | Continuations", RFC 2231, November 1997. | |||
[RFC2388] Masinter, L., "Returning Values from Forms: multipart/ | [RFC2388] Masinter, L., "Returning Values from Forms: multipart/ | |||
form-data", RFC 2388, August 1998. | form-data", RFC 2388, August 1998. | |||
[RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration | [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration | |||
Procedures for Message Header Fields", BCP 90, | Procedures for Message Header Fields", BCP 90, | |||
RFC 3864, September 2004. | RFC 3864, September 2004. | |||
[RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, | [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, | |||
"Uniform Resource Identifier (URI): Generic Syntax", | "Uniform Resource Identifier (URI): Generic Syntax", | |||
STD 66, RFC 3986, January 2005. | STD 66, RFC 3986, January 2005. | |||
[US-ASCII] American National Standards Institute, "Coded Character | ||||
Set -- 7-bit American Standard Code for Information | ||||
Interchange", ANSI X3.4, 1986. | ||||
Appendix A. Changes from the RFC 2616 Definition | Appendix A. Changes from the RFC 2616 Definition | |||
Compared to Section 19.5.1 of [RFC2616], the following normative | Compared to Section 19.5.1 of [RFC2616], the following normative | |||
changes reflecting actual implementations have been made: | changes reflecting actual implementations have been made: | |||
o According to RFC 2616, the disposition type "attachment" only | o According to RFC 2616, the disposition type "attachment" only | |||
applies to content of type "application/octet-stream". This | applies to content of type "application/octet-stream". This | |||
restriction has been removed, because recipients in practice do | restriction has been removed, because recipients in practice do | |||
not check the content type, and it also discourages properly | not check the content type, and it also discourages properly | |||
declaring the media type. | declaring the media type. | |||
skipping to change at page 11, line 19 ¶ | skipping to change at page 10, line 27 ¶ | |||
This would be an exceptional parameter syntax, and also doesn't | This would be an exceptional parameter syntax, and also doesn't | |||
reflect actual use. | reflect actual use. | |||
o The definition for the disposition type "inline" ([RFC2183], | o The definition for the disposition type "inline" ([RFC2183], | |||
Section 2.1) has been re-added with a suggestion for its | Section 2.1) has been re-added with a suggestion for its | |||
processing. | processing. | |||
o This specification requires support for the extended parameter | o This specification requires support for the extended parameter | |||
encoding defined in [RFC5987]. | encoding defined in [RFC5987]. | |||
Appendix B. Differences compared to RFC 2183 | Appendix B. Differences Compared to RFC 2183 | |||
Section 2 of [RFC2183] defines several additional disposition | Section 2 of [RFC2183] defines several additional disposition | |||
parameters: "creation-date", "modification-date", "quoted-date-time", | parameters: "creation-date", "modification-date", "quoted-date-time", | |||
and "size". The majority of user agents does not implement these, | and "size". The majority of user agents do not implement these; | |||
thus they have been omitted from this specification. | thus, they have been omitted from this specification. | |||
Appendix C. Alternative Approaches to Internationalization | Appendix C. Alternative Approaches to Internationalization | |||
By default, HTTP header field parameters cannot carry characters | By default, HTTP header field parameters cannot carry characters | |||
outside the ISO-8859-1 ([ISO-8859-1]) character encoding (see | outside the ISO-8859-1 ([ISO-8859-1]) character encoding (see | |||
[RFC2616], Section 2.2). For the "filename" parameter, this of | [RFC2616], Section 2.2). For the "filename" parameter, this of | |||
course is an unacceptable restriction. | course is an unacceptable restriction. | |||
Unfortunately, user agent implementers have not managed to come up | Unfortunately, user agent implementers have not managed to come up | |||
with an interoperable approach, although the IETF Standards Track | with an interoperable approach, although the IETF Standards Track | |||
specifies exactly one solution ([RFC2231], clarified and profiled for | specifies exactly one solution ([RFC2231], clarified and profiled for | |||
HTTP in [RFC5987]). | HTTP in [RFC5987]). | |||
For completeness, the sections below describe the various approaches | For completeness, the sections below describe the various approaches | |||
that have been tried, and explains how they are inferior to the RFC | that have been tried, and explain how they are inferior to the | |||
5987 encoding used in this specification. | RFC 5987 encoding used in this specification. | |||
C.1. RFC 2047 Encoding | C.1. RFC 2047 Encoding | |||
RFC 2047 defines an encoding mechanism for header fields, but this | RFC 2047 defines an encoding mechanism for header fields, but this | |||
encoding is not supposed to be used for header field parameters - see | encoding is not supposed to be used for header field parameters -- | |||
Section 5 of [RFC2047]: | see Section 5 of [RFC2047]: | |||
An 'encoded-word' MUST NOT appear within a 'quoted-string'. | An 'encoded-word' MUST NOT appear within a 'quoted-string'. | |||
... | ... | |||
An 'encoded-word' MUST NOT be used in parameter of a MIME Content- | An 'encoded-word' MUST NOT be used in parameter of a MIME Content- | |||
Type or Content-Disposition field, or in any structured field body | Type or Content-Disposition field, or in any structured field body | |||
except within a 'comment' or 'phrase'. | except within a 'comment' or 'phrase'. | |||
In practice, some user agents implement the encoding, some do not | In practice, some user agents implement the encoding, some do not | |||
(exposing the encoded string to the user), and some get confused by | (exposing the encoded string to the user), and some get confused by | |||
it. | it. | |||
C.2. Percent Encoding | C.2. Percent Encoding | |||
Some user agents accept percent encoded ([RFC3986], Section 2.1) | Some user agents accept percent-encoded ([RFC3986], Section 2.1) | |||
sequences of characters. The character encoding being used for | sequences of characters. The character encoding being used for | |||
decoding depends on various factors, including the encoding of the | decoding depends on various factors, including the encoding of the | |||
referring page, the user agent's locale, its configuration, and also | referring page, the user agent's locale, its configuration, and also | |||
the actual value of the parameter. | the actual value of the parameter. | |||
In practice, this is hard to use because those user agents that do | In practice, this is hard to use because those user agents that do | |||
not support it will display the escaped character sequence to the | not support it will display the escaped character sequence to the | |||
user. For those user agents that do implement this it is difficult | user. For those user agents that do implement this, it is difficult | |||
to predict what character encoding they actually expect. | to predict what character encoding they actually expect. | |||
C.3. Encoding Sniffing | C.3. Encoding Sniffing | |||
Some user agents inspect the value (which defaults to ISO-8859-1 for | Some user agents inspect the value (which defaults to ISO-8859-1 for | |||
the quoted-string form) and switch to UTF-8 when it seems to be more | the quoted-string form) and switch to UTF-8 when it seems to be more | |||
likely to be the correct interpretation. | likely to be the correct interpretation. | |||
As with the approaches above, this is not interoperable and | As with the approaches above, this is not interoperable and, | |||
furthermore risks misinterpreting the actual value. | furthermore, risks misinterpreting the actual value. | |||
C.4. Implementations (to be removed by RFC Editor before publication) | ||||
Unfortunately, as of February 2011, neither the encoding defined in | ||||
RFCs 2231 and 5987, nor any of the alternate approaches discussed | ||||
above was implemented interoperably. Thus, this specification | ||||
recommends the approach defined in RFC 5987, which at least has the | ||||
advantage of actually being specified properly. | ||||
The table below shows the implementation support for the various | ||||
approaches: | ||||
+---------------+------------+--------+--------------+--------------+ | ||||
| User Agent | RFC | RFC | Percent | Encoding | | ||||
| | 2231/5987 | 2047 | Encoding | Sniffing | | ||||
+---------------+------------+--------+--------------+--------------+ | ||||
| Chrome | yes | yes | yes | yes | | ||||
| Firefox | yes (*) | yes | no | yes | | ||||
| Internet | yes (**) | no | yes | no | | ||||
| Explorer | | | | | | ||||
| Konqueror | yes | no | no | no | | ||||
| Opera | yes | no | no | no | | ||||
| Safari | no | no | no | yes | | ||||
+---------------+------------+--------+--------------+--------------+ | ||||
(*) Does not implement the fallback behavior to "filename" described | ||||
in Section 4.3; a fix is planned for Firefox 5. | ||||
(**) Starting with IE9RC, but only implements UTF-8. | ||||
Appendix D. Advice on Generating Content-Disposition Header Fields | Appendix D. Advice on Generating Content-Disposition Header Fields | |||
To successfully interoperate with existing and future user agents, | To successfully interoperate with existing and future user agents, | |||
senders of the Content-Disposition header field are advised to: | senders of the Content-Disposition header field are advised to: | |||
o Include a "filename" parameter when US-ASCII is sufficiently | o Include a "filename" parameter when US-ASCII ([US-ASCII]) is | |||
expressive. | sufficiently expressive. | |||
o Use the 'token' form of the filename parameter only when it does | o Use the 'token' form of the filename parameter only when it does | |||
not contain disallowed characters (e.g., spaces); in such cases, | not contain disallowed characters (e.g., spaces); in such cases, | |||
the quoted-string form should be used. | the quoted-string form should be used. | |||
o Avoid including the percent character followed by two hexadecimal | o Avoid including the percent character followed by two hexadecimal | |||
characters (e.g., %A9) in the filename parameter, since some | characters (e.g., %A9) in the filename parameter, since some | |||
existing implementations consider it to be an escape character, | existing implementations consider it to be an escape character, | |||
while others will pass it through unchanged. | while others will pass it through unchanged. | |||
o Avoid including the "\" character in the quoted-string form of the | o Avoid including the "\" character in the quoted-string form of the | |||
filename parameter, as escaping is not implemented by some user | filename parameter, as escaping is not implemented by some user | |||
agents, and can be considered as an illegal path character. | agents, and "\" can be considered an illegal path character. | |||
o Avoid using non-ASCII characters in the filename parameter. | o Avoid using non-ASCII characters in the filename parameter. | |||
Although most existing implementations will decode them as ISO- | Although most existing implementations will decode them as | |||
8859-1, some will apply heuristics to detect UTF-8, and thus might | ISO-8859-1, some will apply heuristics to detect UTF-8, and thus | |||
fail on certain names. | might fail on certain names. | |||
o Include a "filename*" parameter where the desired filename cannot | o Include a "filename*" parameter where the desired filename cannot | |||
be expressed faithfully using the "filename" form. Note that | be expressed faithfully using the "filename" form. Note that | |||
legacy user agents will not process this, and will fall back to | legacy user agents will not process this, and will fall back to | |||
using the "filename" parameter's content. | using the "filename" parameter's content. | |||
o When a "filename*" parameter is sent, to also generate a | o When a "filename*" parameter is sent, to also generate a | |||
"filename" parameter as a fallback for user agents that do not | "filename" parameter as a fallback for user agents that do not | |||
support the "filename*" form, if possible. This can be done by | support the "filename*" form, if possible. This can be done by | |||
substituting characters with US-ASCII sequences (e.g., Unicode | substituting characters with US-ASCII sequences (e.g., Unicode | |||
character point U+00E4 (LATIN SMALL LETTER A WITH DIARESIS) by | character point U+00E4 (LATIN SMALL LETTER A WITH DIARESIS) by | |||
"ae"). Note that this may not be possible in some locales. | "ae"). Note that this may not be possible in some locales. | |||
o When a "filename" parameter is included as a fallback (as per | o When a "filename" parameter is included as a fallback (as per | |||
above), "filename" should occur first, due to parsing problems in | above), "filename" should occur first, due to parsing problems in | |||
some existing implementations. [[fallbackbug: Firefox is known to | some existing implementations. | |||
pick the wrong parameter; a bug fix is scheduled for Firefox 5. | ||||
--jre]] | ||||
o Use UTF-8 as the encoding of the "filename*" parameter, when | o Use UTF-8 as the encoding of the "filename*" parameter, when | |||
present, because at least one existing implementation only | present, because at least one existing implementation only | |||
implements that encoding. | implements that encoding. | |||
Note that this advice is based upon UA behaviour at the time of | Note that this advice is based upon UA behavior at the time of | |||
writing, and might be superseded. | writing, and might be superseded. At the time of publication of this | |||
<http://purl.org/NET/http/content-disposition-tests> provides an | document, <http://purl.org/NET/http/content-disposition-tests> | |||
overview of current levels of support in various implementations. | provides an overview of current levels of support in various | |||
implementations. | ||||
Appendix E. Change Log (to be removed by RFC Editor before publication) | ||||
Note: the issues names in the change log entries for | ||||
draft-reschke-rfc2183-in-http refer to <http://greenbytes.de/tech/ | ||||
webdav/draft-reschke-rfc2183-in-http-issues.html>. | ||||
E.1. Since draft-reschke-rfc2183-in-http-00 | ||||
Adjust terminology ("header" -> "header field"). Update rfc2231-in- | ||||
http reference. | ||||
E.2. Since draft-reschke-rfc2183-in-http-01 | ||||
Update rfc2231-in-http reference. Actually define the "filename" | ||||
parameter. Add internationalization considerations. Add examples | ||||
using the RFC 5987 encoding. Add overview over other approaches, | ||||
plus a table reporting implementation status. Add and resolve issue | ||||
"nodep2183". Add issues "asciivsiso", "deplboth", "quoted", and | ||||
"registry". | ||||
E.3. Since draft-reschke-rfc2183-in-http-02 | ||||
Add and close issue "docfallback". Close issues "asciivsiso", | ||||
"deplboth", "quoted", and "registry". | ||||
E.4. Since draft-reschke-rfc2183-in-http-03 | ||||
Updated to be a Working Draft of the IETF HTTPbis Working Group. | ||||
E.5. Since draft-ietf-httpbis-content-disp-00 | ||||
Closed issues: | ||||
o <http://tools.ietf.org/wg/httpbis/trac/ticket/242>: "handling of | ||||
unknown disposition types" | ||||
Slightly updated the notes about the proposed fallback behavior. | ||||
E.6. Since draft-ietf-httpbis-content-disp-01 | ||||
Various editorial improvements. | ||||
E.7. Since draft-ietf-httpbis-content-disp-02 | ||||
Closed issues: | ||||
o <http://tools.ietf.org/wg/httpbis/trac/ticket/244>: "state that | ||||
repeating parameters are invalid" | ||||
o <http://tools.ietf.org/wg/httpbis/trac/ticket/245>: "warn about | ||||
%xx in filenames being misinterpreted" | ||||
o <http://tools.ietf.org/wg/httpbis/trac/ticket/246>: "mention | ||||
control chars when talking about postprecessing the filename | ||||
parameter" | ||||
Update Appendix C.4; Opera 10.63 RC implements the recommended | ||||
fallback behavior. | ||||
E.8. Since draft-ietf-httpbis-content-disp-03 | ||||
Closed issues: | ||||
o <http://tools.ietf.org/wg/httpbis/trac/ticket/252>: | ||||
"'modification-date' *is* implemented in Konq 4.5" | ||||
o <http://tools.ietf.org/wg/httpbis/trac/ticket/253>: "clarify what | ||||
LWS means for the Content-Disp grammar" | ||||
o <http://tools.ietf.org/wg/httpbis/trac/ticket/258>: "Avoid passive | ||||
voice in message requirements" | ||||
o <http://tools.ietf.org/wg/httpbis/trac/ticket/263>: "text about | ||||
historical percent-decoding unclear" | ||||
o <http://tools.ietf.org/wg/httpbis/trac/ticket/264>: "add | ||||
explanation of language tagging" | ||||
o <http://tools.ietf.org/wg/httpbis/trac/ticket/265>: "Clarify that | ||||
C-D spec does not apply to multipart upload" | ||||
E.9. Since draft-ietf-httpbis-content-disp-04 | ||||
Updated implementation information (Chrome 9 implements RFC 5987, IE | ||||
9 RC implements it for UTF-8 only). | ||||
Clarify who requirements are on, add a section discussing conformance | ||||
and handling of invalid field values in general. | ||||
Closed issues: | ||||
o <http://trac.tools.ietf.org/wg/httpbis/trac/ticket/243>: "avoid | ||||
stating ISO-8859-1 default for header param" (the default is still | ||||
mentioned, but it was clarified what it applies to). | ||||
o <http://tools.ietf.org/wg/httpbis/trac/ticket/272>: "Path | ||||
Separator Characters" | ||||
E.10. Since draft-ietf-httpbis-content-disp-05 | ||||
Editorial changes: Fixed two typos where the new Conformance section | ||||
said "Content-Location" instead of "Content-Disposition". Cleaned up | ||||
terminology ("user agent", "recipient", "sender", "message body", | ||||
...). Stated what the escape character for quoted-string is. | ||||
Explained a use case for "inline" disposition type. Updated | ||||
implementation notes with respect to the fallback behavior. | ||||
Added appendix "Advice on Generating Content-Disposition Header | ||||
Fields". | ||||
Index | ||||
C | ||||
Content-Disposition header field 5 | ||||
H | ||||
Header Fields | ||||
Content-Disposition 5 | ||||
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. 49 change blocks. | ||||
284 lines changed or deleted | 120 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/ |