Skip to content
Permalink
Browse files

fix(common): prevent repeated application of HttpParams mutations (#2…

…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 Feb 28, 2019
1 parent f84c4b0 commit 8e8e89a1193e33a4deab6eb5d91b48266dc67922
Showing with 10 additions and 1 deletion.
  1. +1 −1 packages/common/http/src/params.ts
  2. +9 −0 packages/common/http/test/params_spec.ts
@@ -227,7 +227,7 @@ export class HttpParams {
}
}
});
this.cloneFrom = null;
this.cloneFrom = this.updates = null;
}
}
}
@@ -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', () => {

0 comments on commit 8e8e89a

Please sign in to comment.
You can’t perform that action at this time.