Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding aborted event handler #3916

Merged
merged 14 commits into from
Oct 29, 2021
12 changes: 12 additions & 0 deletions lib/adapters/http.js
Expand Up @@ -60,8 +60,10 @@ module.exports = function httpAdapter(config) {
done();
resolvePromise(value);
};
var rejected = false;
var reject = function reject(value) {
done();
rejected = true;
rejectPromise(value);
};
var data = config.data;
Expand Down Expand Up @@ -269,12 +271,22 @@ module.exports = function httpAdapter(config) {

// make sure the content length is not over the maxContentLength if specified
if (config.maxContentLength > -1 && totalResponseBytes > config.maxContentLength) {
// stream.destoy() emit aborted event before calling reject() on Node.js v16
rejected = true;
stream.destroy();
reject(createError('maxContentLength size of ' + config.maxContentLength + ' exceeded',
config, null, lastRequest));
}
});

stream.on('aborted', function handlerStreamAborted() {
if (rejected) {
return;
}
stream.destroy();
reject(createError('error request aborted', config, 'ERR_REQUEST_ABORTED', lastRequest));
});

stream.on('error', function handleStreamError(err) {
if (req.aborted) return;
reject(enhanceError(err, config, null, lastRequest));
Expand Down
31 changes: 31 additions & 0 deletions test/unit/adapters/http.js
Expand Up @@ -1003,5 +1003,36 @@ describe('supports http with nodejs', function () {
});
});

it('should throw an error if http server that aborts a chunked request', function (done) {
server = http.createServer(function (req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('chunk 1');
setTimeout(function () {
res.write('chunk 2');
}, 100);
setTimeout(function() {
res.destroy();
}, 200);
}).listen(4444, function () {
var success = false, failure = false;
var error;

axios.get('http://localhost:4444/aborted', {
timeout: 500
}).then(function (res) {
success = true;
}).catch(function (err) {
error = err;
failure = true;
}).finally(function () {
assert.strictEqual(success, false, 'request should not succeed');
assert.strictEqual(failure, true, 'request should fail');
assert.strictEqual(error.code, 'ERR_REQUEST_ABORTED');
assert.strictEqual(error.message, 'error request aborted');
done();
});
});
});

});