【问题标题】:Send intentionally invalid HTTP response with Express使用 Express 发送故意无效的 HTTP 响应
【发布时间】:2016-12-19 19:55:49
【问题描述】:

我正在为 Web 应用程序构建一些测试,我想测试客户端优雅地处理无效 HTTP 响应的能力。您如何建议修改响应以使其不再有效?我尝试了以下方法,但 Express 显然在之后修复了 Content-Length

app.get('/broken/', function(req, res) {
    console.log('request received for ' + req.path);
    res.set('Content-Length', 0).send('more than zero');
});

编辑:请注意,我不一定能控制传入的请求。在过去,其中一些是无效的。

【问题讨论】:

  • 我不确定在客户端处理无效响应是否有意义。响应有效或客户端超时等待
  • 对我来说,这听起来像是 curlnetcat 的工作。
  • 你可能需要远离一个有代码的框架,以确保你可以发送任何你想要的东西的有效响应。
  • 您可以在 node.js 中创建一个普通的 TCP 服务器,然后解析传入的请求并完全按照您的意愿发送您自己的响应 - 本质上是制作您自己的简单小型 http 服务器,您可以在其中控制一切。跨度>
  • 如果您使用现有的服务器或框架,它几乎肯定会处理所有 HTTP 连接管理,并且会防止无效响应。如果您想要那种级别的控制,您必须绕过普通服务器并提供自己的服务器。

标签: javascript http express


【解决方案1】:

我认为正确的答案(即使您可以解决它)是为此使用 HTTP 客户端。任何 HTTP 客户端都会努力阻止您进行无效的 HTTP 调用。因此,正确的答案是故意创建一个不符合标准的 HTTP 客户端,这意味着您需要深入编写 tcp 套接字。即使这意味着它不完全适合您的测试框架,我认为您只需要它进行一次测试。

【讨论】:

    【解决方案2】:

    确实,Expressresponse.send 方法中重置Content-Length

    if (chunk !== undefined) {
      len = chunk.length;
      this.set('Content-Length', len);
    }
    

    基本上,send 只是设置一堆标题并将其余工作委托给http.ServerResponse.end

    为了绕过这种行为,您可以直接使用end 方法。

    app.get('/broken/', function(req, res) {
      res.set('Content-Length', 0)
         .set('Content-Type', type);
         .end('more than zero');
    });
    

    【讨论】:

    • 谢谢,这实际上完成了创建无效的 HTTP 响应。不幸的是,似乎大多数客户端只是读取内容长度指定的数量,然后愉快地继续,而不是抛出希望的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    相关资源
    最近更新 更多