fix(Angular.js): don't crash on invalid query parameters

This commit is contained in:
Pete Bacon Darwin 2013-06-20 13:59:46 +01:00
parent a7908134cb
commit 8264d08085
2 changed files with 28 additions and 3 deletions

View file

@ -821,6 +821,23 @@ function startingTag(element) {
///////////////////////////////////////////////// /////////////////////////////////////////////////
/**
* Tries to decode the URI component without throwing an exception.
*
* @private
* @param str value potential URI component to check.
* @returns {boolean} True if `value` can be decoded
* with the decodeURIComponent function.
*/
function tryDecodeURIComponent(value) {
try {
return decodeURIComponent(value);
} catch(e) {
// Ignore any invalid uri component
}
}
/** /**
* Parses an escaped url query string into key-value pairs. * Parses an escaped url query string into key-value pairs.
* @returns Object.<(string|boolean)> * @returns Object.<(string|boolean)>
@ -828,10 +845,12 @@ function startingTag(element) {
function parseKeyValue(/**string*/keyValue) { function parseKeyValue(/**string*/keyValue) {
var obj = {}, key_value, key; var obj = {}, key_value, key;
forEach((keyValue || "").split('&'), function(keyValue){ forEach((keyValue || "").split('&'), function(keyValue){
if (keyValue) { if ( keyValue ) {
key_value = keyValue.split('='); key_value = keyValue.split('=');
key = decodeURIComponent(key_value[0]); key = tryDecodeURIComponent(key_value[0]);
obj[key] = isDefined(key_value[1]) ? decodeURIComponent(key_value[1]) : true; if ( isDefined(key) ) {
obj[key] = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true;
}
} }
}); });
return obj; return obj;

View file

@ -312,6 +312,12 @@ describe('angular', function() {
expect(parseKeyValue('flag1&key=value&flag2')). expect(parseKeyValue('flag1&key=value&flag2')).
toEqual({flag1: true, key: 'value', flag2: true}); toEqual({flag1: true, key: 'value', flag2: true});
}); });
it('should ignore key values that are not valid URI components', function() {
expect(function() { parseKeyValue('%'); }).not.toThrow();
expect(parseKeyValue('%')).toEqual({});
expect(parseKeyValue('invalid=%')).toEqual({ invalid: undefined });
expect(parseKeyValue('invalid=%&valid=good')).toEqual({ invalid: undefined, valid: 'good' });
});
}); });
describe('toKeyValue', function() { describe('toKeyValue', function() {