繁体   English   中英

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

[英]RFC 2616 HTTP Content-Length and Transfer-Encoding Compatibility

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

如果这两个长度不同(即,如果存在传输编码头字段),则不得发送Content-Length头字段。

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

如果收到的消息同时带有一个Transfer-Encoding头域和一个Content-Length头域,则后者必须被忽略。

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

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

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

如果同时接收到带有Transfer-Encoding和Content-Length标头字段的消息,则Transfer-Encoding会覆盖Content-Length 此类消息可能表示尝试执行请求走私(第9.5节)或响应拆分(第9.4节), 应将其视为错误

请注意,这里的弱“应该”远非必须。 但是至少net/http是完全正确的,因为这种响应是错误的并且可以作为error处理 但是并不需要将其视为错误

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM