]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: proxy: Store fwdfor_hdr_name as a `struct ist`
authorTim Duesterhus <tim@bastelstu.be>
Fri, 4 Mar 2022 23:52:41 +0000 (00:52 +0100)
committerWilly Tarreau <w@1wt.eu>
Wed, 9 Mar 2022 06:51:27 +0000 (07:51 +0100)
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
src/cfgparse-listen.c
src/http_ana.c
src/proxy.c

index 13e722fbf26c5ebd3ed92e2817f42e6b72846a17..8277c098ea9df5d53d525980309623c456054a44 100644 (file)
@@ -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 */
index eb58b2eb16f1ab4e1d4a2421549efccceae29274..d858c344613faa1e9e2273e2a0107fda4c323383 100644 (file)
@@ -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;
index b60927e527a1e1a1192e9eca79594fe8db260701..f02b8446bdb0efa5ef45509c3a5beff98406dfc4 100644 (file)
@@ -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)) {
index 79aa3f437fd9c241e53b7bf5def1aa481ea29bc0..b48c24edecc7f4ae3fa09eb282be822dacb05f92 100644 (file)
@@ -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;