【发布时间】:2017-02-25 19:46:07
【问题描述】:
HTTP/1.1 规范对具有多个头字段的请求定义如下:
发件人不得生成具有相同字段的多个标头字段 消息中的名称,除非该名称的整个字段值 标头字段被定义为一个逗号分隔的列表 [即,#(values)] 或者标头字段是一个众所周知的例外(如下所述)。
收件人可以将多个标题字段与同一字段组合 名称转换为一个“字段名称:字段值”对,而不更改 消息的语义,通过将每个后续字段值附加到 按顺序组合的字段值,以逗号分隔。命令 其中接收到的具有相同字段名称的头字段是 因此对组合场的解释很重要 价值;代理不得更改这些字段值的顺序 转发消息。
用于解析请求:
- 是否需要先合并标头(以逗号分隔),然后验证合并的标头?
或
- 在将它们合并为一个标头之前,是否需要分别验证每个标头?
或
- 这是未定义的,我可以选择我喜欢的任何选项吗?
这会产生影响的一个例子是:
GET / HTTP/1.1
Host: 127.0.0.1
Upgrade: foo
Upgrade:
Upgrade: bar
这里,第二个单独的标头本身是无效的(因为升级标头需要至少 1 个协议)。但是,所有三个标头的组合变为foo,,bar,这是允许的。
当规范说它需要至少 1 项时:这是针对完整的组合标头,还是单独针对每个标头?
【问题讨论】:
-
你说“
foo,,bar这是允许的”;Upgrade采用逗号分隔的标记,中间的空字符串不是有效标记。你能澄清什么会允许这样做吗?否则,您提供的两种形式均无效。 -
规范说“发件人不得生成空列表元素”,但建议服务器可以容忍这种(并不少见)错误。对于验证,而不是真实世界的服务器,我希望解析的容忍度较低。
-
@Joe:这是关于服务器端的,规范明确列出了允许使用空列表元素的类似示例,只要它们不计入元素总数。
-
(这与客户端的规范一致性无关——我正在构建服务器端并想检查什么是好的,什么应该给出 400)
标签: validation http parsing http-headers