Skip to content

Commit 4cdc5ea

Browse files
ronagdanielleadams
authored andcommitted
http: fix ClientRequest unhandled errors
ClientRequest could someone cause an unhandled error from socket. Fixes: #36931 PR-URL: #36970 Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
1 parent b87c0d6 commit 4cdc5ea

2 files changed

Lines changed: 41 additions & 7 deletions

File tree

‎lib/_http_client.js‎

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -818,13 +818,15 @@ function onSocketNT(req, socket, err) {
818818
req.emit('close');
819819
}
820820

821-
if(!err&&req.agent){
822-
socket?.emit('free');
823-
}elseif(socket){
824-
finished(socket.destroy(err||req[kError]),(er)=>{
825-
_destroy(req,er||err);
826-
});
827-
return;
821+
if(socket){
822+
if(!err&&req.agent&&!socket.destroyed){
823+
socket.emit('free');
824+
}else{
825+
finished(socket.destroy(err||req[kError]),(er)=>{
826+
_destroy(req,er||err);
827+
});
828+
return;
829+
}
828830
}
829831

830832
_destroy(req,err||req[kError]);
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
'use strict';
2+
3+
constcommon=require('../common');
4+
consthttp=require('http');
5+
constnet=require('net');
6+
7+
functioncreateConnection(){
8+
constsocket=newnet.Socket();
9+
10+
process.nextTick(function(){
11+
socket.destroy(newError('Oops'));
12+
});
13+
14+
returnsocket;
15+
}
16+
17+
{
18+
constreq=http.get({ createConnection });
19+
20+
req.on('error',common.expectsError({name: 'Error',message: 'Oops'}));
21+
req.abort();
22+
}
23+
24+
{
25+
classCustomAgentextendshttp.Agent{}
26+
CustomAgent.prototype.createConnection=createConnection;
27+
28+
constreq=http.get({agent: newCustomAgent()});
29+
30+
req.on('error',common.expectsError({name: 'Error',message: 'Oops'}));
31+
req.abort();
32+
}

0 commit comments

Comments
 (0)