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

是否可以在HTTP头字段中包含多个CRLF?,http,networking,network-programming,http-headers,network-protocols,Http,Networking,Network Programming,Http Headers,Network Protocols,下面是最新的HTTP RFC 7230中的HTTP消息定义 HTTP-message = start-line *( header-field CRLF ) CRLF [ message-body ] 下面是标题字段的定义 header-field = field-name ":" OWS field-value OWS field-name = token f

下面是最新的HTTP RFC 7230中的HTTP消息定义

 HTTP-message   = start-line
                  *( header-field CRLF )
                  CRLF
                  [ message-body ]
下面是标题字段的定义

 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
…和:


我们可以看到,字段值可以有多个obs折叠,obs折叠有一个CRLF。这对我来说很奇怪,因为我认为CRLF是头球线的终点。是否有将多个CRLF编码到一个标头字段的示例?或者,我是否误解了定义?

您对标准的理解是正确的。过去,在下支持多行标题值。此功能称为“折线”:

如果延续行以空格或水平制表符开头,HTTP/1.1标头字段值可以折叠到多行。所有线性空白(包括折叠)与SP具有相同的语义。在解释字段值或向下游转发消息之前,收件人可以用单个SP替换任何线性空白

因此,以下两种形式是等效的:

Header: value1, value2

较新的版本明确反对这一点。事实上,“obs折叠”中的“obs”代表“过时”

历史上,HTTP头字段值可以扩展到多个 通过在每一额外行之前至少添加一个空格或 水平选项卡(obs折叠)。本规范不推荐这种产品线 折叠,消息/http媒体类型内除外(第8.3.1节)。A. 发件人不得生成包含折线的邮件(即。, 包含与obs折叠规则匹配的任何字段值) 除非消息用于在消息/http中打包 媒体类型

因此,尽管我在实践中从未见过这个特性(或者至少没有注意到),但它确实存在。此外,行折叠似乎还没有完全被弃用,它仍然允许用于HTTP媒体类型头

多行标头仍然受标准HTTP标头解析器的支持,这些解析器使用的语言包括[]和

我能找到的唯一一个这样一个标题的具体例子是在这幅图中:


请注意
内容类型
标题中的黄色
0d 0a
(回车,换行)。

是否尝试在每个CRLF之前添加空格?它本身的一个空行表示HTTP头的结束。我没有做任何练习。我只是对头字段的ABNF定义是否正确感到困惑。因此,您要问的是,HTTP的RFC中是否存在错误——这是地球上使用最广泛、审查最广泛的信息传输协议之一。是的。但是,我不确定这是一个错误还是我的误解。@appleleaf,复制品?@Malt,OP在问“是否有一个例子,多个CRLF被编码到一个标题字段?”。您的示例仅显示一个CR LF HT序列。。。。换句话说,它没有回答这个问题。@Pacerier在Conten-Type头字段中有两个CRLF。一个是黄色的,在田野中间。另一个在字段的末尾,在下一个字段之前,作为正常的HTTP头字段分隔符。您指的是?如果是这样的话,OP不是这么说的。他说的是多个obs折叠,换句话说,不仅仅是“
CR
LF
”,而是“
CR
LF
HT
/
SP
”。红色圆圈是“
CR
LF
”和“
CR
LF
”。@Pacerier OP特别询问了“多个crlf..编码到一个标题字段中”。该示例显示内容类型字段中的CRLF,该字段也以CRLF结尾。是的,它不是多重的
obs折叠
,但我不认为这是问题所在。我知道这个答案有点旧,但是你写了
,而且行折叠似乎还没有完全被弃用,它仍然允许用于HTTP媒体类型头。
。HTTP媒体类型头是什么,是否有这样一个例子,使用现在不推荐的头行折叠?
Header: value1, value2
Header: value1,
        value2