From 07fe80008ffb3b2a757c5f231a92e4eaa17a2623 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 20 Oct 2023 18:38:34 +0200 Subject: [PATCH] BUG/MINOR: mux-h2: update tracked counters with req cnt/req err Originally H2 would transfer everything to H1 and parsing errors were handled there, so that if there was a track-sc rule in effect, the counters would be updated as well. As we started to add more and more HTTP-compliance checks at the H2 layer, then switched to HTX, we progressively lost this ability. It's a bit annoying because it means we will not maintain accurate error counters for a given source, for example. This patch adds the calls to session_inc_http_req_ctr() and session_inc_http_err_ctr() when needed (i.e. when failing to parse an HTTP request since all other cases are handled by the stream), just like mux-h1 does. The same should be done for mux-h3 by the way. This can be backported to recent stable versions. It's not exactly a bug, rather a missing feature in that we had never updated this counter for H2 till now, but it does make sense to do it especially based on what the doc says about its usage. (cherry picked from commit 380f115a4aaa76d5496028290061407fa7cabd9b) Signed-off-by: Amaury Denoyelle (cherry picked from commit d6e5cdefd07a1eeee57f2885ccbb4fa88ad5d6cd) Signed-off-by: Amaury Denoyelle (cherry picked from commit d16ae5d8ed61c53311f11e3119ac92080a33a693) Signed-off-by: Amaury Denoyelle --- src/mux_h2.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/mux_h2.c b/src/mux_h2.c index c6c553e5947f..44af06ca9ff5 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -1702,6 +1702,8 @@ static struct h2s *h2c_frt_stream_new(struct h2c *h2c, int id, struct buffer *in if (h2c->nb_streams >= h2_settings_max_concurrent_streams) { TRACE_ERROR("HEADERS frame causing MAX_CONCURRENT_STREAMS to be exceeded", H2_EV_H2S_NEW|H2_EV_RX_FRAME|H2_EV_RX_HDR, h2c->conn); + session_inc_http_req_ctr(sess); + session_inc_http_err_ctr(sess); goto out; } @@ -2930,6 +2932,8 @@ static struct h2s *h2c_frt_handle_headers(struct h2c *h2c, struct h2s *h2s) TRACE_ERROR("HEADERS on invalid stream ID", H2_EV_RX_FRAME|H2_EV_RX_HDR, h2c->conn); HA_ATOMIC_INC(&h2c->px_counters->conn_proto_err); sess_log(h2c->conn->owner); + session_inc_http_req_ctr(h2c->conn->owner); + session_inc_http_err_ctr(h2c->conn->owner); goto conn_err; } else if (h2c->flags & H2_CF_DEM_TOOMANY) @@ -2941,6 +2945,8 @@ static struct h2s *h2c_frt_handle_headers(struct h2c *h2c, struct h2s *h2s) if (h2c->st0 >= H2_CS_ERROR) { TRACE_USER("Unrecoverable error decoding H2 request", H2_EV_RX_FRAME|H2_EV_RX_HDR|H2_EV_STRM_NEW|H2_EV_STRM_END, h2c->conn, 0, &rxbuf); sess_log(h2c->conn->owner); + session_inc_http_req_ctr(h2c->conn->owner); + session_inc_http_err_ctr(h2c->conn->owner); goto out; } @@ -2956,6 +2962,9 @@ static struct h2s *h2c_frt_handle_headers(struct h2c *h2c, struct h2s *h2s) * but the HPACK decompressor is still synchronized. */ sess_log(h2c->conn->owner); + session_inc_http_req_ctr(h2c->conn->owner); + session_inc_http_err_ctr(h2c->conn->owner); + h2s = (struct h2s*)h2_error_stream; /* This stream ID is now opened anyway until we send the RST on