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 f84c4b0 commit 8e8e89a
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
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
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 8e8e89a

Please sign in to comment.