BUG/MEDIUM: stream: Stop waiting for more data if SI is blocked on RXBLK_ROOM

If the stream-interface is waiting for more buffer room to store incoming
data, it is important at the stream level to stop to wait for more data to
continue. Thanks to the previous patch ("BUG/MEDIUM: stream-int: Notify
stream that the mux wants more room to xfer data"), the stream is woken up
when this happens. In this patch, we take care to interrupt the
corresponding tcp-content ruleset or to stop waiting for the HTTP message
payload.

To ease detection of the state, si_rx_blocked_room() helper function has
been added. It returns non-zero if the stream interface's Rx path is blocked
because of lack of room in the input buffer.

This patch is part of a series related to the issue #1362. It should be
backported as ar as 2.0, probably with some adaptations. So be careful
during backports.

(cherry picked from commit 7833596ff42d5f5ba2e9f639b9698cec16613058)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
diff --git a/include/haproxy/stream_interface.h b/include/haproxy/stream_interface.h
index cd26a51..b4d8552 100644
--- a/include/haproxy/stream_interface.h
+++ b/include/haproxy/stream_interface.h
@@ -242,6 +242,15 @@
 	return !!(si->flags & SI_FL_RXBLK_ANY);
 }
 
+
+/* Returns non-zero if the stream interface's Rx path is blocked because of lack
+ * of room in the input buffer.
+ */
+static inline int si_rx_blocked_room(const struct stream_interface *si)
+{
+	return !!(si->flags & SI_FL_RXBLK_ROOM);
+}
+
 /* Returns non-zero if the stream interface's endpoint is ready to receive */
 static inline int si_rx_endp_ready(const struct stream_interface *si)
 {
diff --git a/src/http_ana.c b/src/http_ana.c
index c836431..76d14a7 100644
--- a/src/http_ana.c
+++ b/src/http_ana.c
@@ -4112,8 +4112,10 @@
 	/* Now we're in HTTP_MSG_DATA. We just need to know if all data have
 	 * been received or if the buffer is full.
 	 */
-	if ((htx->flags & HTX_FL_EOM) || htx_get_tail_type(htx) > HTX_BLK_DATA ||
-	    channel_htx_full(chn, htx, global.tune.maxrewrite))
+	if ((htx->flags & HTX_FL_EOM) ||
+	    htx_get_tail_type(htx) > HTX_BLK_DATA ||
+	    channel_htx_full(chn, htx, global.tune.maxrewrite) ||
+	    si_rx_blocked_room(chn_prod(chn)))
 		goto end;
 
 	if (bytes) {
diff --git a/src/tcp_rules.c b/src/tcp_rules.c
index bbd5820..72b1cd3 100644
--- a/src/tcp_rules.c
+++ b/src/tcp_rules.c
@@ -113,6 +113,7 @@
 	 */
 
 	if ((req->flags & CF_SHUTR) || channel_full(req, global.tune.maxrewrite) ||
+	    si_rx_blocked_room(chn_prod(req)) ||
 	    !s->be->tcp_req.inspect_delay || tick_is_expired(s->rules_exp, now_ms))
 		partial = SMP_OPT_FINAL;
 	else
@@ -268,6 +269,7 @@
 	 * - if one rule returns KO, then return KO
 	 */
 	if ((rep->flags & CF_SHUTR) || channel_full(rep, global.tune.maxrewrite) ||
+	    si_rx_blocked_room(chn_prod(rep)) ||
 	    !s->be->tcp_rep.inspect_delay || tick_is_expired(s->rules_exp, now_ms))
 		partial = SMP_OPT_FINAL;
 	else