diff --git a/include/haproxy/mux_quic.h b/include/haproxy/mux_quic.h index 1d5b962c0..44862317b 100644 --- a/include/haproxy/mux_quic.h +++ b/include/haproxy/mux_quic.h @@ -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; diff --git a/src/mux_quic.c b/src/mux_quic.c index a78f8d4a4..a1cb66717 100644 --- a/src/mux_quic.c +++ b/src/mux_quic.c @@ -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);