diff --git a/test/e2e-specs.js b/test/e2e-specs.js
index 5f1bf78..3e509fe 100644
--- a/test/e2e-specs.js
+++ b/test/e2e-specs.js
@@ -2,7 +2,7 @@ const hooks = {
onBeforeEachTest: function (resolve, reject) {
cordova.plugin.http.clearCookies();
- helpers.enableFollowingRedirect(function() {
+ helpers.enableFollowingRedirect(function () {
// server trust mode is not supported on browser platform
if (cordova.platformId === 'browser') {
return resolve();
@@ -23,7 +23,7 @@ const helpers = {
setPinnedServerTrustMode: function (resolve, reject) { cordova.plugin.http.setServerTrustMode('pinned', resolve, reject); },
setNoneClientAuthMode: function (resolve, reject) { cordova.plugin.http.setClientAuthMode('none', resolve, reject); },
setBufferClientAuthMode: function (resolve, reject) {
- helpers.getWithXhr(function(pkcs) {
+ helpers.getWithXhr(function (pkcs) {
cordova.plugin.http.setClientAuthMode('buffer', {
rawPkcs: pkcs,
pkcsPassword: 'badssl.com'
@@ -34,9 +34,9 @@ const helpers = {
setUtf8StringSerializer: function (resolve) { resolve(cordova.plugin.http.setDataSerializer('utf8')); },
setUrlEncodedSerializer: function (resolve) { resolve(cordova.plugin.http.setDataSerializer('urlencoded')); },
setMultipartSerializer: function (resolve) { resolve(cordova.plugin.http.setDataSerializer('multipart')); },
- setRawSerializer: function(resolve) { resolve(cordova.plugin.http.setDataSerializer('raw')); },
+ setRawSerializer: function (resolve) { resolve(cordova.plugin.http.setDataSerializer('raw')); },
disableFollowingRedirect: function (resolve) { resolve(cordova.plugin.http.setFollowRedirect(false)); },
- enableFollowingRedirect: function(resolve) { resolve(cordova.plugin.http.setFollowRedirect(true)); },
+ enableFollowingRedirect: function (resolve) { resolve(cordova.plugin.http.setFollowRedirect(true)); },
getWithXhr: function (done, url, type) {
var xhr = new XMLHttpRequest();
@@ -71,7 +71,7 @@ const helpers = {
var byteArray = new Uint8Array(buffer);
for (var i = 0; i < byteArray.length; i++) {
- hash = ((hash << 5) - hash) + byteArray[i];
+ hash = ((hash << 5) - hash) + byteArray[i];
hash |= 0; // Convert to 32bit integer
}
@@ -300,7 +300,7 @@ const tests = [
{
description: 'should not follow 302 redirect when following redirects is disabled',
expected: 'rejected: {"status": 302, ...',
- before: function(resolve, reject) { cordova.plugin.http.disableRedirect(true, resolve, reject)},
+ before: function (resolve, reject) { cordova.plugin.http.disableRedirect(true, resolve, reject) },
func: function (resolve, reject) { cordova.plugin.http.get('http://httpbin.org/redirect-to?url=http://httpbin.org/anything', {}, {}, resolve, reject); },
validationFunc: function (driver, result) {
result.type.should.be.equal('rejected');
@@ -374,7 +374,7 @@ const tests = [
var targetUrl = 'http://httpbin.org/post';
helpers.writeToFile(function () {
- helpers.writeToFile(function() {
+ helpers.writeToFile(function () {
cordova.plugin.http.uploadFile(targetUrl, {}, {}, [sourcePath, sourcePath2], [fileName, fileName2], resolve, reject);
}, fileName2, fileContent2);
}, fileName, fileContent);
@@ -824,7 +824,7 @@ const tests = [
before: helpers.setMultipartSerializer,
func: function (resolve, reject) {
var ponyfills = cordova.plugin.http.ponyfills;
- helpers.getWithXhr(function(blob) {
+ helpers.getWithXhr(function (blob) {
var formData = new ponyfills.FormData();
formData.append('CordovaLogo', blob);
@@ -850,7 +850,7 @@ const tests = [
expected: 'resolved: {"status":200,"data:application/octet-stream;base64,iVBORw0KGgoAAAANSUhEUg ...',
before: helpers.setRawSerializer,
func: function (resolve, reject) {
- helpers.getWithXhr(function(buffer) {
+ helpers.getWithXhr(function (buffer) {
cordova.plugin.http.post('http://httpbin.org/anything', buffer, {}, resolve, reject);
}, './res/cordova_logo.png', 'arraybuffer');
},
@@ -890,6 +890,19 @@ const tests = [
result.data.headers['access-control-allow-origin'].should.be.equal('*');
}
},
+ {
+ description: 'should allow empty response body even though responseType is set #334',
+ expected: 'resolved: {"status":200, ...',
+ func: function (resolve, reject) {
+ var url = 'https://httpbin.org/status/200';
+ var options = { method: 'get', responseType: 'json' };
+ cordova.plugin.http.sendRequest(url, options, resolve, reject);
+ },
+ validationFunc: function (driver, result) {
+ result.type.should.be.equal('resolved');
+ should.equal(null, result.data.data);
+ }
+ },
{
description: 'should decode JSON data correctly when response type is "json" #301',
expected: 'resolved: {"status":200,"data":{"slideshow": ... ',
@@ -903,22 +916,22 @@ const tests = [
result.data.status.should.be.equal(200);
result.data.data.should.be.an('object');
result.data.data.slideshow.should.be.eql({
- author: 'Yours Truly',
- date: 'date of publication',
+ author: 'Yours Truly',
+ date: 'date of publication',
slides: [
{
- title: 'Wake up to WonderWidgets!',
+ title: 'Wake up to WonderWidgets!',
type: 'all'
- },
+ },
{
items: [
'Why WonderWidgets are great',
'Who buys WonderWidgets'
- ],
- title: 'Overview',
+ ],
+ title: 'Overview',
type: 'all'
}
- ],
+ ],
title: 'Sample Slide Show'
});
}
diff --git a/test/js-specs.js b/test/js-specs.js
index 2507dd6..67343a8 100644
--- a/test/js-specs.js
+++ b/test/js-specs.js
@@ -419,7 +419,7 @@ describe('Common helpers', function () {
response => response.data.should.be.equal('fakeData')
);
- handler({ data: 'fakeData' });
+ handler({ data: 'fakeData' });
});
it('does not change response data if response type is "text"', () => {
@@ -444,6 +444,17 @@ describe('Common helpers', function () {
handler({ data: JSON.stringify(fakeData) });
});
+ it('handles empty "json" response correctly', () => {
+ const emptyData = "";
+ const helpers = require('../www/helpers')(null, jsUtil, null, messages, null, errorCodes);
+ const handler = helpers.injectRawResponseHandler(
+ 'json',
+ response => should.equal(undefined, response.data)
+ );
+
+ handler({ data: emptyData });
+ });
+
it('handles response type "arraybuffer" correctly', () => {
const helpers = require('../www/helpers')(null, jsUtil, null, messages, fakeBase64, errorCodes);
const handler = helpers.injectRawResponseHandler(
@@ -454,6 +465,16 @@ describe('Common helpers', function () {
handler({ data: 'myString' });
});
+ it('handles empty "arraybuffer" response correctly', () => {
+ const helpers = require('../www/helpers')(null, jsUtil, null, messages, fakeBase64, errorCodes);
+ const handler = helpers.injectRawResponseHandler(
+ 'arraybuffer',
+ response => should.equal(null, response.data)
+ );
+
+ handler({ data: '' });
+ });
+
it('handles response type "blob" correctly', () => {
const helpers = require('../www/helpers')(null, jsUtil, null, messages, fakeBase64, errorCodes);
const handler = helpers.injectRawResponseHandler(
@@ -465,7 +486,19 @@ describe('Common helpers', function () {
}
);
- handler({ data: 'myString', headers: { 'content-type': 'fakeType'} });
+ handler({ data: 'myString', headers: { 'content-type': 'fakeType' } });
+ });
+
+ it('handles empty "blob" response correctly', () => {
+ const helpers = require('../www/helpers')(null, jsUtil, null, messages, fakeBase64, errorCodes);
+ const handler = helpers.injectRawResponseHandler(
+ 'blob',
+ (response) => {
+ should.equal(null, response.data)
+ }
+ );
+
+ handler({ data: '', headers: { 'content-type': 'fakeType' } });
});
it('calls failure callback when post-processing fails', () => {
@@ -546,7 +579,7 @@ describe('Common helpers', function () {
it('processes data correctly when serializer "utf8" is configured', (cb) => {
helpers.processData('myString', 'utf8', (data) => {
- data.should.be.eql({text: 'myString'});
+ data.should.be.eql({ text: 'myString' });
cb();
})
});
@@ -591,7 +624,7 @@ describe('Common helpers', function () {
});
it('processes data correctly when serializer "raw" is configured', (cb) => {
- const byteArray = new Uint8Array([1,2,3]);
+ const byteArray = new Uint8Array([1, 2, 3]);
helpers.processData(byteArray, 'raw', (data) => {
data.should.be.a('ArrayBuffer');
data.should.be.equal(byteArray.buffer);
@@ -647,7 +680,7 @@ describe('Dependency Validator', function () {
describe('checkFormDataInstance()', function () {
it('throws an error if FormData.entries() is not supported on given instance', function () {
const console = new ConsoleMock();
- const validator = require('../www/dependency-validator')({ FormData: {}}, console, messages);
+ const validator = require('../www/dependency-validator')({ FormData: {} }, console, messages);
(() => validator.checkFormDataInstance({})).should.throw(messages.MISSING_FORMDATA_ENTRIES_API);
});
@@ -684,12 +717,12 @@ describe('Ponyfills', function () {
const iterator = new ponyfills.Iterator([]);
iterator.next().should.be.eql({ done: true, value: undefined });
});
-
+
it('returns iteration object correctly when end posititon of list is not reached yet', () => {
const iterator = new ponyfills.Iterator([['first', 'this is the first item']]);
iterator.next().should.be.eql({ done: false, value: ['first', 'this is the first item'] });
});
-
+
it('returns iteration object correctly when end posititon of list is already reached', () => {
const iterator = new ponyfills.Iterator([['first', 'this is the first item']]);
iterator.next();
diff --git a/www/helpers.js b/www/helpers.js
index ecdb100..a578211 100644
--- a/www/helpers.js
+++ b/www/helpers.js
@@ -295,20 +295,28 @@ module.exports = function init(global, jsUtil, cookieHandler, messages, base64,
try {
// json
if (responseType === validResponseTypes[1]) {
- response.data = JSON.parse(response.data);
+ response.data = response.data === ''
+ ? undefined
+ : JSON.parse(response.data);
}
// arraybuffer
else if (responseType === validResponseTypes[2]) {
- response.data = base64.toArrayBuffer(response.data);
+ response.data = response.data === ''
+ ? null
+ : base64.toArrayBuffer(response.data);
}
// blob
else if (responseType === validResponseTypes[3]) {
- var buffer = base64.toArrayBuffer(response.data);
- var type = response.headers['content-type'] || '';
- var blob = new Blob([ buffer ], { type: type });
- response.data = blob;
+ if (response.data === '') {
+ response.data = null;
+ } else {
+ var buffer = base64.toArrayBuffer(response.data);
+ var type = response.headers['content-type'] || '';
+ var blob = new Blob([buffer], { type: type });
+ response.data = blob;
+ }
}
success(response);
@@ -384,7 +392,7 @@ module.exports = function init(global, jsUtil, cookieHandler, messages, base64,
if (allowedInstanceTypes) {
var isCorrectInstanceType = false;
- allowedInstanceTypes.forEach(function(type) {
+ allowedInstanceTypes.forEach(function (type) {
if ((global[type] && data instanceof global[type]) || (ponyfills[type] && data instanceof ponyfills[type])) {
isCorrectInstanceType = true;
}
@@ -440,7 +448,7 @@ module.exports = function init(global, jsUtil, cookieHandler, messages, base64,
if (entry.value[1] instanceof global.Blob || entry.value[1] instanceof global.File) {
var reader = new global.FileReader();
- reader.onload = function() {
+ reader.onload = function () {
result.buffers.push(base64.fromArrayBuffer(reader.result));
result.names.push(entry.value[0]);
result.fileNames.push(entry.value[1].name || 'blob');