RFC 2616 HTTP内容长度和传输编码兼容性

时间:2018-10-26 05:23:51

标签: http go

RFC 2616指出,如果存在Content-Length,则不得发送Transfer-Encoding标头。

  

如果这两个长度不同(即,如果存在Transfer-Encoding标头字段),则不得发送Content-Length标头字段。

但是,如果同时收到两个标头,则客户端应忽略Content-Length

  

如果同时接收到带有传输编码报头字段和内容长度报头字段的消息,则必须忽略后者。

我的解释是否正确,即客户端应将两个标头都存在的情况视为正确的HTTP响应?还是该条款的实现是特定的?

我问是因为Go标准的net/http包在发生这种情况时会返回错误。

1 个答案:

答案 0 :(得分:3)

该标准并没有真正指定在这种情况下应该发生的情况,仅当完全接受该消息时,才应忽略Content-length。引用RFC 7230

  

如果同时接收到带有传输编码和          Content-Length标头字段中, Transfer-Encoding会覆盖          内容长度。这样的消息可能表明试图          执行请求走私(第9.5节)或响应拆分          (第9.4节)和应作为错误处理

请注意,此处弱的“应做” 与MUST距离很远。但是至少net/http是完全正确的,因为这种响应是错误的,并且可以作为错误处理。但这不要求被视为错误

实际上,所有浏览器似乎都接受这种响应,并且通常会忽略Content-length标头。但是我过去看到过MS Edge的一种行为,它正确地将响应主体视为分块,但另外使用了Content-length,并且忽略了响应主体中未被Content-length覆盖的任何字节。