diff --git a/lib/adapters/http.js b/lib/adapters/http.js index 85f3061..dbb2ae1 100755 --- a/lib/adapters/http.js +++ b/lib/adapters/http.js @@ -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; @@ -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)); diff --git a/test/unit/adapters/http.js b/test/unit/adapters/http.js index c413b56..4a92589 100644 --- a/test/unit/adapters/http.js +++ b/test/unit/adapters/http.js @@ -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(); + }); + }); + }); + });