BUG/MEDIUM: mux-h1; Ignore headers modifications about payload representation

We now ignore modifications during the message analysis about the payload
representation if only headers are updated and not meta-data. It means a C-L
header removed to add a T-E one or the opposite via HTTP actions. This kind
of changes are ignored because it is extremly hard to be sure the payload
will be properly formatted.

It is an issue since the HTX was introduced and it was never reported. Thus,
there is no reason to backport this patch for now. It relies on following commits:

  * MINOR: mux-h1: Add flags if outgoing msg contains a header about its payload
  * MINOR: mux-h1: Rely on H1S_F_HAVE_CHNK to add T-E in outgoing messages
  * BUG/MEDIUM: mux-h1: Add C-L header in outgoing message if it was removed
This commit is contained in:
Christopher Faulet 2023-10-02 08:52:13 +02:00
parent c43742c188
commit f89ba27caa
1 changed files with 22 additions and 3 deletions

View File

@ -2027,8 +2027,12 @@ static size_t h1_make_reqline(struct h1s *h1s, struct h1m *h1m, struct htx *htx,
h1_parse_req_vsn(h1m, sl);
h1m->flags |= H1_MF_XFER_LEN;
if (sl->flags & HTX_SL_F_BODYLESS)
if (sl->flags & HTX_SL_F_CHNK)
h1m->flags |= H1_MF_CHNK;
else if (sl->flags & HTX_SL_F_CLEN)
h1m->flags |= H1_MF_CLEN;
if (sl->flags & HTX_SL_F_XFER_ENC)
h1m->flags |= H1_MF_XFER_ENC;
if (sl->flags & HTX_SL_F_BODYLESS) {
h1m->flags = (h1m->flags & ~H1_MF_CHNK) | H1_MF_CLEN;
@ -2107,8 +2111,15 @@ static size_t h1_make_stline(struct h1s *h1s, struct h1m *h1m, struct htx *htx,
h1s->status = sl->info.res.status;
h1_parse_res_vsn(h1m, sl);
if (sl->flags & HTX_SL_F_XFER_LEN)
if (sl->flags & HTX_SL_F_XFER_LEN) {
h1m->flags |= H1_MF_XFER_LEN;
if (sl->flags & HTX_SL_F_CHNK)
h1m->flags |= H1_MF_CHNK;
else if (sl->flags & HTX_SL_F_CLEN)
h1m->flags |= H1_MF_CLEN;
if (sl->flags & HTX_SL_F_XFER_ENC)
h1m->flags |= H1_MF_XFER_ENC;
}
if (h1s->status < 200)
h1s->flags |= H1S_F_HAVE_O_CONN;
else if ((sl->flags & HTX_SL_F_BODYLESS_RESP) || h1s->status == 204 || h1s->status == 304)
@ -2175,6 +2186,8 @@ static size_t h1_make_headers(struct h1s *h1s, struct h1m *h1m, struct htx *htx,
if (isteq(n, ist("transfer-encoding"))) {
if ((h1m->flags & H1_MF_RESP) && (h1s->status < 200 || h1s->status == 204))
goto nextblk;
if (!(h1m->flags & H1_MF_CHNK))
goto nextblk;
if (h1_parse_xfer_enc_header(h1m, v) < 0)
goto error;
h1s->flags |= H1S_F_HAVE_CHNK;
@ -2182,9 +2195,15 @@ static size_t h1_make_headers(struct h1s *h1s, struct h1m *h1m, struct htx *htx,
else if (isteq(n, ist("content-length"))) {
if ((h1m->flags & H1_MF_RESP) && (h1s->status < 200 || h1s->status == 204))
goto nextblk;
if (!(h1m->flags & H1_MF_CLEN))
goto nextblk;
if (!(h1s->flags & H1S_F_HAVE_CLEN))
h1m->flags &= ~H1_MF_CLEN;
/* Only skip C-L header with invalid value. */
if (h1_parse_cont_len_header(h1m, &v) < 0)
goto nextblk; // FIXME: must be handled as an error
goto error;
if (h1s->flags & H1S_F_HAVE_CLEN)
goto nextblk;
h1s->flags |= H1S_F_HAVE_CLEN;
}
else if (isteq(n, ist("connection"))) {