BUG/MINOR: http-check: Don't pretend a C-L heeader is set before adding it
authorChristopher Faulet <cfaulet@haproxy.com>
Mon, 3 Feb 2025 17:36:17 +0000 (18:36 +0100)
committerWilly Tarreau <w@1wt.eu>
Thu, 20 Mar 2025 10:30:03 +0000 (11:30 +0100)
When a GET/HEAD/OPTIONS/DELETE healthcheck request was formatted, we claimed
there was a "content-length" header set even when there was no payload,
leading to actually send a "content-length: 0" header to the server. It was
unexpected and could be rejected by servers.

When a healthcheck request is sent we must take care to state there is a
"content-length" header when it is explicitly added.

This patch should fix the issue #2851. It must be backported as far as 2.9.

(cherry picked from commit fad68cb16d7f99acd2b327ff2f8a4d9ab88a68d8)
Signed-off-by: Willy Tarreau <w@1wt.eu>
(cherry picked from commit d5ca78b83d7bfddd107e3243a6ff785dc92b9157)
Signed-off-by: Willy Tarreau <w@1wt.eu>

src/tcpcheck.c

index e820fdc..967c1df 100644 (file)
@@ -1408,7 +1408,7 @@ enum tcpcheck_eval_ret tcpcheck_eval_send(struct check *check, struct tcpcheck_r
                if ((istlen(vsn) == 6 && *(vsn.ptr+5) == '2') ||
                    (istlen(vsn) == 8 && (*(vsn.ptr+5) > '1' || (*(vsn.ptr+5) == '1' && *(vsn.ptr+7) >= '1'))))
                        slflags |= HTX_SL_F_VER_11;
-               slflags |= (HTX_SL_F_XFER_LEN|HTX_SL_F_CLEN);
+               slflags |= HTX_SL_F_XFER_LEN;
                if (!(send->http.flags & TCPCHK_SND_HTTP_FL_BODY_FMT) && !isttest(send->http.body))
                        slflags |= HTX_SL_F_BODYLESS;
 
@@ -1467,6 +1467,7 @@ enum tcpcheck_eval_ret tcpcheck_eval_send(struct check *check, struct tcpcheck_r
                        clen = ist((!istlen(body) ? "0" : ultoa(istlen(body))));
                        if (!htx_add_header(htx, ist("Content-length"), clen))
                                goto error_htx;
+                       sl->flags |= HTX_SL_F_CLEN;
                }
 
                if (!htx_add_endof(htx, HTX_BLK_EOH) ||