From a9c3be124ea4133f9fba34845f6dc1de586849b4 Mon Sep 17 00:00:00 2001 From: Sefa Ilkimen Date: Thu, 4 Jan 2018 00:40:40 +0100 Subject: [PATCH] fixed #54: Requests are not responding on iOS with non-string values in header object --- CHANGELOG.md | 1 + README.md | 2 +- test/app-template/www/index.js | 17 ++++++++++++++- test/app-test-definitions.js | 20 ++++++++++++++++++ www/advanced-http.js | 38 ++++++++++++++++++++++++++++++++++ 5 files changed, 76 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5de476a..eb0333a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## 1.9.1 - Fixed #45: does not encode arrays correctly as HTTP GET parameter on Android +- Fixed #54: requests are not responding on iOS with non-string values in header object ## v1.9.0 diff --git a/README.md b/README.md index a3e4c84..f760cad 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ cordova.plugin.http.useBasicAuth('user', 'password'); ``` ### setHeader -Set a header for all future requests to a specified host. Takes a hostname, a header and a value. +Set a header for all future requests to a specified host. Takes a hostname, a header and a value (must be a string value). ```js cordova.plugin.http.setHeader('Hostname', 'Header', 'Value'); diff --git a/test/app-template/www/index.js b/test/app-template/www/index.js index 0bba4b9..6758244 100644 --- a/test/app-template/www/index.js +++ b/test/app-template/www/index.js @@ -33,6 +33,16 @@ const app = { }; }, + throw: function(error) { + document.getElementById('statusInput').value = 'finished'; + app.printResult('result - throwed', error.message); + + app.lastResult = { + type: 'throwed', + message: error.message + }; + }, + getResult: function(cb) { cb(app.lastResult); }, @@ -46,7 +56,12 @@ const app = { document.getElementById('expectedTextarea').value = expectedText; document.getElementById('resultTextarea').value = ''; document.getElementById('descriptionLbl').innerText = titleText; - testDefinition.func(app.resolve, app.reject); + + try { + testDefinition.func(app.resolve, app.reject); + } catch (error) { + app.throw(error); + } }, onBeforeTest: function(testIndex, cb) { diff --git a/test/app-test-definitions.js b/test/app-test-definitions.js index d7a99c1..9265f14 100644 --- a/test/app-test-definitions.js +++ b/test/app-test-definitions.js @@ -282,6 +282,26 @@ const tests = [ .url .should.be.equal('http://httpbin.org/get?myArray[]=val1&myArray[]=val2&myArray[]=val3&myString=testString'); } + },{ + description: 'should reject non-string values in local header object #54', + expected: 'rejected: {"status": 0, "error": "advanced-http: header values must be strings" ...', + func: function(resolve, reject) { + cordova.plugin.http.get('http://httpbin.org/get', {}, { myTestHeader: 1 }, resolve, reject); + }, + validationFunc: function(driver, result) { + result.type.should.be.equal('rejected'); + result.data.error.should.be.equal('advanced-http: header values must be strings'); + } + },{ + description: 'should throw an error while setting non-string value as global header #54', + expected: 'throwed: "advanced-http: header values must be strings"', + func: function(resolve, reject) { + cordova.plugin.http.setHeader('myTestHeader', 2); + }, + validationFunc: function(driver, result) { + result.type.should.be.equal('throwed'); + result.message.should.be.equal('advanced-http: header values must be strings'); + } } ]; diff --git a/www/advanced-http.js b/www/advanced-http.js index 7cb0c6f..4ed9525 100644 --- a/www/advanced-http.js +++ b/www/advanced-http.js @@ -42,6 +42,7 @@ 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'; // Thanks Mozilla: https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_.22Unicode_Problem.22 function b64EncodeUnicode(str) { @@ -65,6 +66,23 @@ function mergeHeaders(globalHeaders, localHeaders) { return localHeaders; } +function checkHeaders(headers, onFail) { + var keys = Object.keys(headers); + var key; + + for (var i = 0; i < keys.length; i++) { + key = keys[i]; + + if (typeof headers[key] !== 'string') { + return onFail({ + status: 0, + error: HEADER_VALUE_MUST_BE_STRING, + headers: {} + }); + } + } +} + function checkSerializer(serializer) { serializer = serializer || ''; serializer = serializer.trim().toLowerCase(); @@ -173,6 +191,10 @@ var http = { throw new Error(ADDING_COOKIES_NOT_SUPPORTED); } + if (typeof value !== 'string') { + throw new Error(HEADER_VALUE_MUST_BE_STRING); + } + this.headers[host] = this.headers[host] || {}; this.headers[host][header] = value; }, @@ -212,6 +234,8 @@ var http = { data = data || {}; headers = getMergedHeaders(url, headers, this.headers); + checkHeaders(headers, failure); + var onSuccess = injectCookieHandler(url, success); var onFail = injectCookieHandler(url, failure); @@ -223,6 +247,8 @@ var http = { params = params || {}; headers = getMergedHeaders(url, headers, this.headers); + checkHeaders(headers, failure); + var onSuccess = injectCookieHandler(url, success); var onFail = injectCookieHandler(url, failure); @@ -234,6 +260,8 @@ var http = { data = data || {}; headers = getMergedHeaders(url, headers, this.headers); + checkHeaders(headers, failure); + var onSuccess = injectCookieHandler(url, success); var onFail = injectCookieHandler(url, failure); @@ -246,6 +274,8 @@ var http = { data = data || {}; headers = getMergedHeaders(url, headers, this.headers); + checkHeaders(headers, failure); + var onSuccess = injectCookieHandler(url, success); var onFail = injectCookieHandler(url, failure); @@ -258,6 +288,8 @@ var http = { params = params || {}; headers = getMergedHeaders(url, headers, this.headers); + checkHeaders(headers, failure); + var onSuccess = injectCookieHandler(url, success); var onFail = injectCookieHandler(url, failure); @@ -269,6 +301,8 @@ var http = { params = params || {}; headers = getMergedHeaders(url, headers, this.headers); + checkHeaders(headers, failure); + var onSuccess = injectCookieHandler(url, success); var onFail = injectCookieHandler(url, failure); @@ -280,6 +314,8 @@ var http = { params = params || {}; headers = getMergedHeaders(url, headers, this.headers); + checkHeaders(headers, failure); + var onSuccess = injectCookieHandler(url, success); var onFail = injectCookieHandler(url, failure); @@ -291,6 +327,8 @@ var http = { params = params || {}; headers = getMergedHeaders(url, headers, this.headers); + checkHeaders(headers, failure); + var onSuccess = injectCookieHandler(url, injectFileEntryHandler(success)); var onFail = injectCookieHandler(url, failure);