From 6293b3f7bd4d4010488da9c0ae50d80cb4e38be2 Mon Sep 17 00:00:00 2001 From: Bernd Schrooten Date: Wed, 8 Jun 2022 17:15:27 +0200 Subject: [PATCH] fix: port https://github.com/http-party/node-http-proxy/pull/1542 --- lib/http-proxy/passes/web-incoming.js | 2 +- ...lib-http-proxy-passes-web-incoming-test.js | 50 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/lib/http-proxy/passes/web-incoming.js b/lib/http-proxy/passes/web-incoming.js index 7ae735514..8fd5faf00 100644 --- a/lib/http-proxy/passes/web-incoming.js +++ b/lib/http-proxy/passes/web-incoming.js @@ -154,7 +154,7 @@ module.exports = { function createErrorHandler(proxyReq, url) { return function proxyError(err) { - if (req.socket.destroyed && err.code === 'ECONNRESET') { + if (req.aborted && err.code === 'ECONNRESET') { server.emit('econnreset', err, req, res, url); return proxyReq.abort(); } diff --git a/test/lib-http-proxy-passes-web-incoming-test.js b/test/lib-http-proxy-passes-web-incoming-test.js index f6553d300..7810beab0 100644 --- a/test/lib-http-proxy-passes-web-incoming-test.js +++ b/test/lib-http-proxy-passes-web-incoming-test.js @@ -334,6 +334,56 @@ describe('#createProxyServer.web() using own http server', function () { req.end(); }); + it('should proxy the request and handle client disconnect error', function(done) { + var proxy = httpProxy.createProxyServer({ + target: 'http://127.0.0.1:45002', + }); + + require('net').createServer().listen(45002); + + var proxyServer = http.createServer(requestHandler); + + var cnt = 0; + var doneOne = function() { + cnt += 1; + if(cnt === 2) done(); + } + + var started = new Date().getTime(); + function requestHandler(req, res) { + proxy.once('econnreset', function (err, errReq, errRes) { + proxyServer.close(); + expect(err).to.be.an(Error); + expect(errReq).to.be.equal(req); + expect(errRes).to.be.equal(res); + expect(err.code).to.be('ECONNRESET'); + doneOne(); + }); + + proxy.web(req, res); + } + + proxyServer.listen('8086'); + + var req = http.request({ + hostname: '127.0.0.1', + port: '8086', + method: 'GET', + }, function() {}); + + req.on('error', function(err) { + expect(err).to.be.an(Error); + expect(err.code).to.be('ECONNRESET'); + expect(new Date().getTime() - started).to.be.greaterThan(99); + doneOne(); + }); + req.end(); + + setTimeout(function () { + req.destroy(); + }, 100); + }); + it('should proxy the request and provide a proxyRes event with the request and response parameters', function(done) { var proxy = httpProxy.createProxyServer({ target: 'http://127.0.0.1:8080'