From: Olivier Houchard Date: Wed, 25 Mar 2020 11:24:11 +0000 (+0100) Subject: BUG/MEDIUM: mux_h1: Process a new request if we already received it. X-Git-Tag: v2.2-dev6~81 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=69664419d209d2f64dbcd90f991e7ec2efff2ee2;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: mux_h1: Process a new request if we already received it. In h1_detach(), if our input buffer isn't empty, don't just subscribe(), we may hold a new request, and there's nothing left to read. Instead, call h1_process() directly, so that a new stream is created. Failure to do so means if we received the new request to early, the connecetion will just hang, as it happens when using svn. --- diff --git a/src/mux_h1.c b/src/mux_h1.c index 27b1cb674b..c1eefe2b8c 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -2491,7 +2491,11 @@ static void h1_detach(struct conn_stream *cs) h1_release(h1c); } else { - h1c->conn->xprt->subscribe(h1c->conn, h1c->conn->xprt_ctx, SUB_RETRY_RECV, &h1c->wait_event); + /* If we have a new request, process it immediately */ + if (unlikely(b_data(&h1c->conn))) + h1_process(h1c); + else + h1c->conn->xprt->subscribe(h1c->conn, h1c->conn->xprt_ctx, SUB_RETRY_RECV, &h1c->wait_event); if (h1c->task) { h1c->task->expire = TICK_ETERNITY; if (b_data(&h1c->obuf)) {