Skip to content

Commit

Permalink
Added targetTimeout option and two tests for timeout
Browse files Browse the repository at this point in the history
  • Loading branch information
Rush committed Jun 9, 2014
1 parent 7cb98a4 commit 0f24351
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 2 deletions.
8 changes: 8 additions & 0 deletions lib/http-proxy/passes/web-incoming.js
Original file line number Diff line number Diff line change
Expand Up @@ -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.targetTimeout) {
proxyReq.setTimeout(options.targetTimeout, function() {
proxyReq.abort();
});
}

// Ensure we abort proxy if request is aborted
req.on('aborted', function () {
proxyReq.abort();
Expand Down
85 changes: 83 additions & 2 deletions test/lib-http-proxy-passes-web-incoming-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,87 @@ describe('#createProxyServer.web() using own http server', function () {
}, function() {}).end();
});

it('should proxy the request and handle timeout error (targetTimeout)', function(done) {
var proxy = httpProxy.createProxyServer({
target: 'http://127.0.0.1:45000',
targetTimeout: 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'
Expand All @@ -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();
});
});

0 comments on commit 0f24351

Please sign in to comment.