diff --git a/include/haproxy/qmux_http.h b/include/haproxy/qmux_http.h index 98151db16..a7dbe7cc3 100644 --- a/include/haproxy/qmux_http.h +++ b/include/haproxy/qmux_http.h @@ -12,8 +12,6 @@ size_t qcs_http_snd_buf(struct qcs *qcs, struct buffer *buf, size_t count, char *fin); size_t qcs_http_reset_buf(struct qcs *qcs, struct buffer *buf, size_t count); -void qcs_http_handle_standalone_fin(struct qcs *qcs); - #endif /* USE_QUIC */ #endif /* _HAPROXY_MUX_QUIC_HTTP_H */ diff --git a/src/h3.c b/src/h3.c index e686f0de0..d41a20c21 100644 --- a/src/h3.c +++ b/src/h3.c @@ -1036,8 +1036,19 @@ static ssize_t h3_decode_qcs(struct qcs *qcs, struct buffer *b, int fin) } if (!b_data(b) && fin && quic_stream_is_bidi(qcs->id)) { + struct buffer *appbuf; + struct htx *htx; + TRACE_PROTO("received FIN without data", H3_EV_RX_FRAME, qcs->qcc->conn, qcs); - qcs_http_handle_standalone_fin(qcs); + appbuf = qc_get_buf(qcs, &qcs->rx.app_buf); + BUG_ON(!appbuf); + + htx = htx_from_buf(appbuf); + if (!htx_set_eom(htx)) { + TRACE_ERROR("cannot set EOM", H3_EV_RX_FRAME, qcs->qcc->conn, qcs); + h3c->err = H3_INTERNAL_ERROR; + } + htx_to_buf(htx, appbuf); goto done; } diff --git a/src/hq_interop.c b/src/hq_interop.c index 175b92dec..cbbf47288 100644 --- a/src/hq_interop.c +++ b/src/hq_interop.c @@ -21,9 +21,20 @@ static ssize_t hq_interop_decode_qcs(struct qcs *qcs, struct buffer *b, int fin) size_t data = b_data(b); if (!data && fin) { + struct buffer *appbuf; + struct htx *htx; + /* FIN is notified with an empty STREAM frame. */ BUG_ON(!qcs->sd); /* sd must already be attached here */ - qcs_http_handle_standalone_fin(qcs); + + if (!(appbuf = qc_get_buf(qcs, &qcs->rx.app_buf))) + return -1; + + htx = htx_from_buf(appbuf); + if (!htx_set_eom(htx)) + return -1; + htx_to_buf(htx, appbuf); + return 0; } diff --git a/src/qmux_http.c b/src/qmux_http.c index 73b00389c..fc891dc53 100644 --- a/src/qmux_http.c +++ b/src/qmux_http.c @@ -110,25 +110,3 @@ size_t qcs_http_reset_buf(struct qcs *qcs, struct buffer *buf, size_t count) return count; } - -/* Utility function which can be used by app layer an empty STREAM frame is - * received with FIN bit set for stream. It will ensure that HTX EOM is - * properly inserted in app_buf. - */ -void qcs_http_handle_standalone_fin(struct qcs *qcs) -{ - struct buffer *appbuf; - struct htx *htx = NULL; - - appbuf = qc_get_buf(qcs, &qcs->rx.app_buf); - BUG_ON(!appbuf); - - htx = htx_from_buf(appbuf); - if (htx_is_empty(htx)) { - if (!htx_add_endof(htx, HTX_BLK_EOT)) { - ABORT_NOW(); /* cannot happen for empty HTX message. */ - } - } - htx->flags |= HTX_FL_EOM; - htx_to_buf(htx, appbuf); -}