Chrome没有处理像Firefox,Safari这样的分块响应
我有一个testing节点服务器每隔几秒发送一次分块的响应,使用下列标题:
response.setHeader('Content-Type', 'text/plain') response.setHeader('Transfer-Encoding', 'chunked')
每隔两秒钟,我就写出回应:
response.write('Hello World');
当我在端点上进行curl时,每隔两秒就会得到一个块:
Hello World (wait two seconds) Hello World (wait two seconds) Hello World
它的工作原理就像curl一样。
对于我在客户端的Javascript,我build立了一个新的XMLHttpRequest
并分配一个函数来打印出它的onprogress
事件的responseText
。 这是实现在不同浏览器上的不同之处。
在Firefox和Safari中,我收到类似的行为,当我curl。 每个“Hello World”都会触发一个进行中的事件。
在Chrome中,只有在接收到所有块时才会触发onprogress事件,并在服务器端执行response.end()
。 而当我尝试打印出responseText
,只有一个空string打印出来。
以下是客户端代码的样子:
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); }
为了检测MIMEtypes,Chrome和IE“嗅探”数据(我相信前256个字节)。 使用这个来禁用这个行为:
response.setHeader('X-Content-Type-Options', 'nosniff');