Chrome DevTools如何识别不完整HTTP响应内容大小及复现方法
关于Chrome DevTools HAR文件中不完整响应大小的疑问解答
Chrome DevTools 如何获取不完整响应的内容大小
- 当服务器违反HTTP规范,同时返回
Content-Length字段和Transfer-Encoding: chunked头时,Chrome会直接把Content-Length声明的数值填入HAR的content.size字段——哪怕响应中途因为net::ERR_INCOMPLETE_CHUNKED_ENCODING中断、实际只传了部分数据。你看到的67469就是服务器预先声明的总大小,不是实际收到的4096字节。 - 如果服务器仅用分块编码(没给
Content-Length头),且响应没传输完成(缺少结束块),Chrome没法提前知道完整响应的大小,这时候HAR里的content.size就会显示为0。实际收到的字节数可以通过HAR里content.text对应的原始数据长度来统计。
如何复现两种场景
场景1:content.size显示声明的总大小(即你遇到的情况)
用Node.js搭个简单的异常服务器:
const http = require('http'); const server = http.createServer((req, res) => { // 同时设置两个冲突的响应头,模拟违规服务器行为 res.setHeader('Content-Length', '67469'); res.setHeader('Transfer-Encoding', 'chunked'); // 发送一个4096字节的分块 const chunk = Buffer.alloc(4096, 'x'); res.write(`${chunk.length.toString(16)}\r\n`); res.write(chunk); res.write('\r\n'); // 故意断开连接,不发送结束块 setTimeout(() => res.destroy(), 100); }); server.listen(3000, () => console.log('Server up on port 3000'));
启动服务器后,用Chrome访问 http://localhost:3000,导出HAR文件就能看到对应的错误和content.size值。
场景2:content.size显示为0(你自己尝试的情况)
把上面代码里的 res.setHeader('Content-Length', '67469'); 删掉,重复相同步骤即可——因为没有声明总大小,Chrome无法确定完整响应的尺寸,所以content.size会显示为0。
内容的提问来源于stack exchange,提问作者woniu17
相关产品推荐
相关产品推荐

