Skip to content

Commit 25b4a28

Browse files
author
Sefa Ilkimen
committed
- add data type validation for data param
- support strings as data when "utf8" serializer is configured
1 parent ebef9a2 commit 25b4a28

File tree

2 files changed

+59
-6
lines changed

2 files changed

+59
-6
lines changed

test/app-test-definitions.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ const tests = [
388388
expected: 'resolved: {"status": 200, "data": "{\\"data\\": \\"this is a test string\\"...',
389389
before: helpers.setUtf8StringSerializer,
390390
func: function(resolve, reject) {
391-
cordova.plugin.http.post('http://httpbin.org/anything', { text: 'this is a test string' }, {}, resolve, reject);
391+
cordova.plugin.http.post('http://httpbin.org/anything', 'this is a test string', {}, resolve, reject);
392392
},
393393
validationFunc: function(driver, result) {
394394
result.type.should.be.equal('resolved');

www/advanced-http.js

Lines changed: 58 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ var MANDATORY_SUCCESS = 'advanced-http: missing mandatory "onSuccess" callback f
3838
var MANDATORY_FAIL = 'advanced-http: missing mandatory "onFail" callback function';
3939
var ADDING_COOKIES_NOT_SUPPORTED = 'advanced-http: "setHeader" does not support adding cookies, please use "setCookie" function instead';
4040
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:';
4142

4243
// Thanks Mozilla: https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_.22Unicode_Problem.22
4344
function b64EncodeUnicode(str) {
@@ -155,12 +156,64 @@ function getMergedHeaders(url, requestHeaders, predefinedHeaders) {
155156
return mergedHeaders;
156157
}
157158

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+
158211
function handleMissingCallbacks(successFn, failFn) {
159-
if (Object.prototype.toString.call(successFn) !== '[object Function]') {
212+
if (getTypeOf(successFn) !== 'Function') {
160213
throw new Error(MANDATORY_SUCCESS);
161214
}
162215

163-
if (Object.prototype.toString.call(failFn) !== '[object Function]') {
216+
if (getTypeOf(failFn) !== 'Function') {
164217
throw new Error(MANDATORY_FAIL);
165218
}
166219
}
@@ -232,7 +285,7 @@ var http = {
232285
post: function (url, data, headers, success, failure) {
233286
handleMissingCallbacks(success, failure);
234287

235-
data = data || {};
288+
data = getProcessedData(data, this.dataSerializer);
236289
headers = getMergedHeaders(url, headers, this.headers);
237290

238291
if (!checkHeaders(headers)) {
@@ -262,7 +315,7 @@ var http = {
262315
put: function (url, data, headers, success, failure) {
263316
handleMissingCallbacks(success, failure);
264317

265-
data = data || {};
318+
data = getProcessedData(data, this.dataSerializer);
266319
headers = getMergedHeaders(url, headers, this.headers);
267320

268321
if (!checkHeaders(headers)) {
@@ -278,7 +331,7 @@ var http = {
278331
patch: function (url, data, headers, success, failure) {
279332
handleMissingCallbacks(success, failure);
280333

281-
data = data || {};
334+
data = getProcessedData(data, this.dataSerializer);
282335
headers = getMergedHeaders(url, headers, this.headers);
283336

284337
if (!checkHeaders(headers)) {

0 commit comments

Comments
 (0)