Skip to content

Commit

Permalink
Adding aborted event handler (#3916)
Browse files Browse the repository at this point in the history
* Adding test of aborts request

* Adding aborted event handler

* Fixing timing of setting rejected flag

Co-authored-by: Jay <[email protected]>
  • Loading branch information
koh110 and jasonsaayman authored Oct 29, 2021
1 parent 1885ac7 commit c5fe05b
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 0 deletions.
12 changes: 12 additions & 0 deletions lib/adapters/http.js
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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();
});
});
});

});

0 comments on commit c5fe05b

Please sign in to comment.