Skip to content

Commit fe43bd8

Browse files
committed
http: fix ClientRequest unhandled errors
ClientRequest could someone cause an unhandled error from socket. Fixes: #36931 PR-URL: #36970 Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Benjamin Gruenbaum <[email protected]>
1 parent bc89048 commit fe43bd8

File tree

2 files changed

+41
-7
lines changed

2 files changed

+41
-7
lines changed

lib/_http_client.js

+9-7
Original file line numberDiff line numberDiff line change
@@ -801,13 +801,15 @@ function onSocketNT(req, socket, err) {
801801
req.emit('close');
802802
}
803803

804-
if (!err && req.agent) {
805-
socket?.emit('free');
806-
} else if (socket) {
807-
finished(socket.destroy(err || req[kError]), (er) => {
808-
_destroy(req, er || err);
809-
});
810-
return;
804+
if (socket) {
805+
if (!err && req.agent && !socket.destroyed) {
806+
socket.emit('free');
807+
} else {
808+
finished(socket.destroy(err || req[kError]), (er) => {
809+
_destroy(req, er || err);
810+
});
811+
return;
812+
}
811813
}
812814

813815
_destroy(req, err || req[kError]);
+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const http = require('http');
5+
const net = require('net');
6+
7+
function createConnection() {
8+
const socket = new net.Socket();
9+
10+
process.nextTick(function() {
11+
socket.destroy(new Error('Oops'));
12+
});
13+
14+
return socket;
15+
}
16+
17+
{
18+
const req = http.get({ createConnection });
19+
20+
req.on('error', common.expectsError({ name: 'Error', message: 'Oops' }));
21+
req.abort();
22+
}
23+
24+
{
25+
class CustomAgent extends http.Agent {}
26+
CustomAgent.prototype.createConnection = createConnection;
27+
28+
const req = http.get({ agent: new CustomAgent() });
29+
30+
req.on('error', common.expectsError({ name: 'Error', message: 'Oops' }));
31+
req.abort();
32+
}

0 commit comments

Comments
 (0)