The commit
744451c7c ("BUG/MEDIUM: mux-h1: Properly detect full buffer cases
during message parsing") introduced a regression if trailers are not
received in one time. Indeed, in this case, nothing is appended in the
channel buffer, while there are some data in the input buffer. In this case,
we must not request more room to the upper layer, especially because the
channel buffer can be empty.
To fix the issue, on trailers parsing, we consider the H1 stream as
congested when the max size allowed is reached. Of course, the H1 stream is
also considered as congested if the trailers are too big and the channel
buffer is not empty.
This patch should fix the issue #1657. It must be backported as far as 2.0.
(cherry picked from commit
ae660be547eb72b5c213d87769e60c527fe6b7cd)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit
ce029039bc13f5896ad8fea3084a4e821ce2efa7)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit
5d0efb7d523dff64c34320f36082b3ff04e096e2)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
struct h1m tlr_h1m;
int ret = 0;
- if (!max || !b_data(srcbuf))
+ if (b_data(srcbuf) == ofs) {
+ /* Nothing to parse */
goto end;
+ }
+ if (!max) {
+ /* No more room */
+ goto output_full;
+ }
/* Realing input buffer if necessary */
if (b_peek(srcbuf, ofs) > b_tail(srcbuf))
TRACE_STATE("parsing error", H1_EV_RX_DATA|H1_EV_RX_TLRS|H1_EV_H1S_ERR, h1s->h1c->conn, h1s);
h1_capture_bad_message(h1s->h1c, h1s, h1m, buf);
}
- else if (ret == -2 || b_data(buf) != *ofs) {
+ else if (ret == -2) {
TRACE_STATE("RX path congested, waiting for more space", H1_EV_RX_DATA|H1_EV_RX_TLRS|H1_EV_H1S_BLK, h1s->h1c->conn, h1s);
h1s->flags |= H1S_F_RX_CONGESTED;
}