From db72da0432d1f032761c386a9b68cd2268dc4bf8 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 13 Sep 2018 11:52:20 +0200 Subject: [PATCH] BUG/MINOR: h1: don't consider the status for each header While it was possible to consider the status before parsing response headers, it's wrong to do it for request headers and could lead to random behaviours due to this status matching other fields instead. Additionnally there is little to no value in doing this for each and every new header field. It's much better to reset the content-length at once in the callerwhen seeing such statuses (which currently is only the H2 mux). No backport is needed, this is purely 1.9. --- src/h1.c | 9 +-------- src/mux_h2.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/h1.c b/src/h1.c index 47af9be32..7a81c5099 100644 --- a/src/h1.c +++ b/src/h1.c @@ -1224,14 +1224,7 @@ int h1_headers_to_hdr_list(char *start, const char *stop, http_set_hdr(&hdr[hdr_count++], n, v); - if (sl.st.status >= 100 && sl.st.status < 200) - h1m->curr_len = h1m->body_len = 0; - else if (sl.st.status == 304 || sl.st.status == 204) { - /* no contents, claim c-len is present and set to zero */ - h1m->flags |= H1_MF_CLEN; - h1m->curr_len = h1m->body_len = 0; - } - else if (isteqi(n, ist("transfer-encoding"))) { + if (isteqi(n, ist("transfer-encoding"))) { h1m->flags &= ~H1_MF_CLEN; h1m->flags |= H1_MF_CHNK; } diff --git a/src/mux_h2.c b/src/mux_h2.c index 8d63ccde1..616038118 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -3140,6 +3140,21 @@ static size_t h2s_frt_make_resp_headers(struct h2s *h2s, const struct buffer *bu } h2s->status = sl.st.status; + + /* certain statuses have no body or an empty one, regardless of + * what the headers say. + */ + if (sl.st.status >= 100 && sl.st.status < 200) { + h1m->flags &= ~(H1_MF_CLEN | H1_MF_CHNK); + h1m->curr_len = h1m->body_len = 0; + } + else if (sl.st.status == 204 || sl.st.status == 304) { + /* no contents, claim c-len is present and set to zero */ + h1m->flags &= ~H1_MF_CHNK; + h1m->flags |= H1_MF_CLEN; + h1m->curr_len = h1m->body_len = 0; + } + chunk_reset(&outbuf); while (1) {