Skip to content

Commit 4eecee0

Browse files
mcollinatargos
authored andcommittedDec 9, 2019
net: implement capture rejections for 'connection' event
PR-URL: #27867 Reviewed-By: Benjamin Gruenbaum <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Jeremiah Senkpiel <[email protected]> Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Michaël Zasso <[email protected]>
1 parent 334d4f6 commit 4eecee0

File tree

3 files changed

+44
-2
lines changed

3 files changed

+44
-2
lines changed
 

‎lib/_http_server.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -359,10 +359,11 @@ Server.prototype.setTimeout = function setTimeout(msecs, callback) {
359359
};
360360

361361
Server.prototype[EE.captureRejectionSymbol] = function(
362-
err, event, req, res) {
362+
err, event, ...args) {
363363

364364
switch (event) {
365365
case 'request':
366+
const [ , res] = args;
366367
if (!res.headersSent && !res.writableEnded) {
367368
// Don't leak headers.
368369
for (const name of res.getHeaderNames()) {
@@ -375,7 +376,8 @@ Server.prototype[EE.captureRejectionSymbol] = function(
375376
}
376377
break;
377378
default:
378-
this.emit('error', err);
379+
net.Server.prototype[Symbol.for('nodejs.rejection')]
380+
.call(this, err, event, ...args);
379381
}
380382
};
381383

‎lib/net.js

+13
Original file line numberDiff line numberDiff line change
@@ -1653,6 +1653,19 @@ function emitCloseNT(self) {
16531653
}
16541654

16551655

1656+
Server.prototype[EventEmitter.captureRejectionSymbol] = function(
1657+
err, event, sock) {
1658+
1659+
switch (event) {
1660+
case 'connection':
1661+
sock.destroy(err);
1662+
break;
1663+
default:
1664+
this.emit('error', err);
1665+
}
1666+
};
1667+
1668+
16561669
// Legacy alias on the C++ wrapper object. This is not public API, so we may
16571670
// want to runtime-deprecate it at some point. There's no hurry, though.
16581671
ObjectDefineProperty(TCP.prototype, 'owner', {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const assert = require('assert');
5+
const events = require('events');
6+
const { createServer, connect } = require('net');
7+
8+
events.captureRejections = true;
9+
10+
const server = createServer(common.mustCall(async (sock) => {
11+
server.close();
12+
13+
const _err = new Error('kaboom');
14+
sock.on('error', common.mustCall((err) => {
15+
assert.strictEqual(err, _err);
16+
}));
17+
throw _err;
18+
}));
19+
20+
server.listen(0, common.mustCall(() => {
21+
const sock = connect(
22+
server.address().port,
23+
server.address().host
24+
);
25+
26+
sock.on('close', common.mustCall());
27+
}));

0 commit comments

Comments
 (0)