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