Skip to content

Commit

Permalink
fix(common): prevent repeated application of HttpParams mutations (#2…
Browse files Browse the repository at this point in the history
…9045)

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
  • Loading branch information
JoostK authored and benlesh committed Apr 23, 2019
1 parent cd48a53 commit ee65d0d
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 1 deletion.
2 changes: 1 addition & 1 deletion packages/common/http/src/params.ts
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ export class HttpParams {
}
}
});
this.cloneFrom = null;
this.cloneFrom = this.updates = null;
}
}
}
9 changes: 9 additions & 0 deletions packages/common/http/test/params_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => {
Expand Down

0 comments on commit ee65d0d

Please sign in to comment.