From 1d5ec0944f3a9204a56ca5978a062f27a6f0d98d Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Wed, 26 Jun 2019 14:23:54 +0200 Subject: [PATCH] BUG/MEDIUM: proto_htx: Don't add EOM on 1xx informational messages Since the commit b75b5eaf ("MEDIUM: htx: 1xx messages are now part of the final reponses"), these messages are part of the response and should not contain EOM. This block is skipped during responses parsing, but analyzers still add it for "100-Continue" and "103-Eraly-Hints". It can also be added for error files with 1xx status code. Now, when HAProxy generate such transitional responses, it does not emit EOM blocks. And informational messages are now forbidden in error files. This patch must be backported to 2.0. --- src/http_htx.c | 5 +++++ src/proto_htx.c | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/http_htx.c b/src/http_htx.c index bc26e5ba4..cd19d8f8b 100644 --- a/src/http_htx.c +++ b/src/http_htx.c @@ -629,6 +629,9 @@ static struct htx *http_str_to_htx(struct buffer *buf, struct ist raw) ((*(h1sl.st.v.ptr + 5) == '1') && (*(h1sl.st.v.ptr + 7) >= '1'))) h1m.flags |= H1_MF_VER_11; + if (h1sl.st.status < 200 && (h1sl.st.status == 100 || h1sl.st.status >= 102)) + goto error; + if (h1m.flags & H1_MF_VER_11) flags |= HTX_SL_F_VER_11; if (h1m.flags & H1_MF_XFER_ENC) @@ -656,8 +659,10 @@ static struct htx *http_str_to_htx(struct buffer *buf, struct ist raw) goto error; ret += sent; } + if (!htx_add_endof(htx, HTX_BLK_EOM)) goto error; + return htx; error: diff --git a/src/proto_htx.c b/src/proto_htx.c index d821e38cc..6cbd33b9b 100644 --- a/src/proto_htx.c +++ b/src/proto_htx.c @@ -2650,7 +2650,7 @@ static int htx_reply_103_early_hints(struct channel *res) struct htx *htx = htx_from_buf(&res->buf); size_t data; - if (!htx_add_endof(htx, HTX_BLK_EOH) || !htx_add_endof(htx, HTX_BLK_EOM)) { + if (!htx_add_endof(htx, HTX_BLK_EOH)) { /* If an error occurred during an Early-hint rule, * remove the incomplete HTTP 103 response from the * buffer */ @@ -5443,7 +5443,7 @@ static int htx_reply_100_continue(struct stream *s) goto fail; sl->info.res.status = 100; - if (!htx_add_endof(htx, HTX_BLK_EOH) || !htx_add_endof(htx, HTX_BLK_EOM)) + if (!htx_add_endof(htx, HTX_BLK_EOH)) goto fail; data = htx->data - co_data(res); -- 2.47.3