diff --git a/examples/balancer/simple-balancer.js b/examples/balancer/simple-balancer.js index 3f53cc63d..16612b1b1 100644 --- a/examples/balancer/simple-balancer.js +++ b/examples/balancer/simple-balancer.js @@ -58,7 +58,7 @@ http.createServer(function (req, res) { // // ...and then the server you just used becomes the last item in the list. // - addresses.push(target); + addresses.push(target.target); }).listen(8021); // Rinse; repeat; enjoy. \ No newline at end of file diff --git a/lib/http-proxy/passes/web-incoming.js b/lib/http-proxy/passes/web-incoming.js index b127bc709..4f4c72c56 100644 --- a/lib/http-proxy/passes/web-incoming.js +++ b/lib/http-proxy/passes/web-incoming.js @@ -109,6 +109,14 @@ web_o = Object.keys(web_o).map(function(pass) { common.setupOutgoing(options.ssl || {}, options, req) ); + // allow outgoing socket to timeout so that we could + // show an error page at the initial request + if(options.proxyTimeout) { + proxyReq.setTimeout(options.proxyTimeout, function() { + proxyReq.abort(); + }); + } + // Ensure we abort proxy if request is aborted req.on('aborted', function () { proxyReq.abort(); @@ -122,9 +130,9 @@ web_o = Object.keys(web_o).map(function(pass) { function proxyError (err){ if (clb) { - clb(err, req, res); + clb(err, req, res, options.target); } else { - server.emit('error', err, req, res); + server.emit('error', err, req, res, options.target); } } diff --git a/package.json b/package.json index 3b4cd363a..74210a2aa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name" : "http-proxy", - "version" : "1.1.4", + "version" : "1.1.5", "repository" : { "type" : "git", diff --git a/test/lib-http-proxy-passes-web-incoming-test.js b/test/lib-http-proxy-passes-web-incoming-test.js index 49ffa9ef4..93c76ca7a 100644 --- a/test/lib-http-proxy-passes-web-incoming-test.js +++ b/test/lib-http-proxy-passes-web-incoming-test.js @@ -128,6 +128,87 @@ describe('#createProxyServer.web() using own http server', function () { }, function() {}).end(); }); + it('should proxy the request and handle timeout error (proxyTimeout)', function(done) { + var proxy = httpProxy.createProxyServer({ + target: 'http://127.0.0.1:45000', + proxyTimeout: 100 + }); + + require('net').createServer().listen(45000); + + var proxyServer = http.createServer(requestHandler); + + var started = new Date().getTime(); + function requestHandler(req, res) { + proxy.once('error', 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(new Date().getTime() - started).to.be.greaterThan(99); + expect(err.code).to.be('ECONNRESET'); + done(); + }); + + proxy.web(req, res); + } + + proxyServer.listen('8084'); + + http.request({ + hostname: '127.0.0.1', + port: '8084', + method: 'GET', + }, function() {}).end(); + }); + + it('should proxy the request and handle timeout error', function(done) { + var proxy = httpProxy.createProxyServer({ + target: 'http://127.0.0.1:45001', + timeout: 100 + }); + + require('net').createServer().listen(45001); + + 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('error', 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('8085'); + + var req = http.request({ + hostname: '127.0.0.1', + port: '8085', + 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(); + }); + 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' @@ -151,8 +232,8 @@ describe('#createProxyServer.web() using own http server', function () { res.end('Response'); }); - proxyServer.listen('8084'); + proxyServer.listen('8086'); source.listen('8080'); - http.request('http://127.0.0.1:8084', function() {}).end(); + http.request('http://127.0.0.1:8086', function() {}).end(); }); }); \ No newline at end of file diff --git a/test/lib-http-proxy-test.js b/test/lib-http-proxy-test.js index d6d5b31df..220d2f7e4 100644 --- a/test/lib-http-proxy-test.js +++ b/test/lib-http-proxy-test.js @@ -294,9 +294,11 @@ describe('lib/http-proxy.js', function() { var proxy = httpProxy.createProxyServer({ target: 'ws://127.0.0.1:' + ports.source, ws: true - }), - proxyServer = proxy.listen(ports.proxy), - destiny = io.listen(ports.source, function () { + }); + proxyServer = proxy.listen(ports.proxy); + var server = http.createServer(); + destiny = io.listen(server); + function startSocketIo() { var client = ioClient.connect('ws://127.0.0.1:' + ports.proxy); client.on('connect', function () { @@ -306,10 +308,12 @@ describe('lib/http-proxy.js', function() { client.on('outgoing', function (data) { expect(data).to.be('Hello over websockets'); proxyServer._server.close(); - destiny.server.close(); + server.close(); done(); }); - }); + } + server.listen(ports.source); + server.on('listening', startSocketIo); destiny.sockets.on('connection', function (socket) { socket.on('incoming', function (msg) {