From 8508edbf322bf0240f41a86fa379eb63550e5ec2 Mon Sep 17 00:00:00 2001 From: Matteo Collina Date: Tue, 1 Oct 2019 17:30:39 +0200 Subject: net: implement capture rejections for 'connection' event MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/27867 Reviewed-By: Benjamin Gruenbaum Reviewed-By: James M Snell Reviewed-By: Jeremiah Senkpiel Reviewed-By: Anna Henningsen Reviewed-By: Michaƫl Zasso --- lib/_http_server.js | 6 +++-- lib/net.js | 13 +++++++++++ test/parallel/test-net-server-capture-rejection.js | 27 ++++++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 test/parallel/test-net-server-capture-rejection.js diff --git a/lib/_http_server.js b/lib/_http_server.js index 3444c44a6c..b967cac3ae 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -359,10 +359,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()) { @@ -375,7 +376,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 02fd187480..7e5d0ea621 100644 --- a/lib/net.js +++ b/lib/net.js @@ -1653,6 +1653,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 0000000000..b1564ec268 --- /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()); +})); -- cgit v1.2.3