以下是最新HTTP RFC 7230中的HTTP消息定义
HTTP-message = start-line
*( header-field CRLF )
CRLF
[ message-body ]
以下是header-field的定义,
header-field = field-name ":" OWS field-value OWS
field-name = token
field-value = *( field-content / obs-fold )
field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]
field-vchar = VCHAR / obs-text
obs-fold = CRLF 1*( SP / HTAB )
..和
obs-text = %x80-FF
..和ABNF's:
VCHAR = %x21-7E
; visible (printing) characters
正如我们所看到的,场值可能有多个障碍折叠,而障碍折叠有一个CRLF。我认为CRLF是标题行的结尾对我来说很奇怪。是否有一个例子表明多个CRLF被编码到一个标题字段中?或者,我是否误解了这个定义?
答案 0 :(得分:17)
您对标准的理解是正确的。过去,RFC 2616下支持多行标头值。此功能称为“折叠线”:
如果延续行以空格或水平制表符开头,则HTTP / 1.1标题字段值可以折叠到多行上。所有线性空白区域(包括折叠)都具有与SP相同的语义。在解释字段值或将消息转发到下游之前,接收方可以用单个SP替换任何线性空白区域。
所以以下两种形式是等价的:
Header: value1, value2
Header: value1,
value2
较新的RFC 7230明确弃用此内容。事实上,“obs-fold”中的“obs”代表“过时”。
历史上,HTTP头字段值可以扩展到多个 通过在每个额外线之前的线与至少一个空格或 水平标签(obs-fold)。该规范弃用了这样的行 折叠除了消息/ http媒体类型(第8.3.1节)。一个 发送者不得生成包含行折叠的消息(即 具有包含与遮挡折叠规则匹配的任何字段值) 除非该消息是用于在消息/ http中打包 媒体类型。
所以尽管我在实践中从未见过这个功能(或者至少没有注意到它),但它确实存在。此外,似乎行折叠甚至没有完全弃用,并且仍然允许使用HTTP媒体类型标题。
标准HTTP标头解析器仍然支持多行标头,例如PHP [ arv ],Java和{{3} }。
我设法找到这样一个标题的唯一具体示例是在Go中有这个图像:
请注意0d 0a
标题内的黄色Content-Type
(回车,换行)。