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) {