From: Christopher Faulet Date: Thu, 11 Oct 2018 13:29:21 +0000 (+0200) Subject: MEDIUM: stream-int: Try to read data even if channel's buffer seems to be full X-Git-Tag: v1.9-dev6~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4eb7d745e26434b08eaf91e6448bec64788f04e2;p=thirdparty%2Fhaproxy.git MEDIUM: stream-int: Try to read data even if channel's buffer seems to be full Before calling the mux to get incoming data, we get the amount of space available at the input of the buffer. If there is no space, we don't try to read more data. This is good enough when raw data are stored in the buffer. But this info has no meaning when structured data are stored. Because with the HTTP refactoring, such kind of data will be stored in buffers, it is a bit annoying. So, to avoid any problems, we always call the mux. It is the mux's responsiblity to notify the stream interface it needs more space to store more data. This must be done by setting the flag CS_FL_RCV_MORE on the conn_stream. This is exactly what we do in the pass-through mux when is null. --- diff --git a/src/mux_pt.c b/src/mux_pt.c index beca8c2ea6..4195ec2505 100644 --- a/src/mux_pt.c +++ b/src/mux_pt.c @@ -116,6 +116,11 @@ static size_t mux_pt_rcv_buf(struct conn_stream *cs, struct buffer *buf, size_t { size_t ret; + if (!count) { + cs->flags |= CS_FL_RCV_MORE; + return 0; + } + cs->flags &= ~CS_FL_RCV_MORE; ret = cs->conn->xprt->rcv_buf(cs->conn, buf, count, flags); if (conn_xprt_read0_pending(cs->conn)) cs->flags |= CS_FL_EOS; diff --git a/src/stream_interface.c b/src/stream_interface.c index 46fc9ebf1c..65d2c6120c 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -1226,13 +1226,11 @@ int si_cs_recv(struct conn_stream *cs) */ while (!(conn->flags & (CO_FL_ERROR | CO_FL_WAIT_ROOM | CO_FL_HANDSHAKE)) && !(cs->flags & (CS_FL_ERROR|CS_FL_EOS)) && !(ic->flags & CF_SHUTR)) { + /* may be null. This is the mux responsibility to set + * CS_FL_RCV_MORE on the CS if more space is needed. + */ max = channel_recv_max(ic); - if (!max) { - si_cant_put(si); - break; - } - ret = cs->conn->mux->rcv_buf(cs, &ic->buf, max, co_data(ic) ? CO_RFL_BUF_WET : 0); if (cs->flags & CS_FL_RCV_MORE) si_cant_put(si);