From d28eedebd095f1e9d86eceef21677d26daf24e95 Mon Sep 17 00:00:00 2001 From: Sefa Ilkimen Date: Thu, 8 Feb 2018 16:44:16 +0100 Subject: [PATCH] some refactoring: - new module for messages - new module for helper functions --- plugin.xml | 2 + test/js-mocha-specs.js | 20 ++- www/advanced-http.js | 303 ++++++++----------------------------- www/cookie-handler.js | 2 +- www/helpers.js | 195 ++++++++++++++++++++++++ www/local-storage-store.js | 2 +- www/messages.js | 8 + 7 files changed, 282 insertions(+), 250 deletions(-) create mode 100644 www/helpers.js create mode 100644 www/messages.js diff --git a/plugin.xml b/plugin.xml index 9a976ef..34b42bf 100644 --- a/plugin.xml +++ b/plugin.xml @@ -10,9 +10,11 @@ + + diff --git a/test/js-mocha-specs.js b/test/js-mocha-specs.js index d9a7c5b..4ad48a3 100644 --- a/test/js-mocha-specs.js +++ b/test/js-mocha-specs.js @@ -3,12 +3,18 @@ const mock = require('mock-require'); const path = require('path'); const should = chai.should(); + +const HELPERS_ID = path.resolve(__dirname, '..', 'www', 'helpers'); const PLUGIN_ID = path.resolve(__dirname, '..', 'www', 'advanced-http'); describe('Advanced HTTP www interface', function() { let http = {}; + let helpers = {}; + const noop = () => { /* intentionally doing nothing */ }; + const loadHttp = () => { + mock(`${PLUGIN_ID}.helpers`, mock.reRequire('../www/helpers')); http = mock.reRequire('../www/advanced-http'); }; @@ -19,8 +25,12 @@ describe('Advanced HTTP www interface', function() { global.btoa = decoded => new Buffer(decoded).toString('base64'); mock('cordova/exec', noop); - mock(`${PLUGIN_ID}.angular-integration`, { registerService: noop }); mock(`${PLUGIN_ID}.cookie-handler`, {}); + mock(`${HELPERS_ID}.cookie-handler`, {}); + mock(`${PLUGIN_ID}.messages`, require('../www/messages')); + mock(`${HELPERS_ID}.messages`, require('../www/messages')); + mock(`${PLUGIN_ID}.angular-integration`, { registerService: noop }); + loadHttp(); }); @@ -40,7 +50,7 @@ describe('Advanced HTTP www interface', function() { }); it('resolves global headers correctly #24', () => { - mock(`${PLUGIN_ID}.cookie-handler`, { + mock(`${HELPERS_ID}.cookie-handler`, { getCookieString: () => 'fakeCookieString' }); @@ -59,7 +69,7 @@ describe('Advanced HTTP www interface', function() { }); it('resolves host headers correctly (set without port number) #37', () => { - mock(`${PLUGIN_ID}.cookie-handler`, { + mock(`${HELPERS_ID}.cookie-handler`, { getCookieString: () => 'fakeCookieString' }); @@ -78,7 +88,7 @@ describe('Advanced HTTP www interface', function() { }); it('resolves host headers correctly (set with port number) #37', () => { - mock(`${PLUGIN_ID}.cookie-handler`, { + mock(`${HELPERS_ID}.cookie-handler`, { getCookieString: () => 'fakeCookieString' }); @@ -97,7 +107,7 @@ describe('Advanced HTTP www interface', function() { }); it('resolves request headers correctly', () => { - mock(`${PLUGIN_ID}.cookie-handler`, { + mock(`${HELPERS_ID}.cookie-handler`, { getCookieString: () => 'fakeCookieString' }); diff --git a/www/advanced-http.js b/www/advanced-http.js index d9c8f3c..82076e4 100644 --- a/www/advanced-http.js +++ b/www/advanced-http.js @@ -27,196 +27,13 @@ * An HTTP Plugin for PhoneGap. */ -var pluginId = module.id.slice(0, module.id.indexOf('.')); -var validSerializers = ['urlencoded', 'json', 'utf8' ]; +var pluginId = module.id.slice(0, module.id.lastIndexOf('.')); var exec = require('cordova/exec'); var angularIntegration = require(pluginId +'.angular-integration'); var cookieHandler = require(pluginId + '.cookie-handler'); - -var MANDATORY_SUCCESS = 'advanced-http: missing mandatory "onSuccess" callback function'; -var MANDATORY_FAIL = 'advanced-http: missing mandatory "onFail" callback function'; -var ADDING_COOKIES_NOT_SUPPORTED = 'advanced-http: "setHeader" does not support adding cookies, please use "setCookie" function instead'; -var HEADER_VALUE_MUST_BE_STRING = 'advanced-http: header values must be strings'; -var DATA_TYPE_MISMATCH = 'advanced-http: "data" argument supports only following data types:'; - -// Thanks Mozilla: https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_.22Unicode_Problem.22 -function b64EncodeUnicode(str) { - return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) { - return String.fromCharCode('0x' + p1); - })); -} - -function mergeHeaders(globalHeaders, localHeaders) { - var globalKeys = Object.keys(globalHeaders); - var key; - - for (var i = 0; i < globalKeys.length; i++) { - key = globalKeys[i]; - - if (!localHeaders.hasOwnProperty(key)) { - localHeaders[key] = globalHeaders[key]; - } - } - - return localHeaders; -} - -function checkHeaders(headers) { - var keys = Object.keys(headers); - var key; - - for (var i = 0; i < keys.length; i++) { - key = keys[i]; - - if (typeof headers[key] !== 'string') { - return false; - } - } - - return true; -} - -function onInvalidHeader(handler) { - handler({ - status: 0, - error: HEADER_VALUE_MUST_BE_STRING, - headers: {} - }); -} - -function checkSerializer(serializer) { - serializer = serializer || ''; - serializer = serializer.trim().toLowerCase(); - - if (validSerializers.indexOf(serializer) > -1) { - return serializer; - } - - return serializer[0]; -} - -function resolveCookieString(headers) { - var keys = Object.keys(headers || {}); - - for (var i = 0; i < keys.length; ++i) { - if (keys[i].match(/^set-cookie$/i)) { - return headers[keys[i]]; - } - } - - return null; -} - -function createFileEntry(rawEntry) { - var entry = new (require('cordova-plugin-file.FileEntry'))(); - - entry.isDirectory = rawEntry.isDirectory; - entry.isFile = rawEntry.isFile; - entry.name = rawEntry.name; - entry.fullPath = rawEntry.fullPath; - entry.filesystem = new FileSystem(rawEntry.filesystemName || (rawEntry.filesystem == window.PERSISTENT ? 'persistent' : 'temporary')); - entry.nativeURL = rawEntry.nativeURL; - - return entry; -} - -function injectCookieHandler(url, cb) { - return function(response) { - cookieHandler.setCookieFromString(url, resolveCookieString(response.headers)); - cb(response); - } -} - -function injectFileEntryHandler(cb) { - return function(response) { - cb(createFileEntry(response.file)); - } -} - -function getCookieHeader(url) { - return { Cookie: cookieHandler.getCookieString(url) }; -} - -function getMatchingHostHeaders(url, headersList) { - var matches = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i); - var domain = matches && matches[1]; - - return headersList[domain] || null; -} - -function getMergedHeaders(url, requestHeaders, predefinedHeaders) { - var globalHeaders = predefinedHeaders['*'] || {}; - var hostHeaders = getMatchingHostHeaders(url, predefinedHeaders) || {}; - var mergedHeaders = mergeHeaders(globalHeaders, hostHeaders); - - mergedHeaders = mergeHeaders(mergedHeaders, requestHeaders); - mergedHeaders = mergeHeaders(mergedHeaders, getCookieHeader(url)); - - return mergedHeaders; -} - -function getTypeOf(object) { - // typeof is not working reliably in JS - switch (Object.prototype.toString.call(object)) { - case '[object Array]': - return 'Array'; - case '[object Boolean]': - return 'Boolean'; - case '[object Function]': - return 'Function'; - case '[object Null]': - return 'Null'; - case '[object Number]': - return 'Number'; - case '[object Object]': - return 'Object'; - case '[object String]': - return 'String'; - case '[object Undefined]': - return 'Undefined'; - default: - return 'Unknown'; - } -} - -function getAllowedDataTypes(dataSerializer) { - switch (dataSerializer) { - case 'utf8': - return ['String']; - case 'urlencoded': - return ['Object']; - default: - return ['Array', 'Object']; - } -} - -function getProcessedData(data, dataSerializer) { - data = data || {}; - - var currentDataType = getTypeOf(data); - var allowedDataTypes = getAllowedDataTypes(dataSerializer); - - if (allowedDataTypes.indexOf(currentDataType) === -1) { - throw new Error(DATA_TYPE_MISMATCH + ' ' + allowedDataTypes.join(', ')); - } - - if (dataSerializer === 'utf8') { - data = { text: data }; - } - - return data; -} - -function handleMissingCallbacks(successFn, failFn) { - if (getTypeOf(successFn) !== 'Function') { - throw new Error(MANDATORY_SUCCESS); - } - - if (getTypeOf(failFn) !== 'Function') { - throw new Error(MANDATORY_FAIL); - } -} +var helpers = require(pluginId + '.helpers'); +var messages = require(pluginId + '.messages'); var http = { headers: {}, @@ -224,10 +41,10 @@ var http = { sslPinning: false, timeoutInSeconds: 60.0, getBasicAuthHeader: function (username, password) { - return {'Authorization': 'Basic ' + b64EncodeUnicode(username + ':' + password)}; + return {'Authorization': 'Basic ' + helpers.b64EncodeUnicode(username + ':' + password)}; }, useBasicAuth: function (username, password) { - this.setHeader('*', 'Authorization', 'Basic ' + b64EncodeUnicode(username + ':' + password)); + this.setHeader('*', 'Authorization', 'Basic ' + helpers.b64EncodeUnicode(username + ':' + password)); }, setHeader: function () { // this one is for being backward compatible @@ -242,18 +59,18 @@ var http = { } if (header.toLowerCase() === 'cookie') { - throw new Error(ADDING_COOKIES_NOT_SUPPORTED); + throw new Error(messages.ADDING_COOKIES_NOT_SUPPORTED); } if (typeof value !== 'string') { - throw new Error(HEADER_VALUE_MUST_BE_STRING); + throw new Error(messages.HEADER_VALUE_MUST_BE_STRING); } this.headers[host] = this.headers[host] || {}; this.headers[host][header] = value; }, setDataSerializer: function (serializer) { - this.dataSerializer = checkSerializer(serializer); + this.dataSerializer = helpers.checkSerializer(serializer); }, setCookie: function (url, cookie, options) { cookieHandler.setCookie(url, cookie, options); @@ -280,127 +97,127 @@ var http = { return exec(success, failure, 'CordovaHttpPlugin', 'disableRedirect', [disable]); }, validateDomainName: function (validate, success, failure) { - failure('advanced-http: "validateDomainName" is no more supported, please see change log for further info'); + failure(messages.DEPRECATED_VDN); }, post: function (url, data, headers, success, failure) { - handleMissingCallbacks(success, failure); + helpers.handleMissingCallbacks(success, failure); - data = getProcessedData(data, this.dataSerializer); - headers = getMergedHeaders(url, headers, this.headers); + data = helpers.getProcessedData(data, this.dataSerializer); + headers = helpers.getMergedHeaders(url, headers, this.headers); - if (!checkHeaders(headers)) { - return onInvalidHeader(failure); + if (!helpers.checkHeaders(headers)) { + return helpers.onInvalidHeader(failure); } - var onSuccess = injectCookieHandler(url, success); - var onFail = injectCookieHandler(url, failure); + var onSuccess = helpers.injectCookieHandler(url, success); + var onFail = helpers.injectCookieHandler(url, failure); return exec(onSuccess, onFail, 'CordovaHttpPlugin', 'post', [url, data, this.dataSerializer, headers, this.timeoutInSeconds]); }, get: function (url, params, headers, success, failure) { - handleMissingCallbacks(success, failure); + helpers.handleMissingCallbacks(success, failure); params = params || {}; - headers = getMergedHeaders(url, headers, this.headers); + headers = helpers.getMergedHeaders(url, headers, this.headers); - if (!checkHeaders(headers)) { - return onInvalidHeader(failure); + if (!helpers.checkHeaders(headers)) { + return helpers.onInvalidHeader(failure); } - var onSuccess = injectCookieHandler(url, success); - var onFail = injectCookieHandler(url, failure); + var onSuccess = helpers.injectCookieHandler(url, success); + var onFail = helpers.injectCookieHandler(url, failure); return exec(onSuccess, onFail, 'CordovaHttpPlugin', 'get', [url, params, headers, this.timeoutInSeconds]); }, put: function (url, data, headers, success, failure) { - handleMissingCallbacks(success, failure); + helpers.handleMissingCallbacks(success, failure); - data = getProcessedData(data, this.dataSerializer); - headers = getMergedHeaders(url, headers, this.headers); + data = helpers.getProcessedData(data, this.dataSerializer); + headers = helpers.getMergedHeaders(url, headers, this.headers); - if (!checkHeaders(headers)) { - return onInvalidHeader(failure); + if (!helpers.checkHeaders(headers)) { + return helpers.onInvalidHeader(failure); } - var onSuccess = injectCookieHandler(url, success); - var onFail = injectCookieHandler(url, failure); + var onSuccess = helpers.injectCookieHandler(url, success); + var onFail = helpers.injectCookieHandler(url, failure); return exec(onSuccess, onFail, 'CordovaHttpPlugin', 'put', [url, data, this.dataSerializer, headers, this.timeoutInSeconds]); }, patch: function (url, data, headers, success, failure) { - handleMissingCallbacks(success, failure); + helpers.handleMissingCallbacks(success, failure); - data = getProcessedData(data, this.dataSerializer); - headers = getMergedHeaders(url, headers, this.headers); + data = helpers.getProcessedData(data, this.dataSerializer); + headers = helpers.getMergedHeaders(url, headers, this.headers); - if (!checkHeaders(headers)) { - return onInvalidHeader(failure); + if (!helpers.checkHeaders(headers)) { + return helpers.onInvalidHeader(failure); } - var onSuccess = injectCookieHandler(url, success); - var onFail = injectCookieHandler(url, failure); + var onSuccess = helpers.injectCookieHandler(url, success); + var onFail = helpers.injectCookieHandler(url, failure); return exec(onSuccess, onFail, 'CordovaHttpPlugin', 'patch', [url, data, this.dataSerializer, headers, this.timeoutInSeconds]); }, delete: function (url, params, headers, success, failure) { - handleMissingCallbacks(success, failure); + helpers.handleMissingCallbacks(success, failure); params = params || {}; - headers = getMergedHeaders(url, headers, this.headers); + headers = helpers.getMergedHeaders(url, headers, this.headers); - if (!checkHeaders(headers)) { - return onInvalidHeader(failure); + if (!helpers.checkHeaders(headers)) { + return helpers.onInvalidHeader(failure); } - var onSuccess = injectCookieHandler(url, success); - var onFail = injectCookieHandler(url, failure); + var onSuccess = helpers.injectCookieHandler(url, success); + var onFail = helpers.injectCookieHandler(url, failure); return exec(onSuccess, onFail, 'CordovaHttpPlugin', 'delete', [url, params, headers, this.timeoutInSeconds]); }, head: function (url, params, headers, success, failure) { - handleMissingCallbacks(success, failure); + helpers.handleMissingCallbacks(success, failure); params = params || {}; - headers = getMergedHeaders(url, headers, this.headers); + headers = helpers.getMergedHeaders(url, headers, this.headers); - if (!checkHeaders(headers)) { - return onInvalidHeader(failure); + if (!helpers.checkHeaders(headers)) { + return helpers.onInvalidHeader(failure); } - var onSuccess = injectCookieHandler(url, success); - var onFail = injectCookieHandler(url, failure); + var onSuccess = helpers.injectCookieHandler(url, success); + var onFail = helpers.injectCookieHandler(url, failure); return exec(onSuccess, onFail, 'CordovaHttpPlugin', 'head', [url, params, headers, this.timeoutInSeconds]); }, uploadFile: function (url, params, headers, filePath, name, success, failure) { - handleMissingCallbacks(success, failure); + helpers.handleMissingCallbacks(success, failure); params = params || {}; - headers = getMergedHeaders(url, headers, this.headers); + headers = helpers.getMergedHeaders(url, headers, this.headers); - if (!checkHeaders(headers)) { - return onInvalidHeader(failure); + if (!helpers.checkHeaders(headers)) { + return helpers.onInvalidHeader(failure); } - var onSuccess = injectCookieHandler(url, success); - var onFail = injectCookieHandler(url, failure); + var onSuccess = helpers.injectCookieHandler(url, success); + var onFail = helpers.injectCookieHandler(url, failure); return exec(onSuccess, onFail, 'CordovaHttpPlugin', 'uploadFile', [url, params, headers, filePath, name, this.timeoutInSeconds]); }, downloadFile: function (url, params, headers, filePath, success, failure) { - handleMissingCallbacks(success, failure); + helpers.handleMissingCallbacks(success, failure); params = params || {}; - headers = getMergedHeaders(url, headers, this.headers); + headers = helpers.getMergedHeaders(url, headers, this.headers); - if (!checkHeaders(headers)) { - return onInvalidHeader(failure); + if (!helpers.checkHeaders(headers)) { + return helpers.onInvalidHeader(failure); } - var onSuccess = injectCookieHandler(url, injectFileEntryHandler(success)); - var onFail = injectCookieHandler(url, failure); + var onSuccess = helpers.injectCookieHandler(url, helpers.injectFileEntryHandler(success)); + var onFail = helpers.injectCookieHandler(url, failure); return exec(onSuccess, onFail, 'CordovaHttpPlugin', 'downloadFile', [url, params, headers, filePath, this.timeoutInSeconds]); } diff --git a/www/cookie-handler.js b/www/cookie-handler.js index 2399f96..0f97780 100644 --- a/www/cookie-handler.js +++ b/www/cookie-handler.js @@ -1,4 +1,4 @@ -var pluginId = module.id.slice(0, module.id.indexOf('.')); +var pluginId = module.id.slice(0, module.id.lastIndexOf('.')); var ToughCookie = require(pluginId + '.tough-cookie'); var WebStorageCookieStore = require(pluginId + '.local-storage-store'); diff --git a/www/helpers.js b/www/helpers.js new file mode 100644 index 0000000..6ecc609 --- /dev/null +++ b/www/helpers.js @@ -0,0 +1,195 @@ +var pluginId = module.id.slice(0, module.id.lastIndexOf('.')); +var cookieHandler = require(pluginId + '.cookie-handler'); +var messages = require(pluginId + '.messages'); + +var validSerializers = ['urlencoded', 'json', 'utf8' ]; + +module.exports = { + b64EncodeUnicode: b64EncodeUnicode, + checkHeaders: checkHeaders, + onInvalidHeader: onInvalidHeader, + checkSerializer: checkSerializer, + injectCookieHandler: injectCookieHandler, + injectFileEntryHandler: injectFileEntryHandler, + getMergedHeaders: getMergedHeaders, + getProcessedData: getProcessedData, + handleMissingCallbacks: handleMissingCallbacks +}; + +// Thanks Mozilla: https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_.22Unicode_Problem.22 +function b64EncodeUnicode(str) { + return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) { + return String.fromCharCode('0x' + p1); + })); +} + +function mergeHeaders(globalHeaders, localHeaders) { + var globalKeys = Object.keys(globalHeaders); + var key; + + for (var i = 0; i < globalKeys.length; i++) { + key = globalKeys[i]; + + if (!localHeaders.hasOwnProperty(key)) { + localHeaders[key] = globalHeaders[key]; + } + } + + return localHeaders; +} + +function checkHeaders(headers) { + var keys = Object.keys(headers); + var key; + + for (var i = 0; i < keys.length; i++) { + key = keys[i]; + + if (typeof headers[key] !== 'string') { + return false; + } + } + + return true; +} + +function onInvalidHeader(handler) { + handler({ + status: 0, + error: messages.HEADER_VALUE_MUST_BE_STRING, + headers: {} + }); +} + +function checkSerializer(serializer) { + serializer = serializer || ''; + serializer = serializer.trim().toLowerCase(); + + if (validSerializers.indexOf(serializer) > -1) { + return serializer; + } + + return serializer[0]; +} + +function resolveCookieString(headers) { + var keys = Object.keys(headers || {}); + + for (var i = 0; i < keys.length; ++i) { + if (keys[i].match(/^set-cookie$/i)) { + return headers[keys[i]]; + } + } + + return null; +} + +function createFileEntry(rawEntry) { + var entry = new (require('cordova-plugin-file.FileEntry'))(); + + entry.isDirectory = rawEntry.isDirectory; + entry.isFile = rawEntry.isFile; + entry.name = rawEntry.name; + entry.fullPath = rawEntry.fullPath; + entry.filesystem = new FileSystem(rawEntry.filesystemName || (rawEntry.filesystem == window.PERSISTENT ? 'persistent' : 'temporary')); + entry.nativeURL = rawEntry.nativeURL; + + return entry; +} + +function injectCookieHandler(url, cb) { + return function(response) { + cookieHandler.setCookieFromString(url, resolveCookieString(response.headers)); + cb(response); + } +} + +function injectFileEntryHandler(cb) { + return function(response) { + cb(createFileEntry(response.file)); + } +} + +function getCookieHeader(url) { + return { Cookie: cookieHandler.getCookieString(url) }; +} + +function getMatchingHostHeaders(url, headersList) { + var matches = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i); + var domain = matches && matches[1]; + + return headersList[domain] || null; +} + +function getMergedHeaders(url, requestHeaders, predefinedHeaders) { + var globalHeaders = predefinedHeaders['*'] || {}; + var hostHeaders = getMatchingHostHeaders(url, predefinedHeaders) || {}; + var mergedHeaders = mergeHeaders(globalHeaders, hostHeaders); + + mergedHeaders = mergeHeaders(mergedHeaders, requestHeaders); + mergedHeaders = mergeHeaders(mergedHeaders, getCookieHeader(url)); + + return mergedHeaders; +} + +// typeof is not working reliably in JS +function getTypeOf(object) { + switch (Object.prototype.toString.call(object)) { + case '[object Array]': + return 'Array'; + case '[object Boolean]': + return 'Boolean'; + case '[object Function]': + return 'Function'; + case '[object Null]': + return 'Null'; + case '[object Number]': + return 'Number'; + case '[object Object]': + return 'Object'; + case '[object String]': + return 'String'; + case '[object Undefined]': + return 'Undefined'; + default: + return 'Unknown'; + } +} + +function getAllowedDataTypes(dataSerializer) { + switch (dataSerializer) { + case 'utf8': + return ['String']; + case 'urlencoded': + return ['Object']; + default: + return ['Array', 'Object']; + } +} + +function getProcessedData(data, dataSerializer) { + data = data || {}; + + var currentDataType = getTypeOf(data); + var allowedDataTypes = getAllowedDataTypes(dataSerializer); + + if (allowedDataTypes.indexOf(currentDataType) === -1) { + throw new Error(messages.DATA_TYPE_MISMATCH + ' ' + allowedDataTypes.join(', ')); + } + + if (dataSerializer === 'utf8') { + data = { text: data }; + } + + return data; +} + +function handleMissingCallbacks(successFn, failFn) { + if (getTypeOf(successFn) !== 'Function') { + throw new Error(messages.MANDATORY_SUCCESS); + } + + if (getTypeOf(failFn) !== 'Function') { + throw new Error(messages.MANDATORY_FAIL); + } +} diff --git a/www/local-storage-store.js b/www/local-storage-store.js index 044e7ca..4c5b7b0 100644 --- a/www/local-storage-store.js +++ b/www/local-storage-store.js @@ -30,7 +30,7 @@ 'use strict'; -var pluginId = module.id.slice(0, module.id.indexOf('.')); +var pluginId = module.id.slice(0, module.id.lastIndexOf('.')); var ToughCookie = require(pluginId + '.tough-cookie'); var _ = require(pluginId + '.lodash'); diff --git a/www/messages.js b/www/messages.js new file mode 100644 index 0000000..6708841 --- /dev/null +++ b/www/messages.js @@ -0,0 +1,8 @@ +module.exports = { + ADDING_COOKIES_NOT_SUPPORTED: 'advanced-http: "setHeader" does not support adding cookies, please use "setCookie" function instead', + DATA_TYPE_MISMATCH: 'advanced-http: "data" argument supports only following data types:', + DEPRECATED_VDN: 'advanced-http: "validateDomainName" is no more supported, please see change log for further info', + HEADER_VALUE_MUST_BE_STRING: 'advanced-http: header values must be strings', + MANDATORY_SUCCESS: 'advanced-http: missing mandatory "onSuccess" callback function', + MANDATORY_FAIL: 'advanced-http: missing mandatory "onFail" callback function' +};