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.
diff --git a/src/h1.c b/src/h1.c
index 47af9be..7a81c50 100644
--- a/src/h1.c
+++ b/src/h1.c
@@ -1224,14 +1224,7 @@
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 8d63ccd..6160381 100644
--- a/src/mux_h2.c
+++ b/src/mux_h2.c
@@ -3140,6 +3140,21 @@
}
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) {