From 8a745081307c16644796c333531edcb4591ce235 Mon Sep 17 00:00:00 2001 From: Dmitrij Kuba Date: Sun, 31 May 2020 17:32:21 +0300 Subject: [PATCH] fix(http): avoid abort a request when fetch operation is completed (#37367) `abort` method is calling, even if fetch operation is completed Fixes https://github.com/angular/angular/issues/36537 PR Close #37367 --- packages/common/http/src/xhr.ts | 4 +++- packages/common/http/test/xhr_spec.ts | 11 +++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) 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}))