mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-11-12 22:41:03 +01:00
MINOR: samples: update the url_param fetch to match parameters in the path
It now supports an optional delimiter to allow to look for the parameter before the query string.
This commit is contained in:
parent
392e9390e6
commit
4c75cca8ba
@ -8935,12 +8935,19 @@ The list of currently supported pattern fetch functions is the following :
|
|||||||
url_port This extracts the port part from the request's URL. It probably
|
url_port This extracts the port part from the request's URL. It probably
|
||||||
is totally useless but it was available at no cost.
|
is totally useless but it was available at no cost.
|
||||||
|
|
||||||
url_param(<name>)
|
url_param(<name>[,<delim>])
|
||||||
This extracts the first occurrence of the parameter <name> in
|
This extracts the first occurrence of the parameter <name> in
|
||||||
the query string of the request and uses the corresponding value
|
the parameter string of the request and uses the corresponding
|
||||||
to match. A typical use is to get sticky session through url
|
value to match. Optionally, a delimiter can be provided. If not
|
||||||
(e.g. http://example.com/foo?JESSIONID=some_id with
|
then the question mark '?' is used by default.
|
||||||
url_param(JSESSIONID)), for cases where cookies cannot be used.
|
A typical use is to get sticky session through url for cases
|
||||||
|
where cookies cannot be used.
|
||||||
|
|
||||||
|
Example :
|
||||||
|
# match http://example.com/foo?PHPSESSIONID=some_id
|
||||||
|
stick on url_param(PHPSESSIONID)
|
||||||
|
# match http://example.com/foo;JSESSIONID=some_id
|
||||||
|
stick on url_param(JSESSIONID,;)
|
||||||
|
|
||||||
rdp_cookie(<name>)
|
rdp_cookie(<name>)
|
||||||
This extracts the value of the rdp cookie <name> as a string
|
This extracts the value of the rdp cookie <name> as a string
|
||||||
|
|||||||
@ -8525,17 +8525,17 @@ smp_fetch_cookie_val(struct proxy *px, struct session *l4, void *l7, unsigned in
|
|||||||
*
|
*
|
||||||
* find_query_string(path, n) points to "yo=mama;ye=daddy" string.
|
* find_query_string(path, n) points to "yo=mama;ye=daddy" string.
|
||||||
*/
|
*/
|
||||||
static inline char *find_query_string(char *path, size_t path_l)
|
static inline char *find_param_list(char *path, size_t path_l, char delim)
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
p = memchr(path, '?', path_l);
|
p = memchr(path, delim, path_l);
|
||||||
return p ? p + 1 : NULL;
|
return p ? p + 1 : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int is_param_delimiter(char c)
|
static inline int is_param_delimiter(char c, char delim)
|
||||||
{
|
{
|
||||||
return c == '&' || c == ';';
|
return c == '&' || c == ';' || c == delim;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -8547,7 +8547,8 @@ static inline int is_param_delimiter(char c)
|
|||||||
*/
|
*/
|
||||||
static char*
|
static char*
|
||||||
find_url_param_pos(char* query_string, size_t query_string_l,
|
find_url_param_pos(char* query_string, size_t query_string_l,
|
||||||
char* url_param_name, size_t url_param_name_l)
|
char* url_param_name, size_t url_param_name_l,
|
||||||
|
char delim)
|
||||||
{
|
{
|
||||||
char *pos, *last;
|
char *pos, *last;
|
||||||
|
|
||||||
@ -8560,7 +8561,7 @@ find_url_param_pos(char* query_string, size_t query_string_l,
|
|||||||
return pos;
|
return pos;
|
||||||
pos += url_param_name_l + 1;
|
pos += url_param_name_l + 1;
|
||||||
}
|
}
|
||||||
while (pos <= last && !is_param_delimiter(*pos))
|
while (pos <= last && !is_param_delimiter(*pos, delim))
|
||||||
pos++;
|
pos++;
|
||||||
pos++;
|
pos++;
|
||||||
}
|
}
|
||||||
@ -8575,26 +8576,27 @@ find_url_param_pos(char* query_string, size_t query_string_l,
|
|||||||
static int
|
static int
|
||||||
find_url_param_value(char* path, size_t path_l,
|
find_url_param_value(char* path, size_t path_l,
|
||||||
char* url_param_name, size_t url_param_name_l,
|
char* url_param_name, size_t url_param_name_l,
|
||||||
char** value, int* value_l)
|
char** value, int* value_l, char delim)
|
||||||
{
|
{
|
||||||
char *query_string, *qs_end;
|
char *query_string, *qs_end;
|
||||||
char *arg_start;
|
char *arg_start;
|
||||||
char *value_start, *value_end;
|
char *value_start, *value_end;
|
||||||
|
|
||||||
query_string = find_query_string(path, path_l);
|
query_string = find_param_list(path, path_l, delim);
|
||||||
if (!query_string)
|
if (!query_string)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
qs_end = path + path_l;
|
qs_end = path + path_l;
|
||||||
arg_start = find_url_param_pos(query_string, qs_end - query_string,
|
arg_start = find_url_param_pos(query_string, qs_end - query_string,
|
||||||
url_param_name, url_param_name_l);
|
url_param_name, url_param_name_l,
|
||||||
|
delim);
|
||||||
if (!arg_start)
|
if (!arg_start)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
value_start = arg_start + url_param_name_l + 1;
|
value_start = arg_start + url_param_name_l + 1;
|
||||||
value_end = value_start;
|
value_end = value_start;
|
||||||
|
|
||||||
while ((value_end < qs_end) && !is_param_delimiter(*value_end))
|
while ((value_end < qs_end) && !is_param_delimiter(*value_end, delim))
|
||||||
value_end++;
|
value_end++;
|
||||||
|
|
||||||
*value = value_start;
|
*value = value_start;
|
||||||
@ -8606,17 +8608,23 @@ static int
|
|||||||
smp_fetch_url_param(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
|
smp_fetch_url_param(struct proxy *px, struct session *l4, void *l7, unsigned int opt,
|
||||||
const struct arg *args, struct sample *smp)
|
const struct arg *args, struct sample *smp)
|
||||||
{
|
{
|
||||||
|
char delim = '?';
|
||||||
struct http_txn *txn = l7;
|
struct http_txn *txn = l7;
|
||||||
struct http_msg *msg = &txn->req;
|
struct http_msg *msg = &txn->req;
|
||||||
|
|
||||||
if (!args || args->type != ARGT_STR)
|
if (!args || args[0].type != ARGT_STR ||
|
||||||
|
(args[1].type && args[1].type != ARGT_STR))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
CHECK_HTTP_MESSAGE_FIRST();
|
CHECK_HTTP_MESSAGE_FIRST();
|
||||||
|
|
||||||
|
if (args[1].type)
|
||||||
|
delim = *args[1].data.str.str;
|
||||||
|
|
||||||
if (!find_url_param_value(msg->buf->buf.p + msg->sl.rq.u, msg->sl.rq.u_l,
|
if (!find_url_param_value(msg->buf->buf.p + msg->sl.rq.u, msg->sl.rq.u_l,
|
||||||
args->data.str.str, args->data.str.len,
|
args->data.str.str, args->data.str.len,
|
||||||
&smp->data.str.str, &smp->data.str.len))
|
&smp->data.str.str, &smp->data.str.len,
|
||||||
|
delim))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
smp->type = SMP_T_CSTR;
|
smp->type = SMP_T_CSTR;
|
||||||
@ -8778,7 +8786,7 @@ static struct sample_fetch_kw_list sample_fetch_keywords = {{ },{
|
|||||||
{ "url", smp_fetch_url, 0, NULL, SMP_T_CSTR, SMP_CAP_REQ },
|
{ "url", smp_fetch_url, 0, NULL, SMP_T_CSTR, SMP_CAP_REQ },
|
||||||
{ "url_ip", smp_fetch_url_ip, 0, NULL, SMP_T_IPV4, SMP_CAP_REQ },
|
{ "url_ip", smp_fetch_url_ip, 0, NULL, SMP_T_IPV4, SMP_CAP_REQ },
|
||||||
{ "url_port", smp_fetch_url_port, 0, NULL, SMP_T_UINT, SMP_CAP_REQ },
|
{ "url_port", smp_fetch_url_port, 0, NULL, SMP_T_UINT, SMP_CAP_REQ },
|
||||||
{ "url_param", smp_fetch_url_param, ARG1(1,STR), NULL, SMP_T_CSTR, SMP_CAP_REQ },
|
{ "url_param", smp_fetch_url_param, ARG2(1,STR,STR), NULL, SMP_T_CSTR, SMP_CAP_REQ },
|
||||||
{ "cookie", smp_fetch_cookie, ARG1(1,STR), NULL, SMP_T_CSTR, SMP_CAP_REQ|SMP_CAP_RES },
|
{ "cookie", smp_fetch_cookie, ARG1(1,STR), NULL, SMP_T_CSTR, SMP_CAP_REQ|SMP_CAP_RES },
|
||||||
{ "set-cookie", smp_fetch_cookie, ARG1(1,STR), NULL, SMP_T_CSTR, SMP_CAP_RES }, /* deprecated */
|
{ "set-cookie", smp_fetch_cookie, ARG1(1,STR), NULL, SMP_T_CSTR, SMP_CAP_RES }, /* deprecated */
|
||||||
{ NULL, NULL, 0, 0, 0 },
|
{ NULL, NULL, 0, 0, 0 },
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user