Chrome 无法像 Firefox、Safari 一样处理分块响应

kim*_*ura 2 javascript ajax google-chrome xmlhttprequest node.js

我有一个测试节点服务器,每隔两秒发送一次带有以下标头的分块响应:

response.setHeader('Content-Type', 'text/plain')
response.setHeader('Transfer-Encoding', 'chunked')
Run Code Online (Sandbox Code Playgroud)

每隔两秒,我就会写下回复:

response.write('Hello World');
Run Code Online (Sandbox Code Playgroud)

当我在端点上执行卷曲时,我每两秒就会收到一个块:

Hello World
(wait two seconds)
Hello World
(wait two seconds)
Hello World
Run Code Online (Sandbox Code Playgroud)

它的工作原理就像在卷曲中应该的那样。

对于客户端的 Javascript,我设置了一个新的函数XMLHttpRequest并分配了一个函数来打印该responseText事件的函数onprogress。这是不同浏览器的实现似乎有所不同的地方。

在 Firefox 和 Safari 中,我得到与卷曲时类似的行为。每个“Hello World”都会触发一个 onprogress 事件。

在 Chrome 中,仅当收到所有块并且我response.end()在服务器端执行 a 时,才会触发 onprogress 事件。当我尝试打印出 时responseText,只打印出一个空字符串。

客户端代码如下所示:

var xhr = new XMLHttpRequest()
xhr.onprogress = function() {
  // Firefox, Safari prints out an accumulation of the chunks
  // Chrome prints out an empty string
  console.log(xhr.responseText);
}
Run Code Online (Sandbox Code Playgroud)

msc*_*dex 5

Chrome 和 IE 都“嗅探”数据(我认为是前 256 个字节)以检测 mime 类型。使用它来禁用该行为:

response.setHeader('X-Content-Type-Options', 'nosniff');
Run Code Online (Sandbox Code Playgroud)