From 441268586b855e0e5f66a16b618fd7406f3c2cf7 Mon Sep 17 00:00:00 2001 From: Sefa Ilkimen Date: Sun, 11 Feb 2018 16:37:51 +0100 Subject: [PATCH] fix #71: encode query string in URL correctly on Android --- .../github/kevinsawicki/http/HttpRequest.java | 41 +++++++++++-------- test/app-test-definitions.js | 13 +++++- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/android/com/github/kevinsawicki/http/HttpRequest.java b/src/android/com/github/kevinsawicki/http/HttpRequest.java index f0c0f33..c812234 100644 --- a/src/android/com/github/kevinsawicki/http/HttpRequest.java +++ b/src/android/com/github/kevinsawicki/http/HttpRequest.java @@ -363,26 +363,35 @@ public class HttpRequest { } private static StringBuilder addParam(final Object key, Object value, - final StringBuilder result) { + final StringBuilder result) throws HttpRequestException { + return addParam(key, value, result, CHARSET_UTF8); + } + + private static StringBuilder addParam(final Object key, Object value, + final StringBuilder result, String charset) throws HttpRequestException { if (value != null && value.getClass().isArray()) value = arrayToList(value); - if (value instanceof Iterable) { - Iterator iterator = ((Iterable) value).iterator(); - while (iterator.hasNext()) { - result.append(key); - result.append("[]="); - Object element = iterator.next(); - if (element != null) - result.append(element); - if (iterator.hasNext()) - result.append("&"); + try { + if (value instanceof Iterable) { + Iterator iterator = ((Iterable) value).iterator(); + while (iterator.hasNext()) { + result.append(URLEncoder.encode(key.toString(), charset)); + result.append("[]="); + Object element = iterator.next(); + if (element != null) + result.append(URLEncoder.encode(element.toString(), charset)); + if (iterator.hasNext()) + result.append("&"); + } + } else { + result.append(URLEncoder.encode(key.toString(), charset)); + result.append("="); + if (value != null) + result.append(URLEncoder.encode(value.toString(), charset)); } - } else { - result.append(key); - result.append("="); - if (value != null) - result.append(value); + } catch (UnsupportedEncodingException e) { + throw new HttpRequestException(e); } return result; diff --git a/test/app-test-definitions.js b/test/app-test-definitions.js index 0fbc3fe..265acb9 100644 --- a/test/app-test-definitions.js +++ b/test/app-test-definitions.js @@ -384,7 +384,7 @@ const tests = [ cookies.mySecondCookie.should.be.equal('mySecondValue'); } },{ - description: 'should send UTF-8 encoded raw string correctly (POST)', + description: 'should send UTF-8 encoded raw string correctly (POST) #34', expected: 'resolved: {"status": 200, "data": "{\\"data\\": \\"this is a test string\\"...', before: helpers.setUtf8StringSerializer, func: function(resolve, reject) { @@ -394,6 +394,17 @@ const tests = [ result.type.should.be.equal('resolved'); JSON.parse(result.data.data).data.should.eql('this is a test string'); } + },{ + description: 'should encode spaces in query string (params object) correctly (GET) #71', + expected: 'resolved: {"status": 200, "data": "{\\"args\\": \\"query param\\": \\"and value with spaces\\"...', + func: function(resolve, reject) { + cordova.plugin.http.get('http://httpbin.org/get', { 'query param': 'and value with spaces' }, {}, resolve, reject); + }, + validationFunc: function(driver, result) { + result.type.should.be.equal('resolved'); + console.log(JSON.parse(result.data.data).args); + JSON.parse(result.data.data).args['query param'].should.eql('and value with spaces'); + } } ];