@@ -9,6 +9,57 @@ var JSON_ENDS = {
9
9
} ;
10
10
var JSON_PROTECTION_PREFIX = / ^ \) \] \} ' , ? \n / ;
11
11
12
+ function paramSerializerFactory ( arraySuffix ) {
13
+
14
+ function serializeValue ( v ) {
15
+ if ( isObject ( v ) ) {
16
+ return isDate ( v ) ? v . toISOString ( ) : toJson ( v ) ;
17
+ }
18
+ return v ;
19
+ }
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 ) ) {
27
+ forEach ( value , function ( v ) {
28
+ parts . push ( encodeUriQuery ( key ) + ( arraySuffix ? '[]' : '' ) + '=' + encodeUriQuery ( serializeValue ( v ) ) ) ;
29
+ } ) ;
30
+ } else {
31
+ parts . push ( encodeUriQuery ( key ) + '=' + encodeUriQuery ( serializeValue ( value ) ) ) ;
32
+ }
33
+ } ) ;
34
+
35
+ return parts . length > 0 ? parts . join ( '&' ) : '' ;
36
+ } ;
37
+ }
38
+
39
+ /**
40
+ * @ngdoc provider
41
+ * @name $$DefaultHttpParamSerializerProvider
42
+ * @description
43
+ *
44
+ * */
45
+ function $$DefaultHttpParamSerializerProvider ( ) {
46
+ this . $get = function ( ) {
47
+ return paramSerializerFactory ( false ) ;
48
+ } ;
49
+ }
50
+
51
+ /**
52
+ * @ngdoc provider
53
+ * @name $$JqueryParamSerializerProvider
54
+ * @description
55
+ *
56
+ * */
57
+ function $$JqueryParamSerializerProvider ( ) {
58
+ this . $get = function ( ) {
59
+ return paramSerializerFactory ( true ) ;
60
+ } ;
61
+ }
62
+
12
63
function defaultHttpResponseTransform ( data , headers ) {
13
64
if ( isString ( data ) ) {
14
65
// Strip json vulnerability protection prefix and trim whitespace
@@ -174,7 +225,9 @@ function $HttpProvider() {
174
225
} ,
175
226
176
227
xsrfCookieName : 'XSRF-TOKEN' ,
177
- xsrfHeaderName : 'X-XSRF-TOKEN'
228
+ xsrfHeaderName : 'X-XSRF-TOKEN' ,
229
+
230
+ paramSerializer : '$$defaultHttpParamSerializer'
178
231
} ;
179
232
180
233
var useApplyAsync = false ;
@@ -225,6 +278,12 @@ function $HttpProvider() {
225
278
226
279
var defaultCache = $cacheFactory ( '$http' ) ;
227
280
281
+ /**
282
+ * Make sure that default param serializer is exposed as a function
283
+ */
284
+ defaults . paramSerializer = isString ( defaults . paramSerializer ) ?
285
+ $injector . get ( defaults . paramSerializer ) : defaults . paramSerializer ;
286
+
228
287
/**
229
288
* Interceptors stored in reverse order. Inner interceptors before outer interceptors.
230
289
* The reversal is needed so that we can build up the interception chain around the
@@ -764,11 +823,14 @@ function $HttpProvider() {
764
823
var config = extend ( {
765
824
method : 'get' ,
766
825
transformRequest : defaults . transformRequest ,
767
- transformResponse : defaults . transformResponse
826
+ transformResponse : defaults . transformResponse ,
827
+ paramSerializer : defaults . paramSerializer
768
828
} , requestConfig ) ;
769
829
770
830
config . headers = mergeHeaders ( requestConfig ) ;
771
831
config . method = uppercase ( config . method ) ;
832
+ config . paramSerializer = isString ( config . paramSerializer ) ?
833
+ $injector . get ( config . paramSerializer ) : config . paramSerializer ;
772
834
773
835
var serverRequest = function ( config ) {
774
836
var headers = config . headers ;
@@ -1032,7 +1094,7 @@ function $HttpProvider() {
1032
1094
cache ,
1033
1095
cachedResp ,
1034
1096
reqHeaders = config . headers ,
1035
- url = buildUrl ( config . url , config . params ) ;
1097
+ url = buildUrl ( config . url , config . paramSerializer ( config . params ) ) ;
1036
1098
1037
1099
$http . pendingRequests . push ( config ) ;
1038
1100
promise . then ( removePendingReq , removePendingReq ) ;
@@ -1139,27 +1201,9 @@ function $HttpProvider() {
1139
1201
}
1140
1202
1141
1203
1142
- function buildUrl ( url , params ) {
1143
- if ( ! params ) return url ;
1144
- var parts = [ ] ;
1145
- forEachSorted ( params , function ( value , key ) {
1146
- if ( value === null || isUndefined ( value ) ) return ;
1147
- if ( ! isArray ( value ) ) value = [ value ] ;
1148
-
1149
- forEach ( value , function ( v ) {
1150
- if ( isObject ( v ) ) {
1151
- if ( isDate ( v ) ) {
1152
- v = v . toISOString ( ) ;
1153
- } else {
1154
- v = toJson ( v ) ;
1155
- }
1156
- }
1157
- parts . push ( encodeUriQuery ( key ) + '=' +
1158
- encodeUriQuery ( v ) ) ;
1159
- } ) ;
1160
- } ) ;
1161
- if ( parts . length > 0 ) {
1162
- url += ( ( url . indexOf ( '?' ) == - 1 ) ? '?' : '&' ) + parts . join ( '&' ) ;
1204
+ function buildUrl ( url , serializedParams ) {
1205
+ if ( serializedParams . length > 0 ) {
1206
+ url += ( ( url . indexOf ( '?' ) == - 1 ) ? '?' : '&' ) + serializedParams ;
1163
1207
}
1164
1208
return url ;
1165
1209
}
0 commit comments