@@ -838,3 +838,59 @@ test('does not retry on stream errors when not in errorCodes', async t => {
838838 t . is ( attemptCount , 1 ) ;
839839 t . is ( error ?. code , 'ETEST' ) ;
840840} ) ;
841+
842+ test ( 'does not retry after promise settles (issue #1489)' , async t => {
843+ let retryTriggered = false ;
844+
845+ const response = await got ( 'https://example.com' , {
846+ retry : { limit : 2 , errorCodes : [ 'ECONNRESET' ] } ,
847+ hooks : {
848+ beforeRetry : [ ( ) => {
849+ retryTriggered = true ;
850+ } ] ,
851+ } ,
852+ request ( ) {
853+ const emitter = new EventEmitter ( ) as http . ClientRequest ;
854+ emitter . abort = ( ) => { } ;
855+ // @ts -expect-error Imitating a stream
856+ emitter . end = ( ) => { } ;
857+ emitter . destroyed = false ;
858+ // @ts -expect-error Imitating a stream
859+ emitter . destroy = ( ) => {
860+ emitter . destroyed = true ;
861+ } ;
862+
863+ emitter . write = ( ) => true ;
864+ // @ts -expect-error Imitating a stream
865+ emitter . writable = true ;
866+ // @ts -expect-error Imitating a stream
867+ emitter . writableEnded = false ;
868+
869+ setTimeout ( ( ) => {
870+ const incomingMessage = new PassThroughStream ( ) as unknown as http . IncomingMessage ;
871+ incomingMessage . statusCode = 200 ;
872+ incomingMessage . headers = { } ;
873+
874+ emitter . emit ( 'response' , incomingMessage ) ;
875+
876+ setImmediate ( ( ) => {
877+ // @ts -expect-error PassThrough method
878+ incomingMessage . end ( 'ok' ) ;
879+ } ) ;
880+
881+ // Late error after response - should NOT trigger retry
882+ setTimeout ( ( ) => {
883+ const error = new Error ( 'read ECONNRESET' ) ;
884+ ( error as NodeJS . ErrnoException ) . code = 'ECONNRESET' ;
885+ emitter . emit ( 'error' , error ) ;
886+ } , 10 ) ;
887+ } ) ;
888+
889+ return emitter ;
890+ } ,
891+ throwHttpErrors : false ,
892+ } ) ;
893+
894+ t . is ( response . statusCode , 200 ) ;
895+ t . false ( retryTriggered ) ;
896+ } ) ;
0 commit comments