app*_*eaf 11 networking network-programming http network-protocols http-headers
以下是最新HTTP RFC 7230中的HTTP消息定义
HTTP-message = start-line
*( header-field CRLF )
CRLF
[ message-body ]
Run Code Online (Sandbox Code Playgroud)
下面是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 )
Run Code Online (Sandbox Code Playgroud)
..和:
obs-text = %x80-FF
Run Code Online (Sandbox Code Playgroud)
..和ABNF的:
VCHAR = %x21-7E
; visible (printing) characters
Run Code Online (Sandbox Code Playgroud)
正如我们所看到的,场值可以有多个障碍折叠,而障碍折叠有一个CRLF.我认为CRLF是标题行的结尾对我来说很奇怪.是否有一个例子表明多个CRLF被编码到一个标题字段中?或者,我是否误解了这个定义?
Mal*_*alt 19
您对标准的理解是正确的.过去,RFC 2616支持多行标头值.此功能称为"折叠线":
如果连续行以空格或水平制表符开头,则HTTP/1.1标题字段值可以折叠到多行上.所有线性空白区域(包括折叠)都具有与SP相同的语义.在解释字段值或向下游转发消息之前,接收方可以用单个SP替换任何线性空白区域.
所以以下两种形式是等价的:
Header: value1, value2
Header: value1,
value2
Run Code Online (Sandbox Code Playgroud)
较新的RFC 7230明确地弃用了这个.事实上,"obs-fold"中的"obs"代表"过时".
历史上,HTTP头字段值可以通过在每个额外行之前用至少一个空格或水平制表符(obs-fold)在多行上扩展.除了在消息/ http媒体类型(第8.3.1节)中之外,此规范不推荐使用此类折叠.发件人不得生成包含行折叠的消息(即,具有包含与遮蔽折叠规则匹配的任何字段值),除非该消息用于在消息/ http媒体类型中打包.
因此,尽管我在实践中从未见过这个功能(或者至少没有注意到它),但它确实存在.此外,似乎甚至没有完全弃用行折叠,并且仍然允许HTTP媒体类型标头使用它.
标准HTTP头解析器仍然支持多行头,例如PHP [ arv ],Java和Go等语言.
我设法找到这样一个标题的唯一具体例子是在这个technet博客文章中有这个图像:
请注意标题中的黄色0d 0a
(回车,换行)Content-Type
.