diff --git a/CHANGELOG.md b/CHANGELOG.md index 69bfd0f..a08430b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 2.0.11 + +- Fixed #221: headers not set on Android when request fails due to non-success status code + ## 2.0.10 - Fixed #218: headers are used as params on browser platform diff --git a/package.json b/package.json index c7d56d3..1ab34fc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-advanced-http", - "version": "2.0.10", + "version": "2.0.11", "description": "Cordova / Phonegap plugin for communicating with HTTP servers using SSL pinning", "scripts": { "updatecert": "node ./scripts/update-e2e-server-cert.js && node ./scripts/update-e2e-client-cert.js", diff --git a/src/android/com/silkimen/cordovahttp/CordovaHttpResponse.java b/src/android/com/silkimen/cordovahttp/CordovaHttpResponse.java index 94aab0e..407af47 100644 --- a/src/android/com/silkimen/cordovahttp/CordovaHttpResponse.java +++ b/src/android/com/silkimen/cordovahttp/CordovaHttpResponse.java @@ -56,13 +56,15 @@ class CordovaHttpResponse { json.put("status", this.status); json.put("url", this.url); + if (this.headers != null && !this.headers.isEmpty()) { + json.put("headers", new JSONObject(getFilteredHeaders())); + } + if (this.hasFailed) { json.put("error", this.error); } else if (this.isFileOperation) { - json.put("headers", new JSONObject(getFilteredHeaders())); json.put("file", this.fileEntry); } else { - json.put("headers", new JSONObject(getFilteredHeaders())); json.put("data", this.body); } @@ -72,10 +74,6 @@ class CordovaHttpResponse { private Map getFilteredHeaders() throws JSONException { Map filteredHeaders = new HashMap(); - if (this.headers == null || this.headers.isEmpty()) { - return filteredHeaders; - } - for (Map.Entry> entry : this.headers.entrySet()) { String key = entry.getKey(); List value = entry.getValue(); diff --git a/test/e2e-specs.js b/test/e2e-specs.js index af7a5d1..7092f52 100644 --- a/test/e2e-specs.js +++ b/test/e2e-specs.js @@ -629,6 +629,60 @@ const tests = [ result.data.content.should.be.equal("\n\n\n\n\n\n \n \n Wake up to WonderWidgets!\n \n\n \n \n Overview\n Why WonderWidgets are great\n \n Who buys WonderWidgets\n \n\n"); } }, + { + description: 'should return header object when request failed due to non-success response from server #221', + expected: 'rejected:', + func: function (resolve, reject) { cordova.plugin.http.get('https://httpbin.org/status/418', {}, {}, resolve, reject); }, + validationFunc: function (driver, result) { + result.type.should.be.equal('rejected'); + result.data.headers.should.be.an('object'); + } + }, + { + description: 'should return status code when request failed due to non-success response from server', + expected: 'rejected:', + func: function (resolve, reject) { cordova.plugin.http.get('https://httpbin.org/status/418', {}, {}, resolve, reject); }, + validationFunc: function (driver, result) { + result.type.should.be.equal('rejected'); + result.data.status.should.be.equal(418); + } + }, + { + description: 'should return url string when request failed due to non-success response from server', + expected: 'rejected:', + func: function (resolve, reject) { cordova.plugin.http.get('https://httpbin.org/status/418', {}, {}, resolve, reject); }, + validationFunc: function (driver, result) { + result.type.should.be.equal('rejected'); + result.data.url.should.be.equal('https://httpbin.org/status/418'); + } + }, + { + description: 'shouldn\'t return header object when request failed before receiving response from server', + expected: 'rejected:', + func: function (resolve, reject) { cordova.plugin.http.get('https://not_existing_url', {}, {}, resolve, reject); }, + validationFunc: function (driver, result) { + result.type.should.be.equal('rejected'); + should.equal(result.data.headers, undefined); + } + }, + { + description: 'should return status code when request failed before receiving response from server', + expected: 'rejected:', + func: function (resolve, reject) { cordova.plugin.http.get('https://not_existing_url', {}, {}, resolve, reject); }, + validationFunc: function (driver, result) { + result.type.should.be.equal('rejected'); + result.data.status.should.be.a('number'); + } + }, + { + description: 'shouldn\'t return url string when request failed before receiving response from server', + expected: 'rejected:', + func: function (resolve, reject) { cordova.plugin.http.get('https://not_existing_url', {}, {}, resolve, reject); }, + validationFunc: function (driver, result) { + result.type.should.be.equal('rejected'); + should.equal(result.data.url, undefined); + } + } // @TODO: not ready yet // { // description: 'should authenticate correctly when client cert auth is configured with a PKCS12 container', diff --git a/test/e2e-tooling/helpers/setup.js b/test/e2e-tooling/helpers/setup.js deleted file mode 100644 index 3e09b7f..0000000 --- a/test/e2e-tooling/helpers/setup.js +++ /dev/null @@ -1,12 +0,0 @@ -const wd = require("wd"); - -require('colors'); - -const chai = require('chai'); -const chaiAsPromised = require('chai-as-promised'); -chai.use(chaiAsPromised); - -const should = chai.should(); -chaiAsPromised.transferPromiseness = wd.transferPromiseness; - -exports.should = should; diff --git a/test/e2e-tooling/test.js b/test/e2e-tooling/test.js index 91bface..9b5d3a5 100644 --- a/test/e2e-tooling/test.js +++ b/test/e2e-tooling/test.js @@ -1,12 +1,18 @@ -require('./helpers/setup'); - const wd = require('wd'); +const chai = require('chai'); +const chaiAsPromised = require('chai-as-promised'); const apps = require('./helpers/apps'); const caps = Object.assign({}, require('./helpers/caps')); const serverConfig = require('./helpers/server'); const testDefinitions = require('../e2e-specs'); const pkgjson = require('../../package.json'); +chai.use(chaiAsPromised); +chaiAsPromised.transferPromiseness = wd.transferPromiseness; +global.should = chai.should(); + +require('colors'); + describe('Advanced HTTP', function() { const isDevice = process.argv.includes('--device'); const isAndroid = process.argv.includes('--android'); @@ -49,7 +55,7 @@ describe('Advanced HTTP', function() { if (value === 'finished') { resolve(); } else if (Date.now() > timeoutTimestamp) { - reject('Test function timed out!'); + reject(new Error('Test function timed out!')); } else { setTimeout(checkIfFinished, 500); }