HTTP 代理:拒绝处理一半的请求
HTTP Proxy: Reject half-processed request
我有基于 Node.js 的 HTTP 代理,它以流方式即时转换响应主体。例如,我的代理像 nginx 一样工作,它压缩(使用 libz 进行 gzip 压缩)响应主体。
但我有一个悬而未决的问题:如果在数据交换过程中上游连接发生错误怎么办。当响应已经发送并且传输正文正在进行时,如何通知客户端有关错误。基于 Content-Length
由于源数据和转换后的数据不匹配而在响应中不存在的事实,客户端错误确定的复杂性。
为了澄清一些细节,我添加了一段简单的代码:
var express = require("express");
var http = require("http");
var url = require('url');
var webApp = express();
var httpServer = webApp.listen(8080, function () {
console.log("server started on ", 8080, " port");
});
webApp.get("*", function(req, res) {
var targetRequest = http.get(req.originalUrl, function (upstreamResponse) {
if (upstreamResponse.statusCode != 200) {
res.status(500).send("Internal Server Error");
return;
}
upstreamResponse.on("data", function (chunk) {
/// transform chunk and send it to the client
res.write(chunk);
});
upstreamResponse.on("end", function () {
res.end();
});
/// upstream connection error occured
upstreamResponse.on("error", function (error) {
/// How to properly notify client
/// about error ????
/// ????
});
});
});
实际上,通知客户端某些问题的唯一方法就是断开下游连接。
我有基于 Node.js 的 HTTP 代理,它以流方式即时转换响应主体。例如,我的代理像 nginx 一样工作,它压缩(使用 libz 进行 gzip 压缩)响应主体。
但我有一个悬而未决的问题:如果在数据交换过程中上游连接发生错误怎么办。当响应已经发送并且传输正文正在进行时,如何通知客户端有关错误。基于 Content-Length
由于源数据和转换后的数据不匹配而在响应中不存在的事实,客户端错误确定的复杂性。
为了澄清一些细节,我添加了一段简单的代码:
var express = require("express");
var http = require("http");
var url = require('url');
var webApp = express();
var httpServer = webApp.listen(8080, function () {
console.log("server started on ", 8080, " port");
});
webApp.get("*", function(req, res) {
var targetRequest = http.get(req.originalUrl, function (upstreamResponse) {
if (upstreamResponse.statusCode != 200) {
res.status(500).send("Internal Server Error");
return;
}
upstreamResponse.on("data", function (chunk) {
/// transform chunk and send it to the client
res.write(chunk);
});
upstreamResponse.on("end", function () {
res.end();
});
/// upstream connection error occured
upstreamResponse.on("error", function (error) {
/// How to properly notify client
/// about error ????
/// ????
});
});
});
实际上,通知客户端某些问题的唯一方法就是断开下游连接。