From: Amaury Denoyelle Date: Wed, 17 Aug 2022 16:02:47 +0000 (+0200) Subject: MEDIUM: h3: concatenate multiple cookie headers X-Git-Tag: v2.7-dev4~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=115ccce867c76723f99472f92b1e58d5c6ea4865;p=thirdparty%2Fhaproxy.git MEDIUM: h3: concatenate multiple cookie headers As specified by RFC 9114, multiple cookie headers must be concatenated into a single entry before passing it to a HTTP/1.1 connection. To implement this, reuse the same function as already used for HTTP/2 module. This should answer to feature requested in github issue #1818. --- diff --git a/src/h3.c b/src/h3.c index ea24fe8cd7..53372c5e3e 100644 --- a/src/h3.c +++ b/src/h3.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -346,6 +347,7 @@ static ssize_t h3_headers_to_htx(struct qcs *qcs, const struct buffer *buf, //struct ist scheme = IST_NULL, authority = IST_NULL; struct ist authority = IST_NULL; int hdr_idx, ret; + int cookie = -1, last_cookie = -1; TRACE_ENTER(H3_EV_RX_FRAME|H3_EV_RX_HDR, qcs->qcc->conn, qcs); @@ -409,12 +411,24 @@ static ssize_t h3_headers_to_htx(struct qcs *qcs, const struct buffer *buf, if (isteq(list[hdr_idx].n, ist(""))) break; + if (isteq(list[hdr_idx].n, ist("cookie"))) { + http_cookie_register(list, hdr_idx, &cookie, &last_cookie); + continue; + } + if (!istmatch(list[hdr_idx].n, ist(":"))) htx_add_header(htx, list[hdr_idx].n, list[hdr_idx].v); ++hdr_idx; } + if (cookie >= 0) { + if (http_cookie_merge(htx, list, cookie)) { + h3c->err = H3_INTERNAL_ERROR; + return -1; + } + } + htx_add_endof(htx, HTX_BLK_EOH); htx_to_buf(htx, &htx_buf);