From c9f2c13164fa00b1f9da7d22a8a5ff65f8aad55a Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 16 Dec 2011 21:50:30 +0100 Subject: MEDIUM: patterns: the hdr() pattern is now of type string This pattern previously was limited to type IP. With the new header extraction function, it becomes possible to extract strings, so that the header can be returned as a string. This will not change anything to existing configs, as string will automatically be converted to IP when needed. However, new configs will be able to use IPv6 addresses from headers in stick-tables, as well as stick on any non-IP header (eg: host, user-agent, ...). --- doc/configuration.txt | 7 +++---- src/proto_http.c | 21 ++++++--------------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/doc/configuration.txt b/doc/configuration.txt index 0066ee9..066f935 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -8050,10 +8050,9 @@ The list of currently supported pattern fetch functions is the following : ports to some clients for a whole application session. It is of type integer and only works with such tables. - hdr() This extracts the last occurrence of header in an HTTP - request and converts it to an IP address. This IP address is - then used to match the table. A typical use is with the - x-forwarded-for header. + hdr() This extracts the last occurrence of header in an HTTP + request. A typical use is with the X-Forwarded-For header once + converted to IP, associated with an IP stick-table. payload(,) This extracts a binary block of bytes, and starting diff --git a/src/proto_http.c b/src/proto_http.c index da785bb..1906916 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -8489,24 +8489,15 @@ static struct acl_kw_list acl_kws = {{ },{ /* The code below is dedicated to pattern fetching and matching */ /************************************************************************/ -/* extract the IP address from the last occurrence of specified header. Note - * that we should normally first extract the string then convert it to IP, - * but right now we have all the functions to do this seemlessly, and we will - * be able to change that later without touching the configuration. - */ +/* Returns the last occurrence of specified header. */ static int -pattern_fetch_hdr_ip(struct proxy *px, struct session *l4, void *l7, int dir, - const struct pattern_arg *arg_p, int arg_i, union pattern_data *data) +pattern_fetch_hdr(struct proxy *px, struct session *l4, void *l7, int dir, + const struct pattern_arg *arg_p, int arg_i, union pattern_data *data) { struct http_txn *txn = l7; - const char *vptr; - int vlen; - - if (!http_get_hdr(&txn->req, arg_p->data.str.str, arg_p->data.str.len, &txn->hdr_idx, -1, NULL, &vptr, &vlen)) - return 0; - data->ip.s_addr = htonl(inetaddr_host_lim(vptr, vptr + vlen)); - return data->ip.s_addr != 0; + return http_get_hdr(&txn->req, arg_p->data.str.str, arg_p->data.str.len, &txn->hdr_idx, + -1, NULL, &data->str.str, &data->str.len); } /* @@ -8798,7 +8789,7 @@ pattern_fetch_set_cookie(struct proxy *px, struct session *l4, void *l7, int dir /************************************************************************/ /* Note: must not be declared as its list will be overwritten */ static struct pattern_fetch_kw_list pattern_fetch_keywords = {{ },{ - { "hdr", pattern_fetch_hdr_ip, pattern_arg_str, PATTERN_TYPE_IP, PATTERN_FETCH_REQ }, + { "hdr", pattern_fetch_hdr, pattern_arg_str, PATTERN_TYPE_STRING, PATTERN_FETCH_REQ }, { "url_param", pattern_fetch_url_param, pattern_arg_str, PATTERN_TYPE_STRING, PATTERN_FETCH_REQ }, { "cookie", pattern_fetch_cookie, pattern_arg_str, PATTERN_TYPE_STRING, PATTERN_FETCH_REQ }, { "set-cookie", pattern_fetch_set_cookie, pattern_arg_str, PATTERN_TYPE_STRING, PATTERN_FETCH_RTR }, -- 1.7.2.3