我有一个奇怪的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
,然后将其传递回正常堆栈进行处理,那么一切都会好的。但是,我没有看到记录的方法来做到这一点。
答案 0 :(得分:1)
这似乎有效:
server.on('checkContinue', (req, res) => {
res.mySent100 = true;
res.writeContinue();
server.emit('request', req, res);
});
(其中server
是为Express应用程序提供服务的HTTPServer实例)