Skip to content

Commit 5eef00a

Browse files
mcollinatargos
authored andcommitted
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 99a09a2 commit 5eef00a

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
@@ -360,10 +360,11 @@ Server.prototype.setTimeout = function setTimeout(msecs, callback) {
360360
};
361361

362362
Server.prototype[EE.captureRejectionSymbol] = function(
363-
err, event, req, res) {
363+
err, event, ...args) {
364364

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

lib/net.js

+13
Original file line numberDiff line numberDiff line change
@@ -1655,6 +1655,19 @@ function emitCloseNT(self) {
16551655
}
16561656

16571657

1658+
Server.prototype[EventEmitter.captureRejectionSymbol] = function(
1659+
err, event, sock) {
1660+
1661+
switch (event) {
1662+
case 'connection':
1663+
sock.destroy(err);
1664+
break;
1665+
default:
1666+
this.emit('error', err);
1667+
}
1668+
};
1669+
1670+
16581671
// Legacy alias on the C++ wrapper object. This is not public API, so we may
16591672
// want to runtime-deprecate it at some point. There's no hurry, though.
16601673
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)