TypeError: Network request failed for 204 (No Content) and 304 (Not Modified) call over HTTP2 (ERR_HTTP2_PROTOCOL_ERROR in Chrome)
TypeError: Network request failed for 204 (No Content) and 304 (Not Modified) call over HTTP2 (ERR_HTTP2_PROTOCOL_ERROR in Chrome)
我们已从 HTTP1.1
切换到 HTTP2
协议,并注意到某些请求失败。当服务器以 [=12=] 或 304
响应时,我们会收到以下错误:
TypeError: Network request failed
Chrome 还会在网络选项卡上显示以下错误:ERR_HTTP2_PROTOCOL_ERROR
经过一些研究,我们发现了问题所在。 HTTP2
协议在语法上比 HTTP1.1
更严格。例如。它不允许 body 用于 204
或 304
响应。这些响应不应该包含 body 是合乎逻辑的,但是 HTTP1.1
不需要失败这些“奇怪”的响应,而 HTTP2
要求客户端不接受这样的响应。
我们还发现,即使我们没有 body 或 content-length
header,我们也有一个 content-type
header浏览器也不接受,而 HTTP1.1
的逻辑只是忽略了这个 header.
我在互联网上根本没有找到太多关于这方面的信息。我得到的最接近的是 HTTP2 RFC,甚至在细节上也有点模糊。它没有直接说明具有 content-type
header 的 304
响应应该被拒绝,但我认为这就是浏览器在现实中实现它的方式。
TLDR:
204
和 304
响应不能包含 body、content-length
或 content-type
header。此类响应将被浏览器(可能还有其他客户端)视为网络错误。
P.S。很可能其他响应码也有类似的限制
P.P.S。感谢 Morten Cools 对主题进行了原创性研究
我们已从 HTTP1.1
切换到 HTTP2
协议,并注意到某些请求失败。当服务器以 [=12=] 或 304
响应时,我们会收到以下错误:
TypeError: Network request failed
Chrome 还会在网络选项卡上显示以下错误:ERR_HTTP2_PROTOCOL_ERROR
经过一些研究,我们发现了问题所在。 HTTP2
协议在语法上比 HTTP1.1
更严格。例如。它不允许 body 用于 204
或 304
响应。这些响应不应该包含 body 是合乎逻辑的,但是 HTTP1.1
不需要失败这些“奇怪”的响应,而 HTTP2
要求客户端不接受这样的响应。
我们还发现,即使我们没有 body 或 content-length
header,我们也有一个 content-type
header浏览器也不接受,而 HTTP1.1
的逻辑只是忽略了这个 header.
我在互联网上根本没有找到太多关于这方面的信息。我得到的最接近的是 HTTP2 RFC,甚至在细节上也有点模糊。它没有直接说明具有 content-type
header 的 304
响应应该被拒绝,但我认为这就是浏览器在现实中实现它的方式。
TLDR:
204
和 304
响应不能包含 body、content-length
或 content-type
header。此类响应将被浏览器(可能还有其他客户端)视为网络错误。
P.S。很可能其他响应码也有类似的限制
P.P.S。感谢 Morten Cools 对主题进行了原创性研究