BUG/MEDIUM: mux-h1: Be able to handle trailers when C-L header was specified

The commit 2eb5243e7 ("BUG/MEDIUM: mux-h1: Set outgoing message to DONE when
payload length is reached") introduced a regression. An internal error is
reported when we try to forward a message with trailers while the
content-length header was specified. Indeed, this case does not exist for H1
messages but it is possible in H2.

This patch should solve the issue #1684. It must be backported as far as
2.4.
This commit is contained in:
Christopher Faulet 2022-05-05 09:39:42 +02:00
parent 2db904e86c
commit d934e8d963

View File

@ -2464,13 +2464,8 @@ static size_t h1_process_mux(struct h1c *h1c, struct buffer *buf, size_t count)
trailers:
h1m->state = H1_MSG_TRAILERS;
/* If the message is not chunked, ignore
* trailers. It may happen with H2 messages. */
if (!(h1m->flags & H1_MF_CHNK)) {
if (type == HTX_BLK_EOT)
goto done;
break;
}
if (!(h1m->flags & H1_MF_CHNK))
goto done;
if ((h1m->flags & H1_MF_RESP) && (h1s->flags & H1S_F_BODYLESS_RESP)) {
TRACE_PROTO("Skip trailers for bodyless response", H1_EV_TX_DATA|H1_EV_TX_BODY, h1c->conn, h1s, chn_htx);
@ -2499,15 +2494,15 @@ static size_t h1_process_mux(struct h1c *h1c, struct buffer *buf, size_t count)
break;
case H1_MSG_DONE:
/* If the message is not chunked, ignore
* trailers. It may happen with H2 messages. */
if ((type == HTX_BLK_TLR || type == HTX_BLK_EOT) && !(h1m->flags & H1_MF_CHNK))
break;
TRACE_STATE("unexpected data xferred in done state", H1_EV_TX_DATA|H1_EV_H1C_ERR|H1_EV_H1S_ERR, h1c->conn, h1s);
goto error; /* For now return an error */
done:
if (!(chn_htx->flags & HTX_FL_EOM) && (!(h1m->flags & H1_MF_CLEN) || h1m->curr_len)) {
TRACE_STATE("No EOM flags in done state", H1_EV_TX_DATA|H1_EV_H1C_ERR|H1_EV_H1S_ERR, h1c->conn, h1s);
goto error; /* For now return an error */
}
h1m->state = H1_MSG_DONE;
if (!(h1m->flags & H1_MF_RESP) && h1s->meth == HTTP_METH_CONNECT) {
h1s->flags |= H1S_F_TX_BLK;