Search code examples
javascriptnode.jshttpcachinghttp-proxy

HTTP Proxy: Reject half-processed request


I have HTTP Proxy based on Node.js which transforms response body on fly in stream fashion. For instance, my proxy works like nginx, which compresses (using libz for gzipping) response body. Overall scheme:

But I have open question: What if error occures on upstream connection during the data exchange. How to notify client about en error, when response have already been sent and transmitting body is in progress. Complexity of error determination on client side based on fact that Content-Length is absent in response due to source and transformed data mismatch.

To clarify some details I added a simple piece of code:

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

    });

});


Solution

  • Actually, the only one way to notify clients about some issues is just to drop downstream connections.