File tree Expand file tree Collapse file tree 2 files changed +67
-1
lines changed Expand file tree Collapse file tree 2 files changed +67
-1
lines changed Original file line number Diff line number Diff line change @@ -822,10 +822,29 @@ const requestHeaderFieldsTooLargeResponse = Buffer.from(
822822 `HTTP/1.1 431 ${ STATUS_CODES [ 431 ] } \r\n` +
823823 'Connection: close\r\n\r\n' , 'ascii' ,
824824) ;
825+
826+ function warnUnclosedSocket ( ) {
827+ if ( warnUnclosedSocket . emitted ) {
828+ return ;
829+ }
830+
831+ warnUnclosedSocket . emitted = true ;
832+ process . emitWarning (
833+ 'An error event has already been emitted on the socket. ' +
834+ 'Please use the destroy method on the socket while handling ' +
835+ "a 'clientError' event." ,
836+ ) ;
837+ }
838+
825839function socketOnError ( e ) {
826840 // Ignore further errors
827841 this . removeListener ( 'error' , socketOnError ) ;
828- this . on ( 'error' , noop ) ;
842+
843+ if ( this . listenerCount ( 'error' , noop ) === 0 ) {
844+ this . on ( 'error' , noop ) ;
845+ } else {
846+ warnUnclosedSocket ( ) ;
847+ }
829848
830849 if ( ! this . server . emit ( 'clientError' , e , this ) ) {
831850 // Caution must be taken to avoid corrupting the remote peer.
Original file line number Diff line number Diff line change 1+ // Flags: --no-warnings
2+
3+ 'use strict' ;
4+
5+ const common = require ( '../common' ) ;
6+ const assert = require ( 'assert' ) ;
7+ const http = require ( 'http' ) ;
8+ const net = require ( 'net' ) ;
9+
10+ // This test sends an invalid character to a HTTP server and purposely
11+ // does not handle clientError (even if it sets an event handler).
12+ //
13+ // The idea is to let the server emit multiple errors on the socket,
14+ // mostly due to parsing error, and make sure they don't result
15+ // in leaking event listeners.
16+
17+ {
18+ let i = 0 ;
19+ let socket ;
20+ process . on ( 'warning' , common . mustCall ( ) ) ;
21+
22+ const server = http . createServer ( common . mustNotCall ( ) ) ;
23+
24+ server . on ( 'clientError' , common . mustCallAtLeast ( ( err ) => {
25+ assert . strictEqual ( err . code , 'HPE_INVALID_METHOD' ) ;
26+ assert . strictEqual ( err . rawPacket . toString ( ) , '*' ) ;
27+
28+ if ( i === 20 ) {
29+ socket . end ( ) ;
30+ } else {
31+ socket . write ( '*' ) ;
32+ i ++ ;
33+ }
34+ } , 1 ) ) ;
35+
36+ server . listen ( 0 , ( ) => {
37+ socket = net . createConnection ( { port : server . address ( ) . port } ) ;
38+
39+ socket . on ( 'connect' , ( ) => {
40+ socket . write ( '*' ) ;
41+ } ) ;
42+
43+ socket . on ( 'close' , ( ) => {
44+ server . close ( ) ;
45+ } ) ;
46+ } ) ;
47+ }
You can’t perform that action at this time.
0 commit comments