【发布时间】:2018-05-21 02:34:01
【问题描述】:
在研究了HTTP/1.1 standard,特别是第 31 页和相关之后,我得出结论,任何 8 位八位字节都可以出现在 HTTP 标头值中。 IE。代码在 [0,255] 范围内的任何字符。
然而,我尝试过的 HTTP 服务器拒绝接收任何代码 > 127(或大多数 US-ASCII 不可打印字符)的内容。
这是标准中使用的语法摘录:
message-header = field-name ":" [ field-value ]
field-name = token
field-value = *( field-content | LWS )
field-content = <the OCTETs making up the field-value and consisting of
either *TEXT or combinations of token, separators, and
quoted-string>
CR = <US-ASCII CR, carriage return (13)>
LF = <US-ASCII LF, linefeed (10)>
SP = <US-ASCII SP, space (32)>
HT = <US-ASCII HT, horizontal-tab (9)>
CRLF = CR LF
LWS = [CRLF] 1*( SP | HT )
OCTET = <any 8-bit sequence of data>
CHAR = <any US-ASCII character (octets 0 - 127)>
CTL = <any US-ASCII control character (octets 0 - 31) and DEL (127)>
TEXT = <any OCTET except CTLs, but including LWS>
token = 1*<any CHAR except CTLs or separators>
separators = "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\"
| <"> | "/" | "[" | "]" | "?" | "=" | "{" | "}" | SP | HT
quoted-string = ( <"> *(qdtext | quoted-pair ) <"> )
qdtext = <any TEXT except <">>
quoted-pair = "\" CHAR
如您所见,field-content 可以是quoted-string,它是TEXT 的引用序列(即除" 和[0-8, 11-12, 14-31, 127] 范围内的值之外的任何8 位八位字节)或@987654332 @(\ 后跟 [0, 127] 范围内的任何值)。 IE。任何 8 位 char 序列都可以通过对其进行 en-quoting 并在特殊符号前加上 \ 来传递。
(请注意,标准不会以任何特殊方式对待NUL(0x00) char)
但是,很明显,要么我尝试的所有服务器都不符合标准,要么标准自 1999 年以来发生了变化,或者我无法正确阅读。
那么... HTTP 标头值中允许使用哪些字符以及为什么?
附:这一切背后的原因:我正在寻找一种在 HTTP 标头值中传递 utf-8 编码序列的方法(如果可能,无需额外编码)。
【问题讨论】:
-
看起来没有人真正认真对待这部分标准。我最终得到了 url-encoding 标头值。
-
注意
field-names中的separators也需要编码。此外,如果您使用 WinHTTP——您必须在field-name中编码单引号,否则请求将失败。 -
提示:RFC 2616 完全不相关。请参阅 RFC 7230。
-
RFC 7230 没有重写 RFC 2616 - 它澄清了它谢天谢地。 [tools.ietf.org/html/rfc7230#section-3.2] (§3.2) 使用标记 VCHAR 来指定允许的字段内容; VCHAR 在 [tools.ietf.org/html/rfc7230#section-1.2] (§1.2) 中定义为任何可见的 USASCII 字符。这个明确的标记消除了像 RFC 2616 那样花时间剔除不可见字符的需要,但没有扩展 1999/1982 的定义以包括 128-255。 OP 的问题是“HTTP 标头值中允许哪些字符以及为什么”。我已经回答了这个问题,并附有参考资料。
-
@C.M. - 是的,见rfc-editor.org/info/rfc2616
标签: http http-headers