From 41b6d4b702e8ed32f7ea51edffd0005639f77138 Mon Sep 17 00:00:00 2001
From: Vincent Petry <pvince81@owncloud.com>
Date: Fri, 24 Jan 2014 12:44:31 +0100
Subject: [PATCH] Added OC.buidQueryString() utility function

Makes it possible to create query strings by passing a JavaScript hash
map and automatically encodes the keys and values.
---
 core/js/js.js                   | 28 +++++++++++++++++++++++++
 core/js/tests/specs/coreSpec.js | 37 +++++++++++++++++++++++++++++++++
 2 files changed, 65 insertions(+)

diff --git a/core/js/js.js b/core/js/js.js
index e84f482d67..976027dd06 100644
--- a/core/js/js.js
+++ b/core/js/js.js
@@ -364,6 +364,34 @@ var OC={
 		}
 		return result;
 	},
+
+	/**
+	 * Builds a URL query from a JS map.
+	 * @param params parameter map
+	 * @return string containing a URL query (without question) mark
+	 */
+	buildQueryString: function(params) {
+		var s = '';
+		var first = true;
+		if (!params) {
+			return s;
+		}
+		for (var key in params) {
+			var value = params[key];
+			if (first) {
+				first = false;
+			}
+			else {
+				s += '&';
+			}
+			s += encodeURIComponent(key);
+			if (value !== null && typeof(value) !== 'undefined') {
+				s += '=' + encodeURIComponent(value);
+			}
+		}
+		return s;
+	},
+
 	/**
 	 * Opens a popup with the setting for an app.
 	 * @param appid String. The ID of the app e.g. 'calendar', 'contacts' or 'files'.
diff --git a/core/js/tests/specs/coreSpec.js b/core/js/tests/specs/coreSpec.js
index 827669f270..28c20a0642 100644
--- a/core/js/tests/specs/coreSpec.js
+++ b/core/js/tests/specs/coreSpec.js
@@ -67,4 +67,41 @@ describe('Core base tests', function() {
 			});
 		});
 	});
+	describe('Query string building', function() {
+		it('Returns empty string when empty params', function() {
+			expect(OC.buildQueryString()).toEqual('');
+			expect(OC.buildQueryString({})).toEqual('');
+		});
+		it('Encodes regular query strings', function() {
+			expect(OC.buildQueryString({
+				a: 'abc',
+				b: 'def'
+			})).toEqual('a=abc&b=def');
+		});
+		it('Encodes special characters', function() {
+			expect(OC.buildQueryString({
+				unicode: '汉字',
+			})).toEqual('unicode=%E6%B1%89%E5%AD%97');
+			expect(OC.buildQueryString({
+			   	b: 'spaace value',
+			   	'space key': 'normalvalue',
+			   	'slash/this': 'amp&ersand'
+			})).toEqual('b=spaace%20value&space%20key=normalvalue&slash%2Fthis=amp%26ersand');
+		});
+		it('Encodes data types and empty values', function() {
+			expect(OC.buildQueryString({
+				'keywithemptystring': '',
+			   	'keywithnull': null,
+			   	'keywithundefined': null,
+				something: 'else'
+			})).toEqual('keywithemptystring=&keywithnull&keywithundefined&something=else');
+			expect(OC.buildQueryString({
+			   	'booleanfalse': false,
+				'booleantrue': true
+			})).toEqual('booleanfalse=false&booleantrue=true');
+			expect(OC.buildQueryString({
+			   	'number': 123,
+			})).toEqual('number=123');
+		});
+	});
 });
-- 
GitLab