Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit a784fab

Browse files
frederikprijckgkalpak
authored andcommitted
fix($httpParamSerializerJQLike): call functions as jQuery does
Previously, `httpParamSerializerJQLike` stringified function properties without executing them. This commit ensures function properties are executed and the return value is used. Fixes #16138 Closes #16139
1 parent 3650723 commit a784fab

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

src/ng/http.js

+3
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,9 @@ function $HttpParamSerializerJQLikeProvider() {
122122
(topLevel ? '' : ']'));
123123
});
124124
} else {
125+
if (isFunction(toSerialize)) {
126+
toSerialize = toSerialize();
127+
}
125128
parts.push(encodeUriQuery(prefix) + '=' +
126129
(toSerialize == null ? '' : encodeUriQuery(serializeValue(toSerialize))));
127130
}

test/ng/httpSpec.js

+24
Original file line numberDiff line numberDiff line change
@@ -2364,17 +2364,41 @@ describe('$http param serializers', function() {
23642364
expect(decodeURIComponent(jqrSer({a: 'b', foo: ['bar', 'baz']}))).toEqual('a=b&foo[]=bar&foo[]=baz');
23652365
});
23662366

2367+
it('should serialize arrays with functions', function() {
2368+
expect(jqrSer({foo: [valueFn('bar')]})).toEqual('foo%5B%5D=bar'); // foo[]=bar
2369+
});
2370+
2371+
it('should serialize arrays with functions inside objects', function() {
2372+
expect(jqrSer({foo: {bar: [valueFn('baz')]}})).toEqual('foo%5Bbar%5D%5B%5D=baz'); // foo[bar][]=baz
2373+
});
2374+
23672375
it('should serialize objects by repeating param name with [key] suffix', function() {
23682376
expect(jqrSer({a: 'b', foo: {'bar': 'barv', 'baz': 'bazv'}})).toEqual('a=b&foo%5Bbar%5D=barv&foo%5Bbaz%5D=bazv');
23692377
//a=b&foo[bar]=barv&foo[baz]=bazv
23702378
});
23712379

2380+
it('should serialize objects with function properties', function() {
2381+
expect(jqrSer({a: valueFn('b')})).toEqual('a=b');
2382+
});
2383+
2384+
it('should serialize objects with function properties returning an object', function() {
2385+
expect(jqrSer({a: valueFn({b: 'c'})})).toEqual('a=%7B%22b%22:%22c%22%7D'); //a={"b":"c"}
2386+
});
2387+
23722388
it('should serialize nested objects by repeating param name with [key] suffix', function() {
23732389
expect(jqrSer({a: ['b', {c: 'd'}], e: {f: 'g', 'h': ['i', 'j']}})).toEqual(
23742390
'a%5B%5D=b&a%5B1%5D%5Bc%5D=d&e%5Bf%5D=g&e%5Bh%5D%5B%5D=i&e%5Bh%5D%5B%5D=j');
23752391
//a[]=b&a[1][c]=d&e[f]=g&e[h][]=i&e[h][]=j
23762392
});
23772393

2394+
it('should serialize nested objects with function properties', function() {
2395+
expect(jqrSer({foo: {bar: valueFn('barv')}})).toEqual('foo%5Bbar%5D=barv'); //foo[bar]=barv
2396+
});
2397+
2398+
it('should serialize nested objects with function properties returning an object', function() {
2399+
expect(jqrSer({foo: {bar: valueFn({bav: 'barv'})}})).toEqual('foo%5Bbar%5D=%7B%22bav%22:%22barv%22%7D'); //foo[bar]={"bav":"barv"}
2400+
});
2401+
23782402
it('should serialize objects inside array elements using their index', function() {
23792403
expect(jqrSer({a: ['b', 'c'], d: [{e: 'f', g: 'h'}, 'i', {j: 'k'}]})).toEqual(
23802404
'a%5B%5D=b&a%5B%5D=c&d%5B0%5D%5Be%5D=f&d%5B0%5D%5Bg%5D=h&d%5B%5D=i&d%5B2%5D%5Bj%5D=k');

0 commit comments

Comments
 (0)