summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2014-01-28 16:16:09 +0100
committerVincent Petry <pvince81@owncloud.com>2014-04-01 23:02:34 +0200
commit268206cec55921d2d0309469ebd5d9533e4f79ee (patch)
tree66459e8c136f015e5118651069f1531e35edf10b
parentd762e25cc55130e25eba0900c821b36e0897e478 (diff)
downloadnextcloud-server-268206cec55921d2d0309469ebd5d9533e4f79ee.tar.gz
nextcloud-server-268206cec55921d2d0309469ebd5d9533e4f79ee.zip
Fixed parseQueryString to handle empty values and plus signs
- now correctly parse query strings with '+' signs - empty values are now parsed either as null or empty string - added unit test for parseQueryString()
-rw-r--r--core/js/js.js32
-rw-r--r--core/js/tests/specs/coreSpec.js67
2 files changed, 92 insertions, 7 deletions
diff --git a/core/js/js.js b/core/js/js.js
index 302b6b4d9fa..e907db2837e 100644
--- a/core/js/js.js
+++ b/core/js/js.js
@@ -371,6 +371,7 @@ var OC={
*/
parseQueryString:function(queryString){
var parts,
+ pos,
components,
result = {},
key,
@@ -378,12 +379,25 @@ var OC={
if (!queryString){
return null;
}
- if (queryString[0] === '?'){
- queryString = queryString.substr(1);
+ pos = queryString.indexOf('?');
+ if (pos >= 0){
+ queryString = queryString.substr(pos + 1);
}
- parts = queryString.split('&');
+ parts = queryString.replace(/\+/g, '%20').split('&');
for (var i = 0; i < parts.length; i++){
- components = parts[i].split('=');
+ // split on first equal sign
+ var part = parts[i]
+ pos = part.indexOf('=');
+ if (pos >= 0) {
+ components = [
+ part.substr(0, pos),
+ part.substr(pos + 1)
+ ]
+ }
+ else {
+ // key only
+ components = [part];
+ }
if (!components.length){
continue;
}
@@ -391,8 +405,14 @@ var OC={
if (!key){
continue;
}
- value = components[1];
- result[key] = value && decodeURIComponent(value);
+ // if equal sign was there, return string
+ if (components.length > 1) {
+ result[key] = decodeURIComponent(components[1]);
+ }
+ // no equal sign => null value
+ else {
+ result[key] = null;
+ }
}
return result;
},
diff --git a/core/js/tests/specs/coreSpec.js b/core/js/tests/specs/coreSpec.js
index 57ea5be8be0..94a397b7892 100644
--- a/core/js/tests/specs/coreSpec.js
+++ b/core/js/tests/specs/coreSpec.js
@@ -268,7 +268,72 @@ describe('Core base tests', function() {
// still nothing
expect(counter).toEqual(0);
});
-
+ });
+ describe('Parse query string', function() {
+ it('Parses query string from full URL', function() {
+ var query = OC.parseQueryString('http://localhost/stuff.php?q=a&b=x');
+ expect(query).toEqual({q: 'a', b: 'x'});
+ });
+ it('Parses query string from query part alone', function() {
+ var query = OC.parseQueryString('q=a&b=x');
+ expect(query).toEqual({q: 'a', b: 'x'});
+ });
+ it('Returns null hash when empty query', function() {
+ var query = OC.parseQueryString('');
+ expect(query).toEqual(null);
+ });
+ it('Returns empty hash when empty query with question mark', function() {
+ var query = OC.parseQueryString('?');
+ expect(query).toEqual({});
+ });
+ it('Decodes regular query strings', function() {
+ var query = OC.parseQueryString('a=abc&b=def');
+ expect(query).toEqual({
+ a: 'abc',
+ b: 'def'
+ });
+ });
+ it('Ignores empty parts', function() {
+ var query = OC.parseQueryString('&q=a&&b=x&');
+ expect(query).toEqual({q: 'a', b: 'x'});
+ });
+ it('Ignores lone equal signs', function() {
+ var query = OC.parseQueryString('&q=a&=&b=x&');
+ expect(query).toEqual({q: 'a', b: 'x'});
+ });
+ it('Includes extra equal signs in value', function() {
+ var query = OC.parseQueryString('u=a=x&q=a=b');
+ expect(query).toEqual({u: 'a=x', q: 'a=b'});
+ });
+ it('Decodes plus as space', function() {
+ var query = OC.parseQueryString('space+key=space+value');
+ expect(query).toEqual({'space key': 'space value'});
+ });
+ it('Decodes special characters', function() {
+ var query = OC.parseQueryString('unicode=%E6%B1%89%E5%AD%97');
+ expect(query).toEqual({unicode: '汉字'});
+ query = OC.parseQueryString('b=spaace%20value&space%20key=normalvalue&slash%2Fthis=amp%26ersand');
+ expect(query).toEqual({
+ b: 'spaace value',
+ 'space key': 'normalvalue',
+ 'slash/this': 'amp&ersand'
+ });
+ });
+ it('Decodes empty values', function() {
+ var query = OC.parseQueryString('keywithemptystring=&keywithnostring');
+ expect(query).toEqual({
+ 'keywithemptystring': '',
+ 'keywithnostring': null
+ });
+ });
+ it('Does not interpret data types', function() {
+ var query = OC.parseQueryString('booleanfalse=false&booleantrue=true&number=123');
+ expect(query).toEqual({
+ 'booleanfalse': 'false',
+ 'booleantrue': 'true',
+ 'number': '123'
+ });
+ });
});
describe('Generate Url', function() {
it('returns absolute urls', function() {