diff --git a/include/haproxy/stream_interface.h b/include/haproxy/stream_interface.h index 9492e8279..a1f67c2dc 100644 --- a/include/haproxy/stream_interface.h +++ b/include/haproxy/stream_interface.h @@ -242,6 +242,15 @@ static inline int si_rx_blocked(const struct stream_interface *si) 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 3480e9620..7d9abdbbc 100644 --- a/src/http_ana.c +++ b/src/http_ana.c @@ -4060,8 +4060,10 @@ enum rule_result http_wait_for_msg_body(struct stream *s, struct channel *chn, /* 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 bbd5820b4..72b1cd37c 100644 --- a/src/tcp_rules.c +++ b/src/tcp_rules.c @@ -113,6 +113,7 @@ int tcp_inspect_request(struct stream *s, struct channel *req, int an_bit) */ 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 @@ int tcp_inspect_response(struct stream *s, struct channel *rep, int an_bit) * - 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