logo  

跟我一起读RFC

跟我一起读RFC
作者: 陈安廉

摘要:软件开发进阶系列


4.2 消息头 (Message Headers)


2020-12-02 13:52:09

HTTP 头域包括常用头域(4.5 节),请求头域(5.3 节),响应头域(6.2 节)和实体头域 (7.1 节)。它们遵循的是 RFC822[0]3.1 节中给出的同一个常用格式。每一个头域由一个名字 (域名)跟随一个":"和域值构成。域名是大小写不敏感的。域值前面可能有任意数量的 LWS 的。但 SP(空格)是首选的。头域能被延伸多行,这通过在这些行前面加一些 SP 或 HT。应用程序当产生 HTTP 消息时,应该遵循“常用格式”,因为可能存在一些应用程序,他们不能接收任何常用形式之外的形式。.

       message-header = field-name ":" [ field-value ]
       field-name     = token
       field-value    = *( field-content | LWS )
       field-content  = <the OCTETs making up the field-value
                        and consisting of either *TEXT or combinations
                        of token, separators, and quoted-string>


filed-content 不包括任何前导或后续的 LWS(线性空白):线性空白出现在域值( filed—value)的第一个非空白字符之前或最后一个非空白字符之后。前导或后续 LWS 可能会在不会改变域值语意情况下被删除。任何出现在 filed-content 之间的 LWS 可能在解析域值之前或把这个消息往下流传递时会被一个 SP 代替。

不同域名的头域被接收的顺序是不重要的。然而,首先发送常用头域,然后紧接着是请求头域或者是响应头域,然后是以实体头域结束,这样做是一个好的的方法。 

如果一个头域的域值被定义成一个以逗号隔开的列表,那么使用同一个域名(filed-name)的多个消息头域可能会出现在一些消息中。不改变消息的语义,可以把相同名的多个头域结合成一个“域名:域值”对的形式,这可以通过把每一个后续的域值加到第一个里,每一个域值用 逗号隔开的算法实现。同名头域的接收顺序对合并的域值的解释是有重要意义的,所以代理(proxy)当把消息转发时不能改变域值的顺序。