【问题标题】:How to get net::ERR CONTENT LENGTH MISMATCH in Chrome using express如何使用 express 在 Chrome 中获取 net::ERR CONTENT LENGTH MISMATCH
【发布时间】:2017-05-07 15:39:50
【问题描述】:

出于测试目的,我想在浏览器中看到臭名昭著的错误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 清楚地表明在客户端收到了整个正文。

【问题讨论】:

  • 你为什么看到错误?
  • @mscdex 用于测试目的,正是出于人们有时希望看到 4xx 和 5xx http 错误的原因。
  • 如果要触发该错误,请将内容长度值设置为大于实际内容并在res.end()之后调用req.destroy()
  • @robertklep 太棒了,确实有效,你为什么不留下答案让我接受?

标签: node.js google-chrome http express content-length


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我修复了 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);
    

    【讨论】:

      猜你喜欢
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2015-10-10
      • 2020-02-05
      • 1970-01-01
      相关资源
      最近更新 更多