提交 7a16f728 编写于 作者: M Matt Zabriskie

Improving logic for handling timeout in node

closes #124
上级 d31ebc4c
......@@ -13,6 +13,8 @@ var Buffer = require('buffer').Buffer;
module.exports = function httpAdapter(resolve, reject, config) {
var data = config.data;
var headers = config.headers;
var timer;
var aborted = false;
// Set User-Agent (required by some servers)
// Only set header if it hasn't been set in config
......@@ -57,6 +59,12 @@ module.exports = function httpAdapter(resolve, reject, config) {
// Create the request
var transport = parsed.protocol === 'https:' ? https : http;
var req = transport.request(options, function handleResponse(res) {
if (aborted) return;
// Response has been received so kill timer that handles request timeout
clearTimeout(timer);
timer = null;
// uncompress the response body transparently if required
var stream = res;
switch (res.headers['content-encoding']) {
......@@ -103,13 +111,21 @@ module.exports = function httpAdapter(resolve, reject, config) {
// Handle errors
req.on('error', function handleRequestError(err) {
if (aborted) return;
reject(err);
});
// Handle request timeout
req.setTimeout(config.timeout, function handleRequestTimeout() {
req.abort();
});
if (config.timeout && !timer) {
timer = setTimeout(function handleRequestTimeout() {
var err = new Error('timeout of ' + config.timeout + 'ms exceeded');
err.timeout = config.timeout;
err.code = 'ECONNABORTED';
req.abort();
reject(err);
aborted = true;
}, config.timeout);
}
// Send the request
req.end(data);
......
......@@ -11,6 +11,34 @@ module.exports = {
callback();
},
testTimeout: function (test) {
server = http.createServer(function (req, res) {
setTimeout(function () {
res.end();
}, 1000);
}).listen(4444, function () {
var success = false, failure = false;
var error;
axios.get('http://localhost:4444/', {
timeout: 250
}).then(function (res) {
success = true;
}).catch(function (res) {
error = res;
failure = true;
});
setTimeout(function () {
test.equal(success, false, 'request should not succeed');
test.equal(failure, true, 'request should fail');
test.equal(error.code, 'ECONNABORTED');
test.equal(error.message, 'timeout of 250ms exceeded');
test.done();
}, 300);
});
},
testJSON: function (test) {
var data = {
firstName: 'Fred',
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册