BUG/MEDIUM: backend: fix URI hash when a query string is present

Commit 98634f0 ("MEDIUM: backend: Enhance hash-type directive with an
algorithm options") cleaned up the hashing code by using a centralized
function. A bug appeared in get_server_uh() which is the URI hashing
function. Prior to the patch, the function would stop hashing on the
question mark, or on the trailing slash of a maximum directory count.
Consecutive to the patch, this last character is included into the
hash computation. This means that :

    GET /0
    GET /0?

Are not hashed similarly. The following configuration reproduces it :

    mode http
    balance uri
    server s1 0.0.0.0:1234 redir /s1
    server s2 0.0.0.0:1234 redir /s2

Many thanks to Vedran Furac for reporting this issue. The fix must
be backported to 1.5.
This commit is contained in:
Willy Tarreau 2014-10-17 12:11:50 +02:00
parent e1cfc1f2b4
commit fad4ffc893

View File

@ -200,7 +200,7 @@ struct server *get_server_uh(struct proxy *px, char *uri, int uri_len)
start = end = uri;
while (uri_len--) {
c = *end++;
c = *end;
if (c == '/') {
slashes++;
if (slashes == px->uri_dirs_depth1) /* depth+1 */
@ -208,6 +208,7 @@ struct server *get_server_uh(struct proxy *px, char *uri, int uri_len)
}
else if (c == '?' && !px->uri_whole)
break;
end++;
}
hash = gen_hash(px, start, (end - start));