mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-03-16 23:30:23 +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.
|
||||
* @returns Object.<(string|boolean)>
|
||||
|
|
@ -828,10 +845,12 @@ function startingTag(element) {
|
|||
function parseKeyValue(/**string*/keyValue) {
|
||||
var obj = {}, key_value, key;
|
||||
forEach((keyValue || "").split('&'), function(keyValue){
|
||||
if (keyValue) {
|
||||
if ( keyValue ) {
|
||||
key_value = keyValue.split('=');
|
||||
key = decodeURIComponent(key_value[0]);
|
||||
obj[key] = isDefined(key_value[1]) ? decodeURIComponent(key_value[1]) : true;
|
||||
key = tryDecodeURIComponent(key_value[0]);
|
||||
if ( isDefined(key) ) {
|
||||
obj[key] = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true;
|
||||
}
|
||||
}
|
||||
});
|
||||
return obj;
|
||||
|
|
|
|||
|
|
@ -312,6 +312,12 @@ describe('angular', function() {
|
|||
expect(parseKeyValue('flag1&key=value&flag2')).
|
||||
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() {
|
||||
|
|
|
|||
Loading…
Reference in a new issue