是否可以在HTTP标头字段中包含多个CRLF?

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 ],JavaGo等语言.

我设法找到这样一个标题的唯一具体例子是在这个technet博客文章中有这个图像:

http标题行折叠

请注意标题中的黄色0d 0a(回车,换行)Content-Type.