]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: mux-h1: Properly handle http-request and http-keep-alive timeouts
authorChristopher Faulet <cfaulet@haproxy.com>
Tue, 7 Nov 2023 17:36:02 +0000 (18:36 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Wed, 8 Nov 2023 15:38:06 +0000 (16:38 +0100)
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

index 918005573030afb9eaf58a5ad1f832299aba3bfd..7ee61c393969270c7b5bc85783c1cb499d2e0328 100644 (file)
@@ -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);