haproxy/reg-tests/connection/h2_glitches.vtc
Willy Tarreau 870e2d3f1f MEDIUM: mux-h2: update session trackers with number of glitches
We now update the session's tracked counters with the observed glitches.
In order to avoid incurring a high cost, e.g. if many small frames contain
issues, we batch the updates around h2_process_demux() by directly passing
the difference. Indeed, for now all functions that increment glitches are
called from h2_process_demux(). If that were to change, we'd just need to
keep the value of the last synced counter in the h2c struct instead of the
stack.

The regtest was updated to verify that the 3rd client that does not cause
issue still sees the counter resulting from client 2's mistakes. The rate
is also verified, considering it shouldn't fail since the period is very
long (1m).
2024-02-08 15:51:49 +01:00

115 lines
2.1 KiB
Plaintext

# This test verifies that H2 anomalies counted as glitches are properly detected
# and fetched.
varnishtest "h2 glitches"
feature ignore_unknown_macro
# haproxy frontend
haproxy hap -conf {
defaults
mode http
listen fe1
bind "fd@${fe1}" proto h2
tcp-request session track-sc0 src
http-request return status 200 hdr x-glitches %[fc_glitches] hdr x-glitch-cnt %[sc0_glitch_cnt] hdr x-glitch-rate %[sc0_glitch_rate]
stick-table type ip size 10 store glitch_cnt,glitch_rate(1m)
} -start
# valid request: no glitch
client c1 -connect ${hap_fe1_sock} {
txpri
stream 0 {
txsettings
rxsettings
txsettings -ack
rxsettings
expect settings.ack == true
} -run
stream 1 {
txreq \
-method "GET" \
-scheme "http" \
-url "/"
rxresp
expect resp.status == 200
expect resp.http.x-glitches == 0
} -run
stream 3 {
txreq \
-method "GET" \
-scheme "http" \
-url "/"
rxresp
expect resp.status == 200
expect resp.http.x-glitches == 0
} -run
} -run
# invalid path: => req decoding error => glitch++
client c2-path -connect ${hap_fe1_sock} {
txpri
stream 0 {
txsettings
rxsettings
txsettings -ack
rxsettings
expect settings.ack == true
} -run
stream 1 {
txreq \
-method "GET" \
-scheme "http" \
-url "hello-world"
rxrst
} -run
stream 3 {
txreq \
-method "GET" \
-scheme "http" \
-url "/"
rxresp
expect resp.status == 200
expect resp.http.x-glitches == 1
expect resp.http.x-glitch-cnt == 1
expect resp.http.x-glitch-rate == 1
} -run
} -run
# invalid scheme: blocked at HTX layer, not counted
client c3-scheme -connect ${hap_fe1_sock} {
txpri
stream 0 {
txsettings
rxsettings
txsettings -ack
rxsettings
expect settings.ack == true
} -run
stream 1 {
txreq \
-method "GET" \
-scheme "http://localhost/?" \
-url "/"
rxresp
expect resp.status == 400
} -run
stream 3 {
txreq \
-method "GET" \
-scheme "http" \
-url "/"
rxresp
expect resp.status == 200
expect resp.http.x-glitches == 0
expect resp.http.x-glitch-cnt == 1
expect resp.http.x-glitch-rate == 1
} -run
} -run