diff --git a/test/js-specs.js b/test/js-specs.js index d8cc03b..f8d024d 100644 --- a/test/js-specs.js +++ b/test/js-specs.js @@ -246,6 +246,14 @@ describe('Common helpers', function () { it('merges empty header sets correctly', () => { helpers.mergeHeaders({}, {}).should.eql({}); }); + + it('merges ssimple header sets without collision correctly', () => { + helpers.mergeHeaders({ a: 1 }, { b: 2 }).should.eql({ a: 1, b: 2 }); + }); + + it('merges header sets with collision correctly', () => { + helpers.mergeHeaders({ a: 1 }, { a: 2 }).should.eql({ a: 2 }); + }); }); describe('getCookieHeader(url)', function () { @@ -326,4 +334,25 @@ describe('Common helpers', function () { })).should.throw(messages.INVALID_CLIENT_AUTH_PKCS_PASSWORD); }); }); + + describe('handleMissingOptions()', function () { + const jsUtil = require('../www/js-util'); + const messages = require('../www/messages'); + const helpers = require('../www/helpers')(jsUtil, null, messages); + const mockGlobals = { + headers: {}, + serializer: 'urlencoded', + followRedirect: true, + timeout: 60.0, + } + + it('adds missing "followRedirect" option correctly', () => { + helpers.handleMissingOptions({}, mockGlobals).should.include({ followRedirect: true }); + }); + + it('throws an error when "followRedirect" option is not a boolean', () => { + (() => helpers.handleMissingOptions({ followRedirect: 1 }, mockGlobals)) + .should.throw(messages.INVALID_FOLLOW_REDIRECT_VALUE); + }); + }); }) diff --git a/www/global-configs.js b/www/global-configs.js index 761a1ff..c920a9b 100644 --- a/www/global-configs.js +++ b/www/global-configs.js @@ -1,6 +1,7 @@ var globalConfigs = { headers: {}, serializer: 'urlencoded', + followRedirect: true, timeout: 60.0, }; diff --git a/www/helpers.js b/www/helpers.js index 2a7a014..9edca46 100644 --- a/www/helpers.js +++ b/www/helpers.js @@ -178,6 +178,14 @@ module.exports = function init(jsUtil, cookieHandler, messages) { return timeout; } + function checkFollowRedirectValue(follow) { + if (jsUtil.getTypeOf(follow) !== 'Boolean') { + throw new Error(messages.INVALID_FOLLOW_REDIRECT_VALUE); + } + + return follow; + } + function checkHeadersObject(headers) { return checkKeyValuePairObject(headers, ['String'], messages.INVALID_HEADERS_VALUE); } @@ -295,6 +303,7 @@ module.exports = function init(jsUtil, cookieHandler, messages) { method: checkHttpMethod(options.method || validHttpMethods[0]), serializer: checkSerializer(options.serializer || globals.serializer), timeout: checkTimeoutValue(options.timeout || globals.timeout), + followRedirect: checkFollowRedirectValue(options.followRedirect || globals.followRedirect), headers: checkHeadersObject(options.headers || {}), params: checkParamsObject(options.params || {}), data: jsUtil.getTypeOf(options.data) === 'Undefined' ? null : options.data, diff --git a/www/messages.js b/www/messages.js index 3f788a7..5eebeb4 100644 --- a/www/messages.js +++ b/www/messages.js @@ -13,5 +13,6 @@ module.exports = { INVALID_CLIENT_AUTH_PKCS_PASSWORD: 'advanced-http: invalid PKCS12 container password, needs to be a string', INVALID_HEADERS_VALUE: 'advanced-http: header values must be strings', INVALID_TIMEOUT_VALUE: 'advanced-http: invalid timeout value, needs to be a positive numeric value', + INVALID_FOLLOW_REDIRECT_VALUE: 'advanced-http: invalid follow redirect value, needs to be a boolean value', INVALID_PARAMS_VALUE: 'advanced-http: invalid params object, needs to be an object with strings' }; diff --git a/www/public-interface.js b/www/public-interface.js index bfbbfb6..80261c4 100644 --- a/www/public-interface.js +++ b/www/public-interface.js @@ -12,11 +12,11 @@ module.exports = function init(exec, cookieHandler, urlUtil, helpers, globalConf getCookieString: getCookieString, getRequestTimeout: getRequestTimeout, setRequestTimeout: setRequestTimeout, + disableRedirect: disableRedirect, // for being backward compatible setSSLCertMode: setServerTrustMode, setServerTrustMode: setServerTrustMode, setClientAuthMode: setClientAuthMode, - disableRedirect: disableRedirect, sendRequest: sendRequest, post: post, get: get, @@ -91,6 +91,21 @@ module.exports = function init(exec, cookieHandler, urlUtil, helpers, globalConf globalConfigs.timeout = timeout; } + function getFollowRedirect() { + return globalConfigs.followRedirect; + } + + function setFollowRedirect(follow) { + globalConfigs.followRedirect = follow; + } + + // @TODO replace this one by "setFollowRedirect()" + function disableRedirect(disable, success, failure) { + helpers.handleMissingCallbacks(success, failure); + + return exec(success, failure, 'CordovaHttpPlugin', 'disableRedirect', [!!disable]); + } + function setServerTrustMode(mode, success, failure) { helpers.handleMissingCallbacks(success, failure); @@ -117,12 +132,6 @@ module.exports = function init(exec, cookieHandler, urlUtil, helpers, globalConf return exec(success, failure, 'CordovaHttpPlugin', 'setClientAuthMode', [mode, options.alias, options.rawPkcs, options.pkcsPassword]); } - function disableRedirect(disable, success, failure) { - helpers.handleMissingCallbacks(success, failure); - - return exec(success, failure, 'CordovaHttpPlugin', 'disableRedirect', [!!disable]); - } - function sendRequest(url, options, success, failure) { helpers.handleMissingCallbacks(success, failure); @@ -138,14 +147,14 @@ module.exports = function init(exec, cookieHandler, urlUtil, helpers, globalConf case 'put': case 'patch': var data = helpers.getProcessedData(options.data, options.serializer); - return exec(onSuccess, onFail, 'CordovaHttpPlugin', options.method, [url, data, options.serializer, headers, options.timeout]); + return exec(onSuccess, onFail, 'CordovaHttpPlugin', options.method, [url, data, options.serializer, headers, options.timeout, options.followRedirect]); case 'upload': - return exec(onSuccess, onFail, 'CordovaHttpPlugin', 'uploadFile', [url, headers, options.filePath, options.name, options.timeout]); + return exec(onSuccess, onFail, 'CordovaHttpPlugin', 'uploadFile', [url, headers, options.filePath, options.name, options.timeout, options.followRedirect]); case 'download': var onDownloadSuccess = helpers.injectCookieHandler(url, helpers.injectFileEntryHandler(success)); - return exec(onDownloadSuccess, onFail, 'CordovaHttpPlugin', 'downloadFile', [url, headers, options.filePath, options.timeout]); + return exec(onDownloadSuccess, onFail, 'CordovaHttpPlugin', 'downloadFile', [url, headers, options.filePath, options.timeout, options.followRedirect]); default: - return exec(onSuccess, onFail, 'CordovaHttpPlugin', options.method, [url, headers, options.timeout]); + return exec(onSuccess, onFail, 'CordovaHttpPlugin', options.method, [url, headers, options.timeout, options.followRedirect]); } }