diff --git a/packages/common/http/src/xhr.ts b/packages/common/http/src/xhr.ts index c5140da149..11e0fd544e 100644 --- a/packages/common/http/src/xhr.ts +++ b/packages/common/http/src/xhr.ts @@ -339,7 +339,9 @@ export class HttpXhrBackend implements HttpBackend { } // Finally, abort the in-flight request. - xhr.abort(); + if (xhr.readyState !== xhr.DONE) { + xhr.abort(); + } }; }); } diff --git a/packages/common/http/test/xhr_spec.ts b/packages/common/http/test/xhr_spec.ts index eb09b453aa..ae37b9e5d4 100644 --- a/packages/common/http/test/xhr_spec.ts +++ b/packages/common/http/test/xhr_spec.ts @@ -147,6 +147,17 @@ const XSSI_PREFIX = ')]}\'\n'; }); factory.mock.mockErrorEvent(new Error('blah')); }); + it('avoids abort a request when fetch operation is completed', done => { + const abort = jasmine.createSpy('abort'); + + backend.handle(TEST_POST).toPromise().then(() => { + expect(abort).not.toHaveBeenCalled(); + done(); + }); + + factory.mock.abort = abort; + factory.mock.mockFlush(200, 'OK', 'Done'); + }); describe('progress events', () => { it('are emitted for download progress', done => { backend.handle(TEST_POST.clone({reportProgress: true}))