diff --git a/lib/_http_server.js b/lib/_http_server.js index c8b27dcd42cb5b..f52ec2ffa2008c 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -56,12 +56,16 @@ const { getOrSetAsyncId } = require('internal/async_hooks'); const { IncomingMessage } = require('_http_incoming'); +const { + connResetException, + codes +} = require('internal/errors'); const { ERR_HTTP_HEADERS_SENT, ERR_HTTP_INVALID_STATUS_CODE, ERR_INVALID_ARG_TYPE, ERR_INVALID_CHAR -} = require('internal/errors').codes; +} = codes; const { validateInteger } = require('internal/validators'); const Buffer = require('buffer').Buffer; const { @@ -533,8 +537,12 @@ function socketOnClose(socket, state) { function abortIncoming(incoming) { while (incoming.length) { const req = incoming.shift(); + // TODO(ronag): req.destroy(err) req.aborted = true; req.emit('aborted'); + if (req.listenerCount('error') > 0) { + req.emit('error', connResetException('aborted')); + } req.emit('close'); } // Abort socket._httpMessage ? diff --git a/test/parallel/test-http-aborted.js b/test/parallel/test-http-aborted.js index c3d7e4641f4501..44ee106b18df06 100644 --- a/test/parallel/test-http-aborted.js +++ b/test/parallel/test-http-aborted.js @@ -4,23 +4,52 @@ const common = require('../common'); const http = require('http'); const assert = require('assert'); -const server = http.createServer(common.mustCall(function(req, res) { - req.on('aborted', common.mustCall(function() { - assert.strictEqual(this.aborted, true); - server.close(); +{ + const server = http.createServer(common.mustCall(function(req, res) { + req.on('aborted', common.mustCall(function() { + assert.strictEqual(this.aborted, true); + })); + req.on('error', common.mustCall(function(err) { + assert.strictEqual(err.code, 'ECONNRESET'); + server.close(); + })); + assert.strictEqual(req.aborted, false); + res.write('hello'); + })); + + server.listen(0, common.mustCall(() => { + const req = http.get({ + port: server.address().port, + headers: { connection: 'keep-alive' } + }, common.mustCall((res) => { + res.on('aborted', common.mustCall(() => { + assert.strictEqual(res.aborted, true); + })); + req.abort(); + })); + })); +} + +{ + // Don't crash if no 'error' handler on server request. + + const server = http.createServer(common.mustCall(function(req, res) { + req.on('aborted', common.mustCall(function() { + assert.strictEqual(this.aborted, true); + })); + assert.strictEqual(req.aborted, false); + res.write('hello'); })); - assert.strictEqual(req.aborted, false); - res.write('hello'); -})); -server.listen(0, common.mustCall(() => { - const req = http.get({ - port: server.address().port, - headers: { connection: 'keep-alive' } - }, common.mustCall((res) => { - res.on('aborted', common.mustCall(() => { - assert.strictEqual(res.aborted, true); + server.listen(0, common.mustCall(() => { + const req = http.get({ + port: server.address().port, + headers: { connection: 'keep-alive' } + }, common.mustCall((res) => { + res.on('aborted', common.mustCall(() => { + assert.strictEqual(res.aborted, true); + })); + req.abort(); })); - req.abort(); })); -})); +}