From 2c9c2f9d77b9dac5a32d33838c5bca67f61fb1f5 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Tue, 7 Nov 2023 18:36:02 +0100 Subject: [PATCH] BUG/MINOR: mux-h1: Properly handle http-request and http-keep-alive timeouts It is now the turn for the H1 mux to be fix to properly handle http-request and http-keep-alive timeouts. It is quite surprising but it is broken since the 2.2. For idle connections on client side, the smallest value between the client timeout and the http-request/http-keep-alive timeout is used while the client timeout should only be used if other ones are not defined. So, if the client timeout is the smallest value, the keep-alive timeout is not respected. It is only an issue for idle client connections. The http-request timeout is respected from the moment part of the next request was received. This patch should fix the issue #2334. It must be backported as far as 2.2. But be careful during the backports. The H1 mux had evolved a lot since the 2.2. --- src/mux_h1.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/mux_h1.c b/src/mux_h1.c index 918005573..7ee61c393 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -573,6 +573,12 @@ static void h1_refresh_timeout(struct h1c *h1c) h1c->task->expire = tick_add(now_ms, h1c->timeout); TRACE_DEVEL("refreshing connection's timeout (pending outgoing data)", H1_EV_H1C_SEND|H1_EV_H1C_RECV, h1c->conn); } + else if (!(h1c->flags & H1C_F_IS_BACK) && (h1c->state == H1_CS_IDLE)) { + /* idle front connections. */ + h1c->task->expire = (tick_isset(h1c->idle_exp) ? h1c->idle_exp : tick_add(now_ms, h1c->timeout)); + TRACE_DEVEL("refreshing connection's timeout (idle front h1c)", H1_EV_H1C_SEND|H1_EV_H1C_RECV, h1c->conn); + is_idle_conn = 1; + } else if (!(h1c->flags & H1C_F_IS_BACK) && (h1c->state != H1_CS_RUNNING)) { /* alive front connections waiting for a fully usable stream need a timeout. */ h1c->task->expire = tick_add(now_ms, h1c->timeout);