From 9d89ac8f42140e573b6d8afeb1c5722d7b2ae147 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Tue, 31 Oct 2017 17:15:59 +0100 Subject: [PATCH] MEDIUM: h2: skip the response trailers if any For now we don't build a HEADERS frame with them, but at least we remove them from the response so that the L7 chunk parser inside isn't blocked on these (often two) remaining bytes that don't want to leave the buffer. It also ensures that trailers delivered progressively will correctly be skipped. --- src/mux_h2.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/mux_h2.c b/src/mux_h2.c index 7b9c0bc5c..e0e2ebe57 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -2300,9 +2300,10 @@ static int h2s_frt_make_resp_data(struct h2s *h2s, struct buffer *buf) h2s->st = H2_SS_HLOC; else h2s->st = H2_SS_CLOSED; - /* no trailers for now, we must consume them (whatever remains in the buffer) */ - bo_del(buf, buf->o); - h1m->state = HTTP_MSG_DONE; + + if (!(h1m->flags & H1_MF_CHNK)) + h1m->state = HTTP_MSG_DONE; + h2s->flags |= H2_SF_ES_SENT; } @@ -2337,6 +2338,20 @@ static int h2_snd_buf(struct conn_stream *cs, struct buffer *buf, int flags) if (h2s->flags & H2_SF_BLK_ANY) break; } + else if (h2s->res.state == HTTP_MSG_TRAILERS) { + /* consume the trailers if any (we don't forward them for now) */ + int count = h1_measure_trailers(buf); + + if (unlikely(count <= 0)) { + if (count < 0) + h2s_error(h2s, H2_ERR_INTERNAL_ERROR); + break; + } + total += count; + bo_del(buf, count); + h2s->res.state = HTTP_MSG_DONE; + break; + } else { cs->flags |= CS_FL_ERROR; break;