RFC 2616指出,如果存在Content-Length
,则不得发送Transfer-Encoding
标头。
如果这两个长度不同(即,如果存在Transfer-Encoding标头字段),则不得发送Content-Length标头字段。
但是,如果同时收到两个标头,则客户端应忽略Content-Length
如果同时接收到带有传输编码报头字段和内容长度报头字段的消息,则必须忽略后者。
我的解释是否正确,即客户端应将两个标头都存在的情况视为正确的HTTP响应?还是该条款的实现是特定的?
我问是因为Go标准的net/http
包在发生这种情况时会返回错误。
答案 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
覆盖的任何字节。