The monitor_uri is already processed as an ist in `http_wait_for_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 | 9 +++------ src/http_ana.c | 5 ++--- src/proxy.c | 11 +++++------ 4 files changed, 11 insertions(+), 17 deletions(-) diff --git a/include/haproxy/proxy-t.h b/include/haproxy/proxy-t.h index 421f900e2..13e722fbf 100644 --- a/include/haproxy/proxy-t.h +++ b/include/haproxy/proxy-t.h @@ -322,8 +322,7 @@ struct proxy { int srvtcpka_cnt; /* The maximum number of keepalive probes TCP should send before dropping the connection. (server side) */ int srvtcpka_idle; /* The time (in seconds) the connection needs to remain idle before TCP starts sending keepalive probes. (server side) */ int srvtcpka_intvl; /* The time (in seconds) between individual keepalive probes. (server side) */ - int monitor_uri_len; /* length of the string above. 0 if unused */ - char *monitor_uri; /* a special URI to which we respond with HTTP/200 OK */ + struct ist monitor_uri; /* a special URI to which we respond with HTTP/200 OK */ struct list mon_fail_cond; /* list of conditions to fail monitoring requests (chained) */ struct { /* WARNING! check proxy_reset_timeouts() in proxy.h !!! */ int client; /* client I/O timeout (in ticks) */ diff --git a/src/cfgparse-listen.c b/src/cfgparse-listen.c index 5deec5e6b..eb58b2eb1 100644 --- a/src/cfgparse-listen.c +++ b/src/cfgparse-listen.c @@ -575,13 +575,10 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int kwm) goto out; } - free(curproxy->monitor_uri); - curproxy->monitor_uri_len = strlen(args[1]); - curproxy->monitor_uri = calloc(1, curproxy->monitor_uri_len + 1); - if (!curproxy->monitor_uri) + istfree(&curproxy->monitor_uri); + curproxy->monitor_uri = istdup(ist(args[1])); + if (!isttest(curproxy->monitor_uri)) goto alloc_error; - memcpy(curproxy->monitor_uri, args[1], curproxy->monitor_uri_len); - curproxy->monitor_uri[curproxy->monitor_uri_len] = '\0'; goto out; } diff --git a/src/http_ana.c b/src/http_ana.c index f33eb7790..b60927e52 100644 --- a/src/http_ana.c +++ b/src/http_ana.c @@ -203,9 +203,8 @@ int http_wait_for_request(struct stream *s, struct channel *req, int an_bit) * used. It is a workaround to let HTTP/2 health-checks work as * expected. */ - if (unlikely(sess->fe->monitor_uri_len != 0)) { - const struct ist monitor_uri = ist2(sess->fe->monitor_uri, - sess->fe->monitor_uri_len); + if (unlikely(isttest(sess->fe->monitor_uri))) { + const struct ist monitor_uri = sess->fe->monitor_uri; struct http_uri_parser parser = http_uri_parser_init(htx_sl_req_uri(sl)); if ((istptr(monitor_uri)[0] == '/' && diff --git a/src/proxy.c b/src/proxy.c index 946fe13d5..e5cf81327 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -156,7 +156,7 @@ void free_proxy(struct proxy *p) free(p->lbprm.arg_str); free(p->server_state_file_name); free(p->capture_name); - free(p->monitor_uri); + istfree(&p->monitor_uri); free(p->rdp_cookie_name); free(p->invalid_rep); free(p->invalid_req); @@ -1270,7 +1270,7 @@ int proxy_cfg_ensure_no_http(struct proxy *curproxy) ha_warning("cookie will be ignored for %s '%s' (needs 'mode http').\n", proxy_type_str(curproxy), curproxy->id); } - if (curproxy->monitor_uri != NULL) { + if (isttest(curproxy->monitor_uri)) { ha_warning("monitor-uri will be ignored for %s '%s' (needs 'mode http').\n", proxy_type_str(curproxy), curproxy->id); } @@ -1432,7 +1432,7 @@ void proxy_free_defaults(struct proxy *defproxy) ha_free(&defproxy->cookie_attrs); ha_free(&defproxy->lbprm.arg_str); ha_free(&defproxy->capture_name); - ha_free(&defproxy->monitor_uri); + 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; @@ -1707,9 +1707,8 @@ static int proxy_defproxy_cpy(struct proxy *curproxy, const struct proxy *defpro curproxy->timeout.tarpit = defproxy->timeout.tarpit; curproxy->timeout.httpreq = defproxy->timeout.httpreq; curproxy->timeout.httpka = defproxy->timeout.httpka; - if (defproxy->monitor_uri) - curproxy->monitor_uri = strdup(defproxy->monitor_uri); - curproxy->monitor_uri_len = defproxy->monitor_uri_len; + if (isttest(defproxy->monitor_uri)) + curproxy->monitor_uri = istdup(defproxy->monitor_uri); if (defproxy->defbe.name) curproxy->defbe.name = strdup(defproxy->defbe.name); -- 2.35.1