final fix for #410

git-svn-id: http://svn.openlayers.org/trunk/openlayers@2852 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
euzuro
2007-03-22 17:47:40 +00:00
parent 1d3e144dd2
commit 78c16b973e
3 changed files with 50 additions and 21 deletions

View File

@@ -12,10 +12,21 @@ OpenLayers.Layer.HTTPRequest = OpenLayers.Class.create();
OpenLayers.Layer.HTTPRequest.prototype =
OpenLayers.Class.inherit( OpenLayers.Layer, {
/** @type String */
/** Used to hash URL param strings for multi-WMS server selection.
* Set to the Golden Ratio per Knuth's recommendation.
*
* @type Numeric
* @private
*/
URL_HASH_FACTOR: (Math.sqrt(5) - 1) / 2,
/** This is either an array of url strings or a single url string.
*
* @type Array(String) or String */
url: null,
/** Hashtable of key/value parameters
*
* @type Object */
params: null,
@@ -32,7 +43,7 @@ OpenLayers.Layer.HTTPRequest.prototype =
* @constructor
*
* @param {String} name
* @param {String} url
* @param {Array(String) or String} url
* @param {Object} params
* @param {Object} options Hashtable of extra options to tag onto the layer
*/
@@ -91,13 +102,24 @@ OpenLayers.Layer.HTTPRequest.prototype =
},
/**
* selectUrl() implements the standard floating-point multiplicative
* hash function described by Knuth, and hashes the contents of the
* given param string into a float between 0 and 1. This float is then
* scaled to the size of the provided urls array, and used to select
* a URL.
*
* @param {String} paramString
* @param {Array(String)} urls
*
* @returns An entry from the urls array, deterministically selected based
* on the paramString.
* @type String
*
*/
selectUrl: function(paramString, urls) {
var product = 1;
for (var i = 0; i < paramString.length; i++) {
product *= paramString.charCodeAt(i) * (Math.sqrt(5) - 1) / Math.sqrt(3);
product *= paramString.charCodeAt(i) * this.URL_HASH_FACTOR;
product -= Math.floor(product);
}
return urls[Math.floor(product * urls.length)];
@@ -111,20 +133,33 @@ OpenLayers.Layer.HTTPRequest.prototype =
* return in formatted string like this:
* "server?key1=value1&key2=value2&key3=value3"
*
* WARNING: The altUrl parameter is deprecated and will be removed in 3.0.
*
* @param {Object} newParams
* @param {String} altUrl Use this as the url instead of the layer's url
*
*
* @type String
*/
getFullRequestString:function(newParams, altUrl) {
// use layer's url unless altUrl passed in
var url = (altUrl == null) ? this.url : altUrl;
// if not altUrl passed in, use layer's url
var url = altUrl || this.url;
// create a new params hashtable with all the layer params and the
// new params together. then convert to string
var allParams = OpenLayers.Util.extend(new Object(), this.params);
allParams = OpenLayers.Util.extend(allParams, newParams);
var paramsString = OpenLayers.Util.getParameterString(allParams);
// if url is not a string, it should be an array of strings,
// in which case we will deterministically select one of them in
// order to evenly distribute requests to different urls.
//
if (url instanceof Array) {
url = this.selectUrl(paramsString, url);
}
// ignore parameters that are already in the url search string
var urlParams =
OpenLayers.Util.upperCaseObject(OpenLayers.Util.getArgs(url));
@@ -133,14 +168,7 @@ OpenLayers.Layer.HTTPRequest.prototype =
delete allParams[key];
}
}
var paramsString = OpenLayers.Util.getParameterString(allParams);
// if url is not a string, it should be an array of strings,
// in which case we will deterministically select one of them in
// order to evenly distribute requests to different urls.
if (url instanceof Array) {
url = this.selectUrl(paramsString, url);
}
paramsString = OpenLayers.Util.getParameterString(allParams);
// requestString always starts with url
var requestString = url;