mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-27 23:22:09 +00:00
870e2d3f1f
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).
115 lines
2.1 KiB
Plaintext
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
|