Making it so OpenLayers.Util.getParameters doesn't fail with improperly encoded query string parameter names or values. We expect parameter names and values to be encoded according to RFC 3986 (http://labs.apache.org/webarch/uri/rfc/rfc3986.html). However, there are cases where browsers will not use utf-8 character encoding in generating a URL. In these cases, the unescape function provides a fallback that tries to use the ISO Latin character set. This may not always be a good second assumption, but it is better than failing to load the library when the first assumption fails. r=ahocevar (closes #2821)
git-svn-id: http://svn.openlayers.org/trunk/openlayers@10771 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
@@ -1062,11 +1062,25 @@ OpenLayers.Util.getParameters = function(url) {
|
||||
for(var i=0, len=pairs.length; i<len; ++i) {
|
||||
var keyValue = pairs[i].split('=');
|
||||
if (keyValue[0]) {
|
||||
var key = decodeURIComponent(keyValue[0]);
|
||||
var value = keyValue[1] || ''; //empty string if no value
|
||||
|
||||
//decode individual values (being liberal by replacing "+" with " ")
|
||||
value = decodeURIComponent(value.replace(/\+/g, " ")).split(",");
|
||||
var key = keyValue[0];
|
||||
try {
|
||||
key = decodeURIComponent(key);
|
||||
} catch (err) {
|
||||
key = unescape(key);
|
||||
}
|
||||
|
||||
// being liberal by replacing "+" with " "
|
||||
var value = (keyValue[1] || '').replace(/\+/g, " ");
|
||||
|
||||
try {
|
||||
value = decodeURIComponent(value);
|
||||
} catch (err) {
|
||||
value = unescape(value);
|
||||
}
|
||||
|
||||
// follow OGC convention of comma delimited values
|
||||
value = value.split(",")
|
||||
|
||||
//if there's only one value, do not return as array
|
||||
if (value.length == 1) {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||
<script>
|
||||
var custom$ = function() {};
|
||||
window.$ = custom$;
|
||||
@@ -894,7 +895,7 @@
|
||||
}
|
||||
|
||||
function test_Util_getParameters(t) {
|
||||
t.plan(13);
|
||||
t.plan(17);
|
||||
|
||||
t.eq(OpenLayers.Util.getParameters('http://www.example.com'), {},
|
||||
"getParameters works when args = ''");
|
||||
@@ -953,6 +954,18 @@
|
||||
var str = OpenLayers.Util.getParameterString(obj);
|
||||
t.eq(OpenLayers.Util.getParameters("?" + str), obj, "round tripped parameters");
|
||||
|
||||
// try some oddly encoded strings
|
||||
var url = "http://example.com/?C%E9sar=C%E9sar+Ch%E1vez";
|
||||
var obj = OpenLayers.Util.getParameters(url);
|
||||
t.ok("César" in obj, "got proper key from C%E9sar");
|
||||
t.eq(obj["César"], "César Chávez", "got proper value from C%E9sar+Ch%E1vez");
|
||||
|
||||
// try some properly encoded strings
|
||||
var url = "http://example.com/?C%C3%A9sar=C%C3%A9sar+Ch%C3%A1vez";
|
||||
var obj = OpenLayers.Util.getParameters(url);
|
||||
t.ok("César" in obj, "got proper key from C%C3%A9sar");
|
||||
t.eq(obj["César"], "César Chávez", "got proper value from C%E9sar+Ch%E1vez");
|
||||
|
||||
}
|
||||
|
||||
function test_Util_getArgs(t) {
|
||||
|
||||
Reference in New Issue
Block a user