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

时间:2015-07-06 03:00:15

标签: http networking network-programming http-headers network-protocols

以下是最新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被编码到一个标题字段中?或者,我是否误解了这个定义?

1 个答案:

答案 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中有这个图像:

http header line folding

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