]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: mux-quic: Don't expect data from server as long as request is unfinished
authorChristopher Faulet <cfaulet@haproxy.com>
Thu, 23 Feb 2023 13:52:09 +0000 (14:52 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Mon, 27 Feb 2023 16:45:45 +0000 (17:45 +0100)
As for the H1 and H2 stream, the QUIC stream now states it does not expect
data from the server as long as the request is unfinished. The aim is the
same. We must be sure to not trigger a read timeout on server side if the
client is still uploading data.

From the moment the end of the request is received and forwarded to upper
layer, the QUIC stream reports it expects to receive data from the opposite
endpoint. This re-enables read timeout on the server side.

include/haproxy/mux_quic.h
src/mux_quic.c

index 1d5b962c0ab8aa3613ed1124eaf6a3005807e139..44862317bcd6d054fbf47e1e71a516eda4a63ec4 100644 (file)
@@ -98,6 +98,7 @@ static inline struct stconn *qc_attach_sc(struct qcs *qcs, struct buffer *buf)
        qcs->sd->se   = qcs;
        qcs->sd->conn = qcc->conn;
        se_fl_set(qcs->sd, SE_FL_T_MUX | SE_FL_ORPHAN | SE_FL_NOT_FIRST);
+       se_expect_no_data(qcs->sd);
 
        /* TODO duplicated from mux_h2 */
        sess->t_idle = tv_ms_elapsed(&sess->tv_accept, &now) - sess->t_handshake;
index a78f8d4a483eb58447361862090ef89304e3fd61..a1cb6671703c3b28a2b2dd035875af0f83263416 100644 (file)
@@ -2423,9 +2423,15 @@ static size_t qc_recv_buf(struct stconn *sc, struct buffer *buf,
                        se_fl_set(qcs->sd, SE_FL_ERROR);
 
                /* Set end-of-input if FIN received and all data extracted. */
-               if (fin)
+               if (fin) {
                        se_fl_set(qcs->sd, SE_FL_EOI);
 
+                       /* If request EOM is reported to the upper layer, it means the
+                        * QCS now expects data from the opposite side.
+                        */
+                       se_expect_data(qcs->sd);
+               }
+
                if (b_size(&qcs->rx.app_buf)) {
                        b_free(&qcs->rx.app_buf);
                        offer_buffers(NULL, 1);