From d325ddd214fc4773a56b99c6d33ccc4557aa7e3c Mon Sep 17 00:00:00 2001 From: penfold Date: Fri, 21 Jun 2013 16:42:19 +0200 Subject: [PATCH 1/3] update key value parser to create array for duplicate keys --- src/Angular.js | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/Angular.js b/src/Angular.js index 2fb8f66c43f1..7f961095819f 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -831,7 +831,27 @@ function parseKeyValue(/**string*/keyValue) { if (keyValue) { key_value = keyValue.split('='); key = decodeURIComponent(key_value[0]); - obj[key] = isDefined(key_value[1]) ? decodeURIComponent(key_value[1]) : true; + + if (obj.hasOwnProperty(key) ) + { + var innerObj = obj[key]; + var value = isDefined(key_value[1]) ? decodeURIComponent(key_value[1]) : true; + if (isArray(innerObj)) + { + innerObj.push(value); + } + else + { + var newArray = []; + newArray.push(innerObj); + newArray.push(value); + obj[key] = newArray; + } + } + else + { + obj[key] = isDefined(key_value[1]) ? decodeURIComponent(key_value[1]) : true; + } } }); return obj; From 2d0befc536ffa7155e3e2976bb2e9cd61e25700b Mon Sep 17 00:00:00 2001 From: penfold Date: Fri, 21 Jun 2013 17:00:38 +0200 Subject: [PATCH 2/3] Update toKeyValue to stringify key/value pair with arrays. --- src/Angular.js | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/Angular.js b/src/Angular.js index 7f961095819f..ca37358c6282 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -827,29 +827,25 @@ function startingTag(element) { */ function parseKeyValue(/**string*/keyValue) { var obj = {}, key_value, key; - forEach((keyValue || "").split('&'), function(keyValue){ + forEach((keyValue || "").split('&'), function(keyValue) { if (keyValue) { key_value = keyValue.split('='); key = decodeURIComponent(key_value[0]); - if (obj.hasOwnProperty(key) ) - { + if (obj.hasOwnProperty(key)) { var innerObj = obj[key]; var value = isDefined(key_value[1]) ? decodeURIComponent(key_value[1]) : true; - if (isArray(innerObj)) - { + if (isArray(innerObj)) { innerObj.push(value); } - else - { + else { var newArray = []; newArray.push(innerObj); newArray.push(value); obj[key] = newArray; } } - else - { + else { obj[key] = isDefined(key_value[1]) ? decodeURIComponent(key_value[1]) : true; } } @@ -858,11 +854,18 @@ function parseKeyValue(/**string*/keyValue) { } function toKeyValue(obj) { - var parts = []; - forEach(obj, function(value, key) { - parts.push(encodeUriQuery(key, true) + (value === true ? '' : '=' + encodeUriQuery(value, true))); - }); - return parts.length ? parts.join('&') : ''; + var parts = []; + forEach(obj, function(value, key) { + if (isArray(value)) { + forEach(value, function(arrayValue) { + parts.push(encodeUriQuery(key, true) + (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true))); + }); + } + else { + parts.push(encodeUriQuery(key, true) + (value === true ? '' : '=' + encodeUriQuery(value, true))); + } + }); + return parts.length ? parts.join('&') : ''; } From 95b2ad33c25ac5f70c9ee56755e06596209877c0 Mon Sep 17 00:00:00 2001 From: penfold Date: Fri, 21 Jun 2013 17:06:03 +0200 Subject: [PATCH 3/3] Added test for duplicate key value pairs --- test/AngularSpec.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/AngularSpec.js b/test/AngularSpec.js index 7c004eb1b53f..a69e95632d00 100644 --- a/test/AngularSpec.js +++ b/test/AngularSpec.js @@ -311,6 +311,7 @@ describe('angular', function() { expect(parseKeyValue('emptyKey=')).toEqual({emptyKey: ''}); expect(parseKeyValue('flag1&key=value&flag2')). toEqual({flag1: true, key: 'value', flag2: true}); + expect(parseKeyValue('key=value1&key=value2')).toEqual({key: ['value1','value2]'}); }); }); @@ -322,6 +323,7 @@ describe('angular', function() { expect(toKeyValue({'escaped key': 'escaped value'})). toEqual('escaped%20key=escaped%20value'); expect(toKeyValue({emptyKey: ''})).toEqual('emptyKey='); + expect(toKeyValue({key: ['value1','value2]'}).toEqual('key=value1&key=value2'); }); it('should parse true values into flags', function() {