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

Commit 2420a0a

Browse files
lgalfasopetebacondarwin
authored andcommitted
fix($httpParamSerializerJQLike): follow jQuery logic for nested params
Closes #11551 Closes #11635
1 parent 9711e3e commit 2420a0a

File tree

2 files changed

+54
-28
lines changed

2 files changed

+54
-28
lines changed

src/ng/http.js

+45-27
Original file line numberDiff line numberDiff line change
@@ -9,34 +9,14 @@ var JSON_ENDS = {
99
};
1010
var JSON_PROTECTION_PREFIX = /^\)\]\}',?\n/;
1111

12-
function paramSerializerFactory(jQueryMode) {
13-
14-
function serializeValue(v) {
15-
if (isObject(v)) {
16-
return isDate(v) ? v.toISOString() : toJson(v);
17-
}
18-
return v;
12+
function serializeValue(v) {
13+
if (isObject(v)) {
14+
return isDate(v) ? v.toISOString() : toJson(v);
1915
}
20-
21-
return function paramSerializer(params) {
22-
if (!params) return '';
23-
var parts = [];
24-
forEachSorted(params, function(value, key) {
25-
if (value === null || isUndefined(value)) return;
26-
if (isArray(value) || isObject(value) && jQueryMode) {
27-
forEach(value, function(v, k) {
28-
var keySuffix = jQueryMode ? '[' + (!isArray(value) ? k : '') + ']' : '';
29-
parts.push(encodeUriQuery(key + keySuffix) + '=' + encodeUriQuery(serializeValue(v)));
30-
});
31-
} else {
32-
parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(value)));
33-
}
34-
});
35-
36-
return parts.length > 0 ? parts.join('&') : '';
37-
};
16+
return v;
3817
}
3918

19+
4020
function $HttpParamSerializerProvider() {
4121
/**
4222
* @ngdoc service
@@ -51,7 +31,22 @@ function $HttpParamSerializerProvider() {
5131
* * `{'foo': {'bar':'baz'}}` results in `foo=%7B%22bar%22%3A%22baz%22%7D"` (stringified and encoded representation of an object)
5232
* */
5333
this.$get = function() {
54-
return paramSerializerFactory(false);
34+
return function ngParamSerializer(params) {
35+
if (!params) return '';
36+
var parts = [];
37+
forEachSorted(params, function(value, key) {
38+
if (value === null || isUndefined(value)) return;
39+
if (isArray(value)) {
40+
forEach(value, function(v, k) {
41+
parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(v)));
42+
});
43+
} else {
44+
parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(value)));
45+
}
46+
});
47+
48+
return parts.join('&');
49+
};
5550
};
5651
}
5752

@@ -64,7 +59,30 @@ function $HttpParamSerializerJQLikeProvider() {
6459
* Alternative $http params serializer that follows jQuery's [`param()`](http://api.jquery.com/jquery.param/) method logic.
6560
* */
6661
this.$get = function() {
67-
return paramSerializerFactory(true);
62+
return function jQueryLikeParamSerializer(params) {
63+
if (!params) return '';
64+
var parts = [];
65+
serialize(params, '', true);
66+
return parts.join('&');
67+
68+
function serialize(toSerialize, prefix, topLevel) {
69+
if (toSerialize === null || isUndefined(toSerialize)) return;
70+
if (isArray(toSerialize)) {
71+
forEach(toSerialize, function(value) {
72+
serialize(value, prefix + '[]');
73+
});
74+
} else if (isObject(toSerialize) && !isDate(toSerialize)) {
75+
forEachSorted(toSerialize, function(value, key) {
76+
serialize(value, prefix +
77+
(topLevel ? '' : '[') +
78+
key +
79+
(topLevel ? '' : ']'));
80+
});
81+
} else {
82+
parts.push(encodeUriQuery(prefix) + '=' + encodeUriQuery(serializeValue(toSerialize)));
83+
}
84+
}
85+
}
6886
};
6987
}
7088

test/ng/httpSpec.js

+9-1
Original file line numberDiff line numberDiff line change
@@ -1992,6 +1992,8 @@ describe('$http param serializers', function() {
19921992
it('should serialize objects', function() {
19931993
expect(defSer({foo: 'foov', bar: 'barv'})).toEqual('bar=barv&foo=foov');
19941994
expect(jqrSer({foo: 'foov', bar: 'barv'})).toEqual('bar=barv&foo=foov');
1995+
expect(defSer({someDate: new Date('2014-07-15T17:30:00.000Z')})).toEqual('someDate=2014-07-15T17:30:00.000Z');
1996+
expect(jqrSer({someDate: new Date('2014-07-15T17:30:00.000Z')})).toEqual('someDate=2014-07-15T17:30:00.000Z');
19951997
});
19961998

19971999
});
@@ -2010,10 +2012,16 @@ describe('$http param serializers', function() {
20102012
expect(decodeURIComponent(jqrSer({a: 'b', foo: ['bar', 'baz']}))).toEqual('a=b&foo[]=bar&foo[]=baz');
20112013
});
20122014

2013-
it('should serialize objects by repeating param name with [kay] suffix', function() {
2015+
it('should serialize objects by repeating param name with [key] suffix', function() {
20142016
expect(jqrSer({a: 'b', foo: {'bar': 'barv', 'baz': 'bazv'}})).toEqual('a=b&foo%5Bbar%5D=barv&foo%5Bbaz%5D=bazv');
20152017
//a=b&foo[bar]=barv&foo[baz]=bazv
20162018
});
2019+
2020+
it('should serialize nested objects by repeating param name with [key] suffix', function() {
2021+
expect(jqrSer({a: ['b', {c: 'd'}], e: {f: 'g', 'h': ['i', 'j']}})).toEqual(
2022+
'a%5B%5D=b&a%5B%5D%5Bc%5D=d&e%5Bf%5D=g&e%5Bh%5D%5B%5D=i&e%5Bh%5D%5B%5D=j');
2023+
//a[]=b&a[][c]=d&e[f]=g&e[h][]=i&e[h][]=j
2024+
});
20172025
});
20182026

20192027
});

0 commit comments

Comments
 (0)