适当的Node.js API,用于确定是否已发送“100 Continue”

时间:2016-07-04 19:02:54

标签: node.js express

我有一个奇怪的HTTP和类似HTTP处理的边缘情况,我必须支持一些破碎的客户端。具体来说,客户端将发出HTTP PUT请求,并且在客户端发送其请求主体之前,我需要在收到请求标头之后发送200 OK。通常,我这样做:

app.put('/*', function (req, res, next) {
  res.socket.write('HTTP/1.0 200 OK\r\n\r\n');
  /* Pipe socket and handle data here */
}

但是,对于较新版本的Node.js(撰写本文时为v6.2.2),当客户端在其请求标头中连接正确的HTTP / 1.1请求和Expect: 100-continue时,HTTP服务器将(正确) )在我有机会发送自己的响应状态行之前,立即发送HTTP/1.1 100 Continue消息。因此,客户端将获得两个状态行:

HTTP/1.1 100 Continue
HTTP/1.0 200 OK

这不是一个大问题。我只需要检测Node.js HTTP服务器何时处理状态行,所以我不发送重复。诀窍是,我不认为这个API被正确暴露。我捅了一下,想出了这个方法:

app.put('/*', function (req, res, next) {
  if (!res._sent100) {
    res.socket.write('HTTP/1.0 200 OK\r\n\r\n');
  }
  /* Pipe socket and handle data here */
}

我的问题:是否有更好的方法来检测内置HTTP服务器何时发送100 Continue而不是使用res._sent100

有一个HTTP server checkContinue event。但是,如果我处理该事件,那么正常事件不会触发。我将它与Express一起使用,我需要正常的请求事件,以便正常的中间件堆栈运行。如果我可以处理checkContinue,将我自己的属性写入res,然后将其传递回正常堆栈进行处理,那么一切都会好的。但是,我没有看到记录的方法来做到这一点。

1 个答案:

答案 0 :(得分:1)

这似乎有效:

server.on('checkContinue', (req, res) => {
  res.mySent100 = true;
  res.writeContinue();
  server.emit('request', req, res);
});

(其中server是为Express应用程序提供服务的HTTPServer实例)