The fwdfor_hdr_name is already processed as an ist in `http_process_request`,
lets also just store it as such.
see 0643b0e7e ("MINOR: proxy: Make `header_unique_id` a `struct ist`") for a
very similar past commit.
---
include/haproxy/proxy-t.h | 3 +--
src/cfgparse-listen.c | 14 ++++++--------
src/http_ana.c | 3 +--
src/proxy.c | 10 ++++------
4 files changed, 12 insertions(+), 18 deletions(-)
diff --git a/include/haproxy/proxy-t.h b/include/haproxy/proxy-t.h
index 13e722fbf..8277c098e 100644
--- a/include/haproxy/proxy-t.h
+++ b/include/haproxy/proxy-t.h
@@ -352,9 +352,8 @@ struct proxy {
unsigned int tot_fe_maxconn; /* #maxconn of frontends linked
to that backend, it is used to compute fullconn */
struct net_addr except_xff_net; /* don't x-forward-for for this
address. */
struct net_addr except_xot_net; /* don't x-original-to for this
address. */
- char *fwdfor_hdr_name; /* header to use - default:
"x-forwarded-for" */
+ struct ist fwdfor_hdr_name; /* header to use -
default: "x-forwarded-for" */
char *orgto_hdr_name; /* header to use - default:
"x-original-to" */
- int fwdfor_hdr_len; /* length of "x-forwarded-for"
header */
int orgto_hdr_len; /* length of "x-original-to"
header */
char *server_id_hdr_name; /* the header to use to
send the server id (name) */
int server_id_hdr_len; /* the length of the id
(name) header... name */
diff --git a/src/cfgparse-listen.c b/src/cfgparse-listen.c
index eb58b2eb1..d858c3446 100644
--- a/src/cfgparse-listen.c
+++ b/src/cfgparse-listen.c
@@ -2331,11 +2331,10 @@ int cfg_parse_listen(const char *file, int linenum,
char **args, int kwm)
curproxy->options |= PR_O_FWDFOR | PR_O_FF_ALWAYS;
- free(curproxy->fwdfor_hdr_name);
- curproxy->fwdfor_hdr_name = strdup(DEF_XFORWARDFOR_HDR);
- if (!curproxy->fwdfor_hdr_name)
+ istfree(&curproxy->fwdfor_hdr_name);
+ curproxy->fwdfor_hdr_name =
istdup(ist(DEF_XFORWARDFOR_HDR));
+ if (!isttest(curproxy->fwdfor_hdr_name))
goto alloc_error;
- curproxy->fwdfor_hdr_len = strlen(DEF_XFORWARDFOR_HDR);
curproxy->except_xff_net.family = AF_UNSPEC;
/* loop to go through arguments - start at 2, since 0+1
= "option" "forwardfor" */
@@ -2374,11 +2373,10 @@ int cfg_parse_listen(const char *file, int linenum,
char **args, int kwm)
err_code |= ERR_ALERT |
ERR_FATAL;
goto out;
}
- free(curproxy->fwdfor_hdr_name);
- curproxy->fwdfor_hdr_name =
strdup(args[cur_arg+1]);
- if (!curproxy->fwdfor_hdr_name)
+ istfree(&curproxy->fwdfor_hdr_name);
+ curproxy->fwdfor_hdr_name =
istdup(ist(args[cur_arg+1]));
+ if (!isttest(curproxy->fwdfor_hdr_name))
goto alloc_error;
- curproxy->fwdfor_hdr_len =
strlen(curproxy->fwdfor_hdr_name);
cur_arg += 2;
} else if (strcmp(args[cur_arg], "if-none") ==
0) {
curproxy->options &= ~PR_O_FF_ALWAYS;
diff --git a/src/http_ana.c b/src/http_ana.c
index b60927e52..f02b8446b 100644
--- a/src/http_ana.c
+++ b/src/http_ana.c
@@ -655,8 +655,7 @@ int http_process_request(struct stream *s, struct channel
*req, int an_bit)
if ((sess->fe->options | s->be->options) & PR_O_FWDFOR) {
const struct sockaddr_storage *src = si_src(cs_si(s->csf));
struct http_hdr_ctx ctx = { .blk = NULL };
- struct ist hdr = ist2(s->be->fwdfor_hdr_len ?
s->be->fwdfor_hdr_name : sess->fe->fwdfor_hdr_name,
- s->be->fwdfor_hdr_len ?
s->be->fwdfor_hdr_len : sess->fe->fwdfor_hdr_len);
+ struct ist hdr = isttest(s->be->fwdfor_hdr_name) ?
s->be->fwdfor_hdr_name : sess->fe->fwdfor_hdr_name;
if (!((sess->fe->options | s->be->options) & PR_O_FF_ALWAYS) &&
http_find_header(htx, hdr, &ctx, 0)) {
diff --git a/src/proxy.c b/src/proxy.c
index e5cf81327..53ca5db29 100644
--- a/src/proxy.c
+++ b/src/proxy.c
@@ -332,7 +332,7 @@ void free_proxy(struct proxy *p)
pxdf->fct(p);
free(p->desc);
- free(p->fwdfor_hdr_name);
+ istfree(&p->fwdfor_hdr_name);
task_destroy(p->task);
@@ -1435,7 +1435,7 @@ void proxy_free_defaults(struct proxy *defproxy)
istfree(&defproxy->monitor_uri);
ha_free(&defproxy->defbe.name);
ha_free(&defproxy->conn_src.iface_name);
- ha_free(&defproxy->fwdfor_hdr_name); defproxy->fwdfor_hdr_len = 0;
+ istfree(&defproxy->fwdfor_hdr_name);
ha_free(&defproxy->orgto_hdr_name); defproxy->orgto_hdr_len = 0;
ha_free(&defproxy->server_id_hdr_name); defproxy->server_id_hdr_len = 0;
@@ -1597,10 +1597,8 @@ static int proxy_defproxy_cpy(struct proxy *curproxy,
const struct proxy *defpro
curproxy->tcp_req.inspect_delay = defproxy->tcp_req.inspect_delay;
curproxy->tcp_rep.inspect_delay = defproxy->tcp_rep.inspect_delay;
- if (defproxy->fwdfor_hdr_len) {
- curproxy->fwdfor_hdr_len = defproxy->fwdfor_hdr_len;
- curproxy->fwdfor_hdr_name = strdup(defproxy->fwdfor_hdr_name);
- }
+ if (isttest(defproxy->fwdfor_hdr_name))
+ curproxy->fwdfor_hdr_name = istdup(defproxy->fwdfor_hdr_name);
if (defproxy->orgto_hdr_len) {
curproxy->orgto_hdr_len = defproxy->orgto_hdr_len;
--
2.35.1