5. Field Syntax (字段语法)
每个字段行由不区分大小写的字段名、一个冒号 (":")、可选的前导空格、字段行值和可选的尾随空格组成。
field-line = field-name ":" OWS field-value OWS
字段值内的解析规则在 [HTTP] 第 5.5 节中定义。本节涵盖 HTTP/1.1 消息中头字段包含和提取的通用语法。
5.1. Field Line Parsing (字段行解析)
消息使用通用算法进行解析,独立于各个字段名称。给定字段行值中的内容直到消息解释的后期阶段 (通常在处理完消息的整个字段部分之后) 才会被解析。
字段名和冒号之间不允许有空格。过去,对此类空格的不同处理导致了请求路由和响应处理中的安全漏洞。服务器必须 (MUST) 拒绝任何在头字段名和冒号之间包含空格的收到的请求消息,并返回 400 (Bad Request) 响应状态码。代理必须 (MUST) 在向下游转发响应消息之前从响应消息中删除任何此类空格。
字段行值可能前面和/或后面有可选的空格 (OWS); 在字段行值前面加一个 SP 是首选的,以便人类阅读时保持一致的可读性。字段行值不包括该前导或尾随空格: 解析器在从字段行中提取字段行值时,会排除出现在字段行值的第一个非空格八位字节之前或字段行值的最后一个非空格八位字节之后的 OWS。
5.2. Obsolete Line Folding (过时的行折叠)
历史上,HTTP/1.x 字段值可以通过在每个额外行前面加至少一个空格或水平制表符 (obs-fold) 来扩展到多行。本规范弃用了这种行折叠,除非在 "message/http" 媒体类型 (第 10.1 节) 中。
obs-fold = OWS CRLF RWS
; obsolete line folding
发送方禁止 (MUST NOT) 生成包含行折叠的消息 (即具有任何包含与 obs-fold 规则匹配的字段行值的消息),除非该消息旨在打包在 "message/http" 媒体类型中。
在不在 "message/http" 容器中的请求消息中收到 obs-fold 的服务器必须 (MUST) 拒绝该消息并发送 400 (Bad Request),最好带有说明过时的行折叠不可接受的表示,或者在解释字段值或向下游转发消息之前,用一个或多个 SP 八位字节替换每个收到的 obs-fold。
在不在 "message/http" 容器中的响应消息中收到 obs-fold 的代理或网关必须 (MUST) 丢弃该消息并用 502 (Bad Gateway) 响应替换它,最好带有说明收到了不可接受的行折叠的表示,或者在解释字段值或向下游转发消息之前,用一个或多个 SP 八位字节替换每个收到的 obs-fold。
在不在 "message/http" 容器中的响应消息中收到 obs-fold 的用户代理必须 (MUST) 在解释字段值之前用一个或多个 SP 八位字节替换每个收到的 obs-fold。