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 @@ stats_error_parsing: 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 @@ stats_error_parsing: 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 79aa3f437..b48c24ede 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); @@ -1439,7 +1439,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; @@ -1601,10 +1601,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;