From 8e8e89a1193e33a4deab6eb5d91b48266dc67922 Mon Sep 17 00:00:00 2001 From: JoostK Date: Fri, 1 Mar 2019 00:52:22 +0100 Subject: [PATCH] fix(common): prevent repeated application of HttpParams mutations (#29045) Previously, an instance of HttpParams would retain its list of mutations after they have been materialized as a result of a read operation. Not only does this unnecessarily hold onto memory, more importantly does it introduce a bug where branching of off a materialized instance would reconsider the set of mutations that had already been applied, resulting in repeated application of mutations. This commit fixes the bug by clearing the list of pending mutations after they have been materialized, such that they will not be considered once again for branched off instances. Fixes #20430 PR Close #29045 --- packages/common/http/src/params.ts | 2 +- packages/common/http/test/params_spec.ts | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/common/http/src/params.ts b/packages/common/http/src/params.ts index 60a71ef2d0..4298b6d49e 100755 --- a/packages/common/http/src/params.ts +++ b/packages/common/http/src/params.ts @@ -227,7 +227,7 @@ export class HttpParams { } } }); - this.cloneFrom = null; + this.cloneFrom = this.updates = null; } } } diff --git a/packages/common/http/test/params_spec.ts b/packages/common/http/test/params_spec.ts index 0e798129bd..669959c851 100644 --- a/packages/common/http/test/params_spec.ts +++ b/packages/common/http/test/params_spec.ts @@ -53,6 +53,15 @@ import {HttpParams} from '@angular/common/http/src/params'; const mutated = body.delete('a', '2').delete('a', '4'); expect(mutated.getAll('a')).toEqual(['1', '3', '5']); }); + + it('should not repeat mutations that have already been materialized', () => { + const body = new HttpParams({fromString: 'a=b'}); + const mutated = body.append('a', 'c'); + expect(mutated.toString()).toEqual('a=b&a=c'); + const mutated2 = mutated.append('c', 'd'); + expect(mutated.toString()).toEqual('a=b&a=c'); + expect(mutated2.toString()).toEqual('a=b&a=c&c=d'); + }); }); describe('read operations', () => {