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 ????
            /// ????
        });

    });

});

实际上,通知客户端某些问题的唯一方法就是断开下游连接。