@@ -728,6 +728,13 @@ function requestWithCallback(url, args, callback) {
728728 }
729729
730730 function decodeContent ( res , body , cb ) {
731+ if ( responseAborted ) {
732+ // err = new Error('Remote socket was terminated before `response.end()` was called');
733+ // err.name = 'RemoteSocketClosedError';
734+ debug ( 'Request#%d %s: Remote socket was terminated before `response.end()` was called' , reqId , url ) ;
735+ var err = responseError || new Error ( 'Remote socket was terminated before `response.end()` was called' ) ;
736+ return cb ( err ) ;
737+ }
731738 var encoding = res . headers [ 'content-encoding' ] ;
732739 if ( body . length === 0 || ! encoding ) {
733740 return cb ( null , body , encoding ) ;
@@ -758,7 +765,10 @@ function requestWithCallback(url, args, callback) {
758765
759766 args . requestUrls . push ( parsedUrl . href ) ;
760767
768+ var hasResponse = false ;
769+ var responseError ;
761770 function onResponse ( res ) {
771+ hasResponse = true ;
762772 socketHandledResponses = res . socket [ SOCKET_RESPONSE_COUNT ] = ( res . socket [ SOCKET_RESPONSE_COUNT ] || 0 ) + 1 ;
763773 if ( timing ) {
764774 timing . waiting = Date . now ( ) - requestStartTime ;
@@ -781,7 +791,8 @@ function requestWithCallback(url, args, callback) {
781791 return done ( null , null , res ) ;
782792 }
783793
784- res . on ( 'error' , function ( ) {
794+ res . on ( 'error' , function ( err ) {
795+ responseError = err ;
785796 debug ( 'Request#%d %s: `res error` event emit, total size %d, socket handled %s requests and %s responses' ,
786797 reqId , url , responseSize , socketHandledRequests , socketHandledResponses ) ;
787798 } ) ;
@@ -939,12 +950,6 @@ function requestWithCallback(url, args, callback) {
939950 }
940951 }
941952
942- if ( responseAborted ) {
943- // err = new Error('Remote socket was terminated before `response.end()` was called');
944- // err.name = 'RemoteSocketClosedError';
945- debug ( 'Request#%d %s: Remote socket was terminated before `response.end()` was called' , reqId , url ) ;
946- }
947-
948953 done ( err , data , res ) ;
949954 } ) ;
950955 }
@@ -1161,12 +1166,17 @@ function requestWithCallback(url, args, callback) {
11611166 } ) ;
11621167 }
11631168
1164- var isRequestError = false ;
1169+ var isRequestDone = false ;
11651170 function handleRequestError ( err ) {
1166- if ( isRequestError || ! err ) {
1171+ if ( ! err ) {
11671172 return ;
11681173 }
1169- isRequestError = true ;
1174+ // only ignore request error if response has been received
1175+ // if response has not received, socket error will emit on req
1176+ if ( isRequestDone && hasResponse ) {
1177+ return ;
1178+ }
1179+ isRequestDone = true ;
11701180
11711181 if ( err . name === 'Error' ) {
11721182 err . name = connected ? 'ResponseError' : 'RequestError' ;
@@ -1178,7 +1188,9 @@ function requestWithCallback(url, args, callback) {
11781188 debug ( 'Request#%d pump args.stream to req' , reqId ) ;
11791189 pump ( args . stream , req , handleRequestError ) ;
11801190 } else {
1181- req . end ( body ) ;
1191+ req . end ( body , function ( ) {
1192+ isRequestDone = true ;
1193+ } ) ;
11821194 }
11831195 // when stream already consumed, req's `finish` event is emitted and pump will ignore error after pipe finished
11841196 // but if server response timeout later, we will abort the request and emit an error in req
0 commit comments