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.
This commit is contained in:
Amaury Denoyelle 2022-08-17 18:02:47 +02:00
parent d23435df28
commit 115ccce867

View File

@ -22,6 +22,7 @@
#include <haproxy/h3.h> #include <haproxy/h3.h>
#include <haproxy/h3_stats.h> #include <haproxy/h3_stats.h>
#include <haproxy/http.h> #include <haproxy/http.h>
#include <haproxy/http_htx.h>
#include <haproxy/htx.h> #include <haproxy/htx.h>
#include <haproxy/intops.h> #include <haproxy/intops.h>
#include <haproxy/istbuf.h> #include <haproxy/istbuf.h>
@ -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 scheme = IST_NULL, authority = IST_NULL;
struct ist authority = IST_NULL; struct ist authority = IST_NULL;
int hdr_idx, ret; int hdr_idx, ret;
int cookie = -1, last_cookie = -1;
TRACE_ENTER(H3_EV_RX_FRAME|H3_EV_RX_HDR, qcs->qcc->conn, qcs); 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(""))) if (isteq(list[hdr_idx].n, ist("")))
break; 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(":"))) if (!istmatch(list[hdr_idx].n, ist(":")))
htx_add_header(htx, list[hdr_idx].n, list[hdr_idx].v); htx_add_header(htx, list[hdr_idx].n, list[hdr_idx].v);
++hdr_idx; ++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_add_endof(htx, HTX_BLK_EOH);
htx_to_buf(htx, &htx_buf); htx_to_buf(htx, &htx_buf);