MINOR: http_fetch: add case insensitive support for smp_fetch_url_param
This commit adds a new argument to smp_fetch_url_param
that makes the parameter key comparison case-insensitive.
Several levels of callers were modified to pass this info.
diff --git a/include/haproxy/http.h b/include/haproxy/http.h
index f597ee4..7394133 100644
--- a/include/haproxy/http.h
+++ b/include/haproxy/http.h
@@ -54,10 +54,10 @@
int http_parse_qvalue(const char *qvalue, const char **end);
const char *http_find_url_param_pos(const char **chunks,
const char* url_param_name,
- size_t url_param_name_l, char delim);
+ size_t url_param_name_l, char delim, char insensitive);
int http_find_next_url_param(const char **chunks,
const char* url_param_name, size_t url_param_name_l,
- const char **vstart, const char **vend, char delim);
+ const char **vstart, const char **vend, char delim, char insensitive);
int http_parse_header(const struct ist hdr, struct ist *name, struct ist *value);
int http_parse_stline(const struct ist line, struct ist *p1, struct ist *p2, struct ist *p3);
diff --git a/src/http.c b/src/http.c
index f55b696..8aef755 100644
--- a/src/http.c
+++ b/src/http.c
@@ -995,7 +995,7 @@
*/
const char *http_find_url_param_pos(const char **chunks,
const char* url_param_name, size_t url_param_name_l,
- char delim)
+ char delim, char insensitive)
{
const char *pos, *last, *equal;
const char **bufs = chunks;
@@ -1032,9 +1032,16 @@
if (bufs[2] + l2 > bufs[3])
return NULL;
- if (memcmp(pos, url_param_name, l1) == 0 &&
- memcmp(bufs[2], url_param_name+l1, l2) == 0)
- return pos;
+ if (insensitive) {
+ if (strncasecmp(pos, url_param_name, l1) == 0 &&
+ strncasecmp(bufs[2], url_param_name+l1, l2) == 0)
+ return pos;
+ }
+ else {
+ if (memcmp(pos, url_param_name, l1) == 0 &&
+ memcmp(bufs[2], url_param_name+l1, l2) == 0)
+ return pos;
+ }
/* Perform wrapping and jump the string who fail the comparison. */
bufs += 2;
@@ -1042,9 +1049,14 @@
last = bufs[1];
} else {
- /* process a simple comparison. */
- if (memcmp(pos, url_param_name, url_param_name_l) == 0)
- return pos;
+ /* process a simple comparison.*/
+ if (insensitive) {
+ if (strncasecmp(pos, url_param_name, url_param_name_l) == 0)
+ return pos;
+ } else {
+ if (memcmp(pos, url_param_name, url_param_name_l) == 0)
+ return pos;
+ }
pos += url_param_name_l + 1;
if (fix_pointer_if_wrap(chunks, &pos))
last = bufs[2];
@@ -1078,7 +1090,7 @@
*/
int http_find_next_url_param(const char **chunks,
const char* url_param_name, size_t url_param_name_l,
- const char **vstart, const char **vend, char delim)
+ const char **vstart, const char **vend, char delim, char insensitive)
{
const char *arg_start, *qs_end;
const char *value_start, *value_end;
@@ -1089,7 +1101,7 @@
/* Looks for an argument name. */
arg_start = http_find_url_param_pos(chunks,
url_param_name, url_param_name_l,
- delim);
+ delim, insensitive);
/* Check for wrapping. */
if (arg_start >= qs_end)
qs_end = chunks[3];
diff --git a/src/http_fetch.c b/src/http_fetch.c
index 732cfbb..270ef97 100644
--- a/src/http_fetch.c
+++ b/src/http_fetch.c
@@ -1833,14 +1833,14 @@
* in ctx->a[1], and the optional second part in (ctx->a[2]..ctx->a[3]). The
* pointers are updated for next iteration before leaving.
*/
-static int smp_fetch_param(char delim, const char *name, int name_len, const struct arg *args, struct sample *smp, const char *kw, void *private)
+static int smp_fetch_param(char delim, const char *name, int name_len, const struct arg *args, struct sample *smp, const char *kw, void *private, char insensitive)
{
const char *vstart, *vend;
struct buffer *temp;
const char **chunks = (const char **)smp->ctx.a;
if (!http_find_next_url_param(chunks, name, name_len,
- &vstart, &vend, delim))
+ &vstart, &vend, delim, insensitive))
return 0;
/* Create sample. If the value is contiguous, return the pointer as CONST,
@@ -1926,7 +1926,7 @@
*/
}
- return smp_fetch_param(delim, name, name_len, args, smp, kw, private);
+ return smp_fetch_param(delim, name, name_len, args, smp, kw, private, 0);
}
/* This function iterates over each parameter of the body. This requires
@@ -1984,7 +1984,7 @@
}
- return smp_fetch_param('&', name, name_len, args, smp, kw, private);
+ return smp_fetch_param('&', name, name_len, args, smp, kw, private, 0);
}
/* Return the signed integer value for the specified url parameter (see url_param