]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: mux-h1: Force close mode for proxy responses with an unfinished request
authorChristopher Faulet <cfaulet@haproxy.com>
Wed, 16 Oct 2019 07:41:07 +0000 (09:41 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Wed, 16 Oct 2019 08:03:12 +0000 (10:03 +0200)
When a response generated by HAProxy is handled by the mux H1, if the
corresponding request has not fully been received, the close mode is
forced. Thus, the client is notified the connection will certainly be closed
abruptly, without waiting the end of the request.

src/mux_h1.c

index b9b78f0b6777ce9bb993bbac92b0313b816210d6..e28e86b74353e43382247a48fb6cfe7f905d599d 100644 (file)
@@ -1671,9 +1671,14 @@ static size_t h1_process_output(struct h1c *h1c, struct buffer *buf, size_t coun
                          last_lf:
                                h1m->state = H1_MSG_LAST_LF;
                                if (!(h1s->flags & H1S_F_HAVE_O_CONN)) {
-                                       /* There is no "Connection:" header and
-                                        * it the conn_mode must be
-                                        * processed. So do it */
+                                       /* If the reply comes from haproxy while the request is
+                                        * not finished, we force the connection close. */
+                                       if ((chn_htx->flags & HTX_FL_PROXY_RESP) && h1s->req.state != H1_MSG_DONE) {
+                                               h1s->flags = (h1s->flags & ~H1S_F_WANT_MSK) | H1S_F_WANT_CLO;
+                                               TRACE_STATE("force close mode (resp)", H1_EV_TX_DATA|H1_EV_TX_HDRS, h1s->h1c->conn, h1s);
+                                       }
+
+                                       /* the conn_mode must be processed. So do it */
                                        n = ist("connection");
                                        v = ist("");
                                        h1_process_output_conn_mode(h1s, h1m, &v);