@@ -38,6 +38,7 @@ var MANDATORY_SUCCESS = 'advanced-http: missing mandatory "onSuccess" callback f
38
38
var MANDATORY_FAIL = 'advanced-http: missing mandatory "onFail" callback function' ;
39
39
var ADDING_COOKIES_NOT_SUPPORTED = 'advanced-http: "setHeader" does not support adding cookies, please use "setCookie" function instead' ;
40
40
var HEADER_VALUE_MUST_BE_STRING = 'advanced-http: header values must be strings' ;
41
+ var DATA_TYPE_MISMATCH = 'advanced-http: "data" argument supports only following data types:' ;
41
42
42
43
// Thanks Mozilla: https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_.22Unicode_Problem.22
43
44
function b64EncodeUnicode ( str ) {
@@ -155,12 +156,64 @@ function getMergedHeaders(url, requestHeaders, predefinedHeaders) {
155
156
return mergedHeaders ;
156
157
}
157
158
159
+ function getTypeOf ( object ) {
160
+ // typeof is not working reliably in JS
161
+ switch ( Object . prototype . toString . call ( object ) ) {
162
+ case '[object Array]' :
163
+ return 'Array' ;
164
+ case '[object Boolean]' :
165
+ return 'Boolean' ;
166
+ case '[object Function]' :
167
+ return 'Function' ;
168
+ case '[object Null]' :
169
+ return 'Null' ;
170
+ case '[object Number]' :
171
+ return 'Number' ;
172
+ case '[object Object]' :
173
+ return 'Object' ;
174
+ case '[object String]' :
175
+ return 'String' ;
176
+ case '[object Undefined]' :
177
+ return 'Undefined' ;
178
+ default :
179
+ return 'Unknown' ;
180
+ }
181
+ }
182
+
183
+ function getAllowedDataTypes ( dataSerializer ) {
184
+ switch ( dataSerializer ) {
185
+ case 'utf8' :
186
+ return [ 'String' ] ;
187
+ case 'urlencoded' :
188
+ return [ 'Object' ] ;
189
+ default :
190
+ return [ 'Array' , 'Object' ] ;
191
+ }
192
+ }
193
+
194
+ function getProcessedData ( data , dataSerializer ) {
195
+ data = data || { } ;
196
+
197
+ var currentDataType = getTypeOf ( data ) ;
198
+ var allowedDataTypes = getAllowedDataTypes ( dataSerializer ) ;
199
+
200
+ if ( allowedDataTypes . indexOf ( currentDataType ) === - 1 ) {
201
+ throw new Error ( DATA_TYPE_MISMATCH + ' ' + allowedDataTypes . join ( ', ' ) ) ;
202
+ }
203
+
204
+ if ( dataSerializer === 'utf8' ) {
205
+ data = { text : data } ;
206
+ }
207
+
208
+ return data ;
209
+ }
210
+
158
211
function handleMissingCallbacks ( successFn , failFn ) {
159
- if ( Object . prototype . toString . call ( successFn ) !== '[object Function] ' ) {
212
+ if ( getTypeOf ( successFn ) !== 'Function' ) {
160
213
throw new Error ( MANDATORY_SUCCESS ) ;
161
214
}
162
215
163
- if ( Object . prototype . toString . call ( failFn ) !== '[object Function] ' ) {
216
+ if ( getTypeOf ( failFn ) !== 'Function' ) {
164
217
throw new Error ( MANDATORY_FAIL ) ;
165
218
}
166
219
}
@@ -232,7 +285,7 @@ var http = {
232
285
post : function ( url , data , headers , success , failure ) {
233
286
handleMissingCallbacks ( success , failure ) ;
234
287
235
- data = data || { } ;
288
+ data = getProcessedData ( data , this . dataSerializer ) ;
236
289
headers = getMergedHeaders ( url , headers , this . headers ) ;
237
290
238
291
if ( ! checkHeaders ( headers ) ) {
@@ -262,7 +315,7 @@ var http = {
262
315
put : function ( url , data , headers , success , failure ) {
263
316
handleMissingCallbacks ( success , failure ) ;
264
317
265
- data = data || { } ;
318
+ data = getProcessedData ( data , this . dataSerializer ) ;
266
319
headers = getMergedHeaders ( url , headers , this . headers ) ;
267
320
268
321
if ( ! checkHeaders ( headers ) ) {
@@ -278,7 +331,7 @@ var http = {
278
331
patch : function ( url , data , headers , success , failure ) {
279
332
handleMissingCallbacks ( success , failure ) ;
280
333
281
- data = data || { } ;
334
+ data = getProcessedData ( data , this . dataSerializer ) ;
282
335
headers = getMergedHeaders ( url , headers , this . headers ) ;
283
336
284
337
if ( ! checkHeaders ( headers ) ) {
0 commit comments