@@ -86,10 +86,18 @@ export class Ky {
8686 const isRetriableMethod = ky . _options . retry . methods . includes ( ky . request . method . toLowerCase ( ) ) ;
8787 const result = ( isRetriableMethod ? ky . _retry ( function_ ) : function_ ( ) )
8888 . finally ( async ( ) => {
89- // Now that we know a retry is not needed, close the ReadableStream of the cloned request.
89+ const originalRequest = ky . _originalRequest ;
90+ const cleanupPromises = [ ] ;
91+
92+ if ( originalRequest && ! originalRequest . bodyUsed ) {
93+ cleanupPromises . push ( originalRequest . body ?. cancel ( ) ) ;
94+ }
95+
9096 if ( ! ky . request . bodyUsed ) {
91- await ky . request . body ?. cancel ( ) ;
97+ cleanupPromises . push ( ky . request . body ?. cancel ( ) ) ;
9298 }
99+
100+ await Promise . all ( cleanupPromises ) ;
93101 } ) as ResponsePromise ;
94102
95103 for ( const [ type , mimeType ] of Object . entries ( responseTypes ) as ObjectEntries < typeof responseTypes > ) {
@@ -148,6 +156,7 @@ export class Ky {
148156 protected _retryCount = 0 ;
149157 protected _input : Input ;
150158 protected _options : InternalOptions ;
159+ protected _originalRequest ?: Request ;
151160
152161 // eslint-disable-next-line complexity
153162 constructor ( input : Input , options : Options = { } ) {
@@ -341,13 +350,13 @@ export class Ky {
341350 const nonRequestOptions = findUnknownOptions ( this . request , this . _options ) ;
342351
343352 // Cloning is done here to prepare in advance for retries
344- const mainRequest = this . request ;
345- this . request = mainRequest . clone ( ) ;
353+ this . _originalRequest = this . request ;
354+ this . request = this . _originalRequest . clone ( ) ;
346355
347356 if ( this . _options . timeout === false ) {
348- return this . _options . fetch ( mainRequest , nonRequestOptions ) ;
357+ return this . _options . fetch ( this . _originalRequest , nonRequestOptions ) ;
349358 }
350359
351- return timeout ( mainRequest , nonRequestOptions , this . abortController , this . _options as TimeoutOptions ) ;
360+ return timeout ( this . _originalRequest , nonRequestOptions , this . abortController , this . _options as TimeoutOptions ) ;
352361 }
353362}
0 commit comments