如何在中间用快递中止http回复? 在我的情况下,我提供从外部源生成的数据,在我开始提供它之前,我知道大小(内容长度)。但是,如果外部源在向我提供全部内容之前停止向我提供数据,我想中止请求,以便在接收端结束时会触发错误事件。
这是简单的代码,服务器:
//server
var express = require('express');
var app = express();
app.use(function(req, res, next){
res.setHeader('Content-Length', 100);
res.writeHead(200);
res.write('1234567890');
setTimeout(function() { res.connection.destroy(); }, 500);
});
app.listen(8080);
和
//client
var http = require('http');
http.get('http://localhost:8080/', function(res){
var length = 0;
console.log('expected size: ', res.headers['content-length']);
res.on('data', function(chunk){ length += chunk.length; });
res.on('end', function(){ console.log('received: ', length); });
}).on('error', function(e){
console.log('error', e);
});
预计客户端应显示连接已重置的错误,并且即使只收到100个字节中的10个字节,也不会表现得一切正常。
如果知道无法满足请求,如何中止发送方的连接?我发现的一种方法是在该计时器内抛出异常,然后接收器将记录错误,但我不想抛出异常,我想正确地做。
答案 0 :(得分:1)
理想情况下,要结束HTTP响应,您可以调用res.end()
。在分块传输编码或没有HTTP keep-alive的连接的情况下,这将干净地结束响应。
但是,大多数HTTP连接都支持HTTP keep-alive,并且由于您有Content-Length
标头,因此您的传输编码不会被分块。在您的情况下,您将不得不关闭底层套接字。查看req.connection
媒体资源,然后点击.end()
。这是没有证件的,但已存在多年,现在可能是安全的。获取连接的更合法的方法包括listening for it on the server object,但是很难将连接与请求相关联。
您应该知道,对于大多数HTTP客户端,这是一个充其量的警告,通常不是错误。如果您控制客户端代码,则可以通过将收到的数据长度与预期长度进行比较来检测此情况。