From ad1ef94612fb6cba5b68f7d19c4646491b6da4af Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Fri, 6 Sep 2024 08:46:04 +0200 Subject: [PATCH] MINOR: mux-h1: Set EOI on SE during demux when both side are in DONE state For now, this case is already handled for all requests except for those waiting for a tunnel establishment (CONNECT and protocol upgrades). It is not an issue because only bodyless requests are supported in these cases. So the request is always finished at the end of headers and therefore before the response. However, to relax conditions for full H1 protocol upgrades (H1 client and server), this case will be necessary. Indeed, the idea is to be able to perform protocol upgrades for requests with a payload. Today, the "Upgrade:" header is removed before sending the request to the server. But to support this case, this patch is required to properly finish transaction when the server does not perform the upgrade. --- src/mux_h1.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/mux_h1.c b/src/mux_h1.c index 13066ced6..88523a991 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -2228,13 +2228,15 @@ static size_t h1_process_demux(struct h1c *h1c, struct buffer *buf, size_t count /* Set EOI on stream connector in DONE state iff: * - it is a response + * - it is a request and the response is DONE too * - it is a request but no a protocol upgrade nor a CONNECT * * If not set, Wait the response to do so or not depending on the status * code. */ - if (((h1m->state == H1_MSG_DONE) && (h1m->flags & H1_MF_RESP)) || - ((h1m->state == H1_MSG_DONE) && (h1s->meth != HTTP_METH_CONNECT) && !(h1m->flags & H1_MF_CONN_UPG))) + if ((h1m->state == H1_MSG_DONE) && ((h1m->flags & H1_MF_RESP) || + (h1s->res.state == H1_MSG_DONE) || + ((h1s->meth != HTTP_METH_CONNECT) && !(h1m->flags & H1_MF_CONN_UPG)))) se_fl_set(h1s->sd, SE_FL_EOI); out: