Skip to content

Commit

Permalink
Added timeout option and test to test new timeout parameter, added re…
Browse files Browse the repository at this point in the history
…questFail assertion.
  • Loading branch information
pdoran authored and indexzero committed Mar 9, 2013
1 parent 476cbe7 commit 89d43c2
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 12 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -550,6 +550,7 @@ If you have a suggestion for a feature currently not supported, feel free to ope
xforward: true // enables X-Forwarded-For
},
changeOrigin: false, // changes the origin of the host header to the target URL
timeout: 120000 // override the default 2 minute http socket timeout value in milliseconds
}
```

Expand Down
15 changes: 13 additions & 2 deletions lib/node-http-proxy/http-proxy.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ var HttpProxy = exports.HttpProxy = function (options) {
//
this.forward = options.forward;
this.target = options.target;
this.timeout = options.timeout;

//
// Setup the necessary instances instance variables for
Expand Down Expand Up @@ -163,6 +164,9 @@ HttpProxy.prototype.proxyRequest = function (req, res, buffer) {
req.headers['x-forwarded-proto'] = getProto(req);
}
}
if(this.timeout) {
req.socket.setTimeout(this.timeout);
}

//
// Emit the `start` event indicating that we have begun the proxy operation.
Expand Down Expand Up @@ -350,10 +354,17 @@ HttpProxy.prototype.proxyRequest = function (req, res, buffer) {
});

//
// Handle 'error' events from the `reverseProxy`.
// Handle 'error' events from the `reverseProxy`. Setup timeout override if needed
//
reverseProxy.once('error', proxyError);

// Set a timeout on the socket if `this.timeout` is specified.
reverseProxy.once('socket', function (socket) {
if (self.timeout) {
socket.setTimeout(self.timeout);
}
});

//
// Handle 'error' events from the `req` (e.g. `Parse Error`).
//
Expand Down Expand Up @@ -899,4 +910,4 @@ HttpProxy.prototype._forwardRequest = function (req) {

function getProto(req) {
return req.isSpdy ? 'https' : (req.connection.pair ? 'https' : 'http');
}
}
8 changes: 5 additions & 3 deletions test/helpers/http.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,11 @@ exports.createServer = function (options, callback) {
});
}

res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write(options.output || 'hello proxy');
res.end();
setTimeout(function() {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write(options.output || 'hello proxy');
res.end();
}, options.latency || 1);
}

var server = protocols.target === 'https'
Expand Down
7 changes: 6 additions & 1 deletion test/http/http-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,12 @@ vows.describe(helpers.describe()).addBatch({
outputHeaders: { "x-testheader": "target" },
latency: 1000
})
}
},
"and timeout set": macros.http.assertProxied({
shouldFail: true,
timeout: 2000,
requestLatency: 4000
})
},
"With a no valid target server": {
"and no latency": macros.http.assertInvalidProxy(),
Expand Down
41 changes: 35 additions & 6 deletions test/macros/http.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,30 @@ exports.assertRequest = function (options) {
};
};

//
// ### function assertFailedRequest (options)
// #### @options {Object} Options for this failed request assertion.
// #### @request {Object} Options to use for `request`.
// #### @assert {Object} Test assertions against the response.
//
// Makes a request using `options.request` and then asserts the response
// and body against anything in `options.assert`.
//
exports.assertFailedRequest = function (options) {
return {
topic: function () {
//
// Now make the HTTP request and assert.
//
options.request.rejectUnauthorized = false;
request(options.request, this.callback);
},
"should not succeed": function (err, res, body) {
assert.notStrictEqual(err,null);
}
};
};

//
// ### function assertProxied (options)
// #### @options {Object} Options for this test
Expand All @@ -63,14 +87,17 @@ exports.assertRequest = function (options) {
exports.assertProxied = function (options) {
options = options || {};

var ports = options.ports || helpers.nextPortPair,
var ports = options.ports || helpers.nextPortPair,
output = options.output || 'hello world from ' + ports.target,
outputHeaders = options.outputHeaders,
targetHeaders = options.targetHeaders,
proxyHeaders = options.proxyHeaders,
protocol = helpers.protocols.proxy,
req = options.request || {};

req = options.request || {},
timeout = options.timeout || null,
assertFn = options.shouldFail
? exports.assertFailedRequest
: exports.assertRequest;

req.uri = req.uri || protocol + '://127.0.0.1:' + ports.proxy;

Expand All @@ -85,7 +112,8 @@ exports.assertProxied = function (options) {
output: output,
outputHeaders: targetHeaders,
port: ports.target,
headers: req.headers
headers: req.headers,
latency: options.requestLatency
},
proxy: {
latency: options.latency,
Expand All @@ -97,12 +125,13 @@ exports.assertProxied = function (options) {
https: helpers.protocols.target === 'https',
host: '127.0.0.1',
port: ports.target
}
},
timeout: timeout
}
}
}, this.callback);
},
"the proxy request": exports.assertRequest({
"the proxy request": assertFn({
request: req,
assert: {
headers: outputHeaders,
Expand Down

0 comments on commit 89d43c2

Please sign in to comment.