Skip to content

Commit 4412685

Browse files
author
Sefa Ilkimen
committed
fix silkimen#71: encode query string in URL correctly on Android
1 parent df86929 commit 4412685

File tree

2 files changed

+37
-17
lines changed

2 files changed

+37
-17
lines changed

src/android/com/github/kevinsawicki/http/HttpRequest.java

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -363,26 +363,35 @@ else if (queryStart < lastChar && baseUrl.charAt(lastChar) != '&')
363363
}
364364

365365
private static StringBuilder addParam(final Object key, Object value,
366-
final StringBuilder result) {
366+
final StringBuilder result) throws HttpRequestException {
367+
return addParam(key, value, result, CHARSET_UTF8);
368+
}
369+
370+
private static StringBuilder addParam(final Object key, Object value,
371+
final StringBuilder result, String charset) throws HttpRequestException {
367372
if (value != null && value.getClass().isArray())
368373
value = arrayToList(value);
369374

370-
if (value instanceof Iterable<?>) {
371-
Iterator<?> iterator = ((Iterable<?>) value).iterator();
372-
while (iterator.hasNext()) {
373-
result.append(key);
374-
result.append("[]=");
375-
Object element = iterator.next();
376-
if (element != null)
377-
result.append(element);
378-
if (iterator.hasNext())
379-
result.append("&");
375+
try {
376+
if (value instanceof Iterable<?>) {
377+
Iterator<?> iterator = ((Iterable<?>) value).iterator();
378+
while (iterator.hasNext()) {
379+
result.append(URLEncoder.encode(key.toString(), charset));
380+
result.append("[]=");
381+
Object element = iterator.next();
382+
if (element != null)
383+
result.append(URLEncoder.encode(element.toString(), charset));
384+
if (iterator.hasNext())
385+
result.append("&");
386+
}
387+
} else {
388+
result.append(URLEncoder.encode(key.toString(), charset));
389+
result.append("=");
390+
if (value != null)
391+
result.append(URLEncoder.encode(value.toString(), charset));
380392
}
381-
} else {
382-
result.append(key);
383-
result.append("=");
384-
if (value != null)
385-
result.append(value);
393+
} catch (UnsupportedEncodingException e) {
394+
throw new HttpRequestException(e);
386395
}
387396

388397
return result;

test/app-test-definitions.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ const tests = [
384384
cookies.mySecondCookie.should.be.equal('mySecondValue');
385385
}
386386
},{
387-
description: 'should send UTF-8 encoded raw string correctly (POST)',
387+
description: 'should send UTF-8 encoded raw string correctly (POST) #34',
388388
expected: 'resolved: {"status": 200, "data": "{\\"data\\": \\"this is a test string\\"...',
389389
before: helpers.setUtf8StringSerializer,
390390
func: function(resolve, reject) {
@@ -394,6 +394,17 @@ const tests = [
394394
result.type.should.be.equal('resolved');
395395
JSON.parse(result.data.data).data.should.eql('this is a test string');
396396
}
397+
},{
398+
description: 'should encode spaces in query string (params object) correctly (GET) #71',
399+
expected: 'resolved: {"status": 200, "data": "{\\"args\\": \\"query param\\": \\"and value with spaces\\"...',
400+
func: function(resolve, reject) {
401+
cordova.plugin.http.get('http://httpbin.org/get', { 'query param': 'and value with spaces' }, {}, resolve, reject);
402+
},
403+
validationFunc: function(driver, result) {
404+
result.type.should.be.equal('resolved');
405+
console.log(JSON.parse(result.data.data).args);
406+
JSON.parse(result.data.data).args['query param'].should.eql('and value with spaces');
407+
}
397408
}
398409
];
399410

0 commit comments

Comments
 (0)