From db6ff84d840e3fb24218bb5c79c151b45d7857c2 Mon Sep 17 00:00:00 2001 From: Frederic Lecaille Date: Thu, 21 May 2026 07:32:11 +0200 Subject: [PATCH] to be merged: support again h2c after recent haproxy changes -- server "proto h2c" could not be used anymore h2c is not an ALPN identifier, this is a protocol --- include/haproxy/haload.h | 2 ++ src/haload.c | 8 ++++++-- src/haload_init.c | 40 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/include/haproxy/haload.h b/include/haproxy/haload.h index b91a78480..04769913e 100644 --- a/include/haproxy/haload.h +++ b/include/haproxy/haload.h @@ -14,10 +14,12 @@ struct hld_path { struct hld_url_cfg { int ssl; + int h2c; char *addr; char *raw_addr; // used only to set the host header value char *srv_opts; char *tls_opts; + char *alpn; struct server *srv; struct hld_path *paths; struct hld_url_cfg *next; diff --git a/src/haload.c b/src/haload.c index 58904e7e7..ab8dd113a 100644 --- a/src/haload.c +++ b/src/haload.c @@ -1765,8 +1765,12 @@ static int hld_cfg_finalize(void) } } - if (!srv->mux_proto && srv_is_quic(srv)) - srv->mux_proto = get_mux_proto(ist("quic")); + if (!srv->mux_proto) { + if (srv_is_quic(srv)) + srv->mux_proto = get_mux_proto(ist("quic")); + else if (cfg->h2c) + srv->mux_proto = get_mux_proto(ist("h2")); + } if (srv->mux_proto) { int proto_mode = conn_pr_mode_to_proto_mode(hld_proxy.mode); diff --git a/src/haload_init.c b/src/haload_init.c index 83c945ed0..e6f866178 100644 --- a/src/haload_init.c +++ b/src/haload_init.c @@ -11,7 +11,8 @@ static int hld_debug; struct hld_url_cfg *hld_url_cfgs; -char *srv_opts, *tls_ciphers, *tls_ciphersuites, *tls_curves; +char *srv_opts, *tls_ciphers, *tls_ciphersuites, *tls_curves, *alpn; +int h2c; static void hld_usage(char *name, int argc, int line) { @@ -245,9 +246,21 @@ static struct hld_url_cfg *hld_alloc_url(char *url) !hld_add_opt_to_buf(&opts_buf, "curves", tls_curves)) goto err; + if (alpn && !h2c && + !hld_add_opt_to_buf(&opts_buf, "alpn", alpn)) + goto err; + if (!hbuf_is_null(&opts_buf)) hld_url_cfg->tls_opts = strdup(opts_buf.area); + if (alpn && !h2c) { + hld_url_cfg->alpn = strdup(alpn); + if (!hld_url_cfg->alpn) + goto err; + } + + hld_url_cfg->h2c = h2c; + free_hbuf(&opts_buf); hld_url_cfg->srv = NULL; hld_url_cfg->paths = p; @@ -415,6 +428,31 @@ void haproxy_init_args(int argc, char **argv) else hld_usage(progname, argc, __LINE__); } + else if (strcmp(opt, "0") == 0 || + strcmp(opt, "h0") == 0) { + alpn = "hq-interop"; + h2c = 0; + } + else if (strcmp(opt, "1") == 0 || + strcmp(opt, "h1") == 0) { + alpn = "h1"; + h2c = 0; + } + else if (strcmp(opt, "2") == 0 || + strcmp(opt, "h2") == 0) { + alpn = "h2"; + h2c = 0; + } + else if (strcmp(opt, "2c") == 0 || + strcmp(opt, "h2c") == 0) { + alpn = "h2c"; + h2c = 1; + } + else if (strcmp(opt, "3") == 0 || + strcmp(opt, "h3") == 0) { + alpn = "h3"; + h2c = 0; + } else if (*opt == 'd') { opt++; hld_parse_long(&arg_dura, opt, &argc, &argv);