diff --git a/lib/_http_server.js b/lib/_http_server.js index 446dc17636636b..22b8b552cc8665 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -360,10 +360,11 @@ Server.prototype.setTimeout = function setTimeout(msecs, callback) { }; Server.prototype[EE.captureRejectionSymbol] = function( - err, event, req, res) { + err, event, ...args) { switch (event) { case 'request': + const [ , res] = args; if (!res.headersSent && !res.writableEnded) { // Don't leak headers. for (const name of res.getHeaderNames()) { @@ -376,7 +377,8 @@ Server.prototype[EE.captureRejectionSymbol] = function( } break; default: - this.emit('error', err); + net.Server.prototype[Symbol.for('nodejs.rejection')] + .call(this, err, event, ...args); } }; diff --git a/lib/net.js b/lib/net.js index e94bed0175a9cc..a5e1ede73a3736 100644 --- a/lib/net.js +++ b/lib/net.js @@ -1655,6 +1655,19 @@ function emitCloseNT(self) { } +Server.prototype[EventEmitter.captureRejectionSymbol] = function( + err, event, sock) { + + switch (event) { + case 'connection': + sock.destroy(err); + break; + default: + this.emit('error', err); + } +}; + + // Legacy alias on the C++ wrapper object. This is not public API, so we may // want to runtime-deprecate it at some point. There's no hurry, though. ObjectDefineProperty(TCP.prototype, 'owner', { diff --git a/test/parallel/test-net-server-capture-rejection.js b/test/parallel/test-net-server-capture-rejection.js new file mode 100644 index 00000000000000..b1564ec26874af --- /dev/null +++ b/test/parallel/test-net-server-capture-rejection.js @@ -0,0 +1,27 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const events = require('events'); +const { createServer, connect } = require('net'); + +events.captureRejections = true; + +const server = createServer(common.mustCall(async (sock) => { + server.close(); + + const _err = new Error('kaboom'); + sock.on('error', common.mustCall((err) => { + assert.strictEqual(err, _err); + })); + throw _err; +})); + +server.listen(0, common.mustCall(() => { + const sock = connect( + server.address().port, + server.address().host + ); + + sock.on('close', common.mustCall()); +}));