@@ -57,6 +57,9 @@ const EMPTY_BUF = Buffer.alloc(0)
5757const FastBuffer = Buffer [ Symbol . species ]
5858const addListener = util . addListener
5959const removeAllListeners = util . removeAllListeners
60+ const kIdleSocketValidation = Symbol ( 'kIdleSocketValidation' )
61+ const kIdleSocketValidationTimeout = Symbol ( 'kIdleSocketValidationTimeout' )
62+ const kSocketUsed = Symbol ( 'kSocketUsed' )
6063
6164let extractBody
6265
@@ -371,6 +374,11 @@ class Parser {
371374 return - 1
372375 }
373376
377+ if ( client [ kRunning ] === 0 ) {
378+ util . destroy ( socket , new SocketError ( 'bad response' , util . getSocketInfo ( socket ) ) )
379+ return - 1
380+ }
381+
374382 const request = client [ kQueue ] [ client [ kRunningIdx ] ]
375383 if ( ! request ) {
376384 return - 1
@@ -474,6 +482,11 @@ class Parser {
474482 return - 1
475483 }
476484
485+ if ( client [ kRunning ] === 0 ) {
486+ util . destroy ( socket , new SocketError ( 'bad response' , util . getSocketInfo ( socket ) ) )
487+ return - 1
488+ }
489+
477490 const request = client [ kQueue ] [ client [ kRunningIdx ] ]
478491
479492 /* istanbul ignore next: difficult to make a test case for */
@@ -647,6 +660,7 @@ class Parser {
647660 request . onComplete ( headers )
648661
649662 client [ kQueue ] [ client [ kRunningIdx ] ++ ] = null
663+ socket [ kSocketUsed ] = true
650664
651665 if ( socket [ kWriting ] ) {
652666 assert ( client [ kRunning ] === 0 )
@@ -705,6 +719,9 @@ async function connectH1 (client, socket) {
705719 socket [ kWriting ] = false
706720 socket [ kReset ] = false
707721 socket [ kBlocking ] = false
722+ socket [ kIdleSocketValidation ] = 0
723+ socket [ kIdleSocketValidationTimeout ] = null
724+ socket [ kSocketUsed ] = false
708725 socket [ kParser ] = new Parser ( client , socket , llhttpInstance )
709726
710727 addListener ( socket , 'error' , function ( err ) {
@@ -751,6 +768,8 @@ async function connectH1 (client, socket) {
751768 const client = this [ kClient ]
752769 const parser = this [ kParser ]
753770
771+ clearIdleSocketValidation ( this )
772+
754773 if ( parser ) {
755774 if ( ! this [ kError ] && parser . statusCode && ! parser . shouldKeepAlive ) {
756775 this [ kError ] = parser . finish ( ) || this [ kError ]
@@ -816,7 +835,7 @@ async function connectH1 (client, socket) {
816835 return socket . destroyed
817836 } ,
818837 busy ( request ) {
819- if ( socket [ kWriting ] || socket [ kReset ] || socket [ kBlocking ] ) {
838+ if ( socket [ kWriting ] || socket [ kReset ] || socket [ kBlocking ] || socket [ kIdleSocketValidation ] === 1 ) {
820839 return true
821840 }
822841
@@ -854,6 +873,31 @@ async function connectH1 (client, socket) {
854873 }
855874}
856875
876+ function clearIdleSocketValidation ( socket ) {
877+ if ( socket [ kIdleSocketValidationTimeout ] ) {
878+ clearTimeout ( socket [ kIdleSocketValidationTimeout ] )
879+ socket [ kIdleSocketValidationTimeout ] = null
880+ }
881+
882+ socket [ kIdleSocketValidation ] = 0
883+ }
884+
885+ function scheduleIdleSocketValidation ( client , socket ) {
886+ socket [ kIdleSocketValidation ] = 1
887+ socket [ kIdleSocketValidationTimeout ] = setTimeout ( ( ) => {
888+ socket [ kIdleSocketValidationTimeout ] = null
889+ socket [ kIdleSocketValidation ] = 2
890+
891+ if ( client [ kSocket ] === socket && ! socket . destroyed ) {
892+ client [ kResume ] ( )
893+ }
894+ } , 0 )
895+ socket [ kIdleSocketValidationTimeout ] . unref ?. ( )
896+ }
897+
898+ /**
899+ * @param {import('./client.js') } client
900+ */
857901function resumeH1 ( client ) {
858902 const socket = client [ kSocket ]
859903
@@ -868,6 +912,32 @@ function resumeH1 (client) {
868912 socket [ kNoRef ] = false
869913 }
870914
915+ if ( client [ kRunning ] === 0 && client [ kPending ] > 0 && socket [ kSocketUsed ] ) {
916+ if ( socket [ kIdleSocketValidation ] === 0 ) {
917+ scheduleIdleSocketValidation ( client , socket )
918+ socket [ kParser ] . readMore ( )
919+ if ( socket . destroyed ) {
920+ return
921+ }
922+ return
923+ }
924+
925+ if ( socket [ kIdleSocketValidation ] === 1 ) {
926+ socket [ kParser ] . readMore ( )
927+ if ( socket . destroyed ) {
928+ return
929+ }
930+ return
931+ }
932+ }
933+
934+ if ( client [ kRunning ] === 0 ) {
935+ socket [ kParser ] . readMore ( )
936+ if ( socket . destroyed ) {
937+ return
938+ }
939+ }
940+
871941 if ( client [ kSize ] === 0 ) {
872942 if ( socket [ kParser ] . timeoutType !== TIMEOUT_KEEP_ALIVE ) {
873943 socket [ kParser ] . setTimeout ( client [ kKeepAliveTimeoutValue ] , TIMEOUT_KEEP_ALIVE )
@@ -961,6 +1031,7 @@ function writeH1 (client, request) {
9611031 }
9621032
9631033 const socket = client [ kSocket ]
1034+ clearIdleSocketValidation ( socket )
9641035
9651036 const abort = ( err ) => {
9661037 if ( request . aborted || request . completed ) {
0 commit comments