如何使用 express 在 Chrome 中获取 net::ERR 内容长度不匹配

How to get net::ERR CONTENT LENGTH MISMATCH in Chrome using express

出于测试目的,我想在浏览器中看到臭名昭著的错误 net::ERR CONTENT LENGTH MISMATCH。但问题是我不知道怎么做。天真的尝试传递错误 Content-Length 似乎不起作用 - 所有客户端都只是截断内容(顺便说一句 - 它是一些公认的,RFC 记录的行为吗?)。

这是您可以尝试的代码:

var express = require('express');
var app = express();

app.get('/ping', function (req, res) {
  res.set({
    'Content-Length': 7,  
  }); 

  // don't use res.send, 
  //it will ignore explicitly set Content-Length in favor of the right one
  res.write('ABCDEFGHIJKLMNOP');
  res.end();
})

app.listen(3000, function () {
  console.log('http://127.0.0.1:3000');
});

minimal python server也是如此。 此外,我有一个疯狂的想法,可能是 express 在设置内容长度时截断响应,但 tcpdump 清楚地表明在客户端收到了整个主体。

看起来大多数客户端并不关心服务器发送的数据是否多于 Content-Length 中规定的数据。但是,如果您发送 less 数据,并确保连接在服务器端关闭(客户端不会关闭它,因为它认为还有更多数据要发送),您可以触发器 net::ERR_CONTENT_LENGTH_MISMATCH:

app.get('/ping', function (req, res) {
  res.set({ 'Content-Length': 70 });
  res.write('ABCDEFGHIJKLMNOP');
  res.end();
  res.connection.end();
})

我修复了设置 server.keepAliveTimeout

var httpsServer = https.createServer({
    key: fs.readFileSync('key.pem'),
    cert: fs.readFileSync('cert.pem'),
    ca: fs.readFileSync('intermediate.crt')
}, app).listen(port);
httpsServer.keepAliveTimeout = 60000 * 2;
httpsServer.listen(port);