5. 字段语法
每个字段行 (field line) 由一个不区分大小写的字段名称, 一个冒号 (":"), 可选的前导空白, 字段行值, 以及可选的尾随空白组成.
field-line = field-name ":" OWS field-value OWS
字段值内部的解析规则在 [HTTP] 的 Section 5.5 中定义. 本节覆盖 HTTP/1.1 消息中包含头部字段以及从中提取头部字段的通用语法.
5.1. 字段行解析
消息使用通用算法解析, 该算法独立于各个字段名称. 在消息解释的较后阶段之前 (通常是在消息的整个字段区段都处理完之后), 给定字段行值内部的内容不会被解析.
字段名称与冒号之间不允许有空白. 过去, 对此类空白处理方式的差异曾导致请求路由和响应处理中的安全漏洞. 对于任何收到的, 在头部字段名称和冒号之间包含空白的请求消息, 服务器 MUST 以 400 (Bad Request) 响应状态码拒绝. 代理 MUST 在将响应消息向下游转发之前移除此类空白.
字段行值前后可能带有可选空白 (OWS); 为了便于人类一致阅读, 优先在字段行值前使用单个 SP. 字段行值不包含这些前导或尾随空白: 解析器从字段行中提取字段行值时, 会排除字段行值第一个非空白八位组之前的 OWS, 以及最后一个非空白八位组之后的 OWS.
5.2. 废弃的行折叠
历史上, HTTP/1.x 字段值可以通过在每个额外行前放置至少一个空格或水平制表符 (obs-fold) 而扩展到多行. 除 "message/http" 媒体类型 (Section 10.1) 内部以外, 本规范废弃此类行折叠.
obs-fold = OWS CRLF RWS
; obsolete line folding
发送方 MUST NOT 生成包含行折叠的消息 (即任何字段行值包含与 obs-fold 规则匹配的内容), 除非该消息意图被封装在 "message/http" 媒体类型内.
服务器如果在不位于 "message/http" 容器内的请求消息中收到 obs-fold, MUST 要么通过发送 400 (Bad Request) 拒绝该消息, 最好附带一个表示以说明废弃行折叠不可接受, 要么在解释字段值或向下游转发消息之前, 将每个收到的 obs-fold 替换为一个或多个 SP 八位组.
代理或网关如果在不位于 "message/http" 容器内的响应消息中收到 obs-fold, MUST 要么丢弃该消息并以 502 (Bad Gateway) 响应替换它, 最好附带一个表示以说明收到了不可接受的行折叠, 要么在解释字段值或向下游转发消息之前, 将每个收到的 obs-fold 替换为一个或多个 SP 八位组.
用户代理如果在不位于 "message/http" 容器内的响应消息中收到 obs-fold, MUST 在解释字段值之前将每个收到的 obs-fold 替换为一个或多个 SP 八位组.