从RFC2616 Sec4.2:
每个头字段包含一个名称后面跟着冒号(“:”)和字段值。
乍一看,这似乎将消息指定为格式不正确的不符合规范的类别中的空标题值。然而,在概述的增强的BNF形式表示
“#element”允许任何数目,包括零
由于这是用于指定Accept首部值的声明,看来空值是有效的。
解析空报头和报头只包含空格可能是因为从该规范以下方向的有问题的:
的场含量不包括任何前导或尾随LWS:前线性 白色空间中发生 字段值的第一个非空白字符或 字段值的最后一个非空白字符之后。可以在不改变字段值的语义的情况下移除这种前导或尾随的LWS。在解释 字段值或向下游转发消息之前,在 字段内容之间发生的任何LWS可能被替换为单个SP。
恕我直言,发送一个空头是完全没有意义的。不应该这样做,解析器可能无法正确解析这些头文件。传统上,谁想要避免与不符合要求的部件打交道时,这种限制人指定的“伪空”的价值观是这样的:
X-MyCustomHeader: ""
如果你只是想验证一个报头字段被一些发布尔开关的形式,可以考虑发送一个像上面那样的占位符值,而不是一个空值。
更新
我想我是没有直接回答这个问题很清楚:在一个空的接受头的情况下,你真的有两个选择:
- 发送
406 Not Acceptable
响应通知客户您不提供任何空白Accept值(duh)的内容类型。
这是合理的,但不能被RFC2616 Sec14.1必需的:
如果Accept首部字段的存在,并且如果服务器不能发送 响应根据该结合接受字段 值这是可以接受,那么服务器应该发送一个406(不可接受的)响应。
- 或者,因为这不是必需的,这是极不可能的用户不接受任何内容类型(否则,他们为什么还要发送请求?)......我会建议处理空值
Accept:
值(如果消息拒绝不是选项),与Accept: */*
相同。
我不同意空标题格式不正确,特别是规范本身引用了空标题(请参阅我的Accept-Encoding示例)。为了给出上下文,我正在开发python web中间件并考虑可能性以及如何对它们进行测试。我假设了''*/*'',这对我来说也是合理的。感谢您抽出宝贵的时间! –
我也认为''400错误请求'比'406不可接受'更合适,至少如果我们认为这违反了规范。在这种情况下,我们无法弄清客户实际接受的内容。 –
你知道,你对2616-2.1是对的 - '#element'表单确实表明空的标题值没问题。我将更新我的答案以反映这一点并避免错误信息。另外,我认为这或者是一个406响应 - 或者将它视为“Accept:*/*'有效。但可能不是400,因为它在技术上不是无效的信息。 – rdlowrey