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.
(cherry picked from commit fad4ffc89337277f3d5ed32b66986730e891558a)
diff --git a/src/backend.c b/src/backend.c
index a96b767..6fe03f9 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -200,7 +200,7 @@
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 @@
}
else if (c == '?' && !px->uri_whole)
break;
+ end++;
}
hash = gen_hash(px, start, (end - start));