mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-05-13 17:23:11 +00:00
fix(Angular.js): don't crash on invalid query parameters
This commit is contained in:
parent
a7908134cb
commit
8264d08085
2 changed files with 28 additions and 3 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue