haproxy/reg-tests/http-messaging/h00002.vtc
Willy Tarreau 1915ca2738 BUG/MINOR: mux-h2: always compare content-length to the sum of DATA frames
This is mandated by RFC7541#8.1.2.6. Till now we didn't have a copy of
the content-length header field. But now that it's already parsed, it's
easy to add the check.

The reg-test was updated to match the new behaviour as the previous one
expected unadvertised data to be silently discarded.

This should be backported to 1.9 along with previous patch (MEDIUM: h2:
always parse and deduplicate the content-length header) after it has got
a bit more exposure.
2019-01-24 19:45:27 +01:00

261 lines
5.0 KiB
Plaintext

varnishtest "HTTP request tests: H2 to H1 (HTX and legacy mode)"
#REQUIRE_VERSION=1.9
# Run it with HAPROXY_PROGRAM=$PWD/haproxy varnishtest -l -k -t 1 "$1"
feature ignore_unknown_macro
# synchronize requests between streams
barrier b1 cond 2 -cyclic
barrier b2 cond 2 -cyclic
barrier b3 cond 2 -cyclic
barrier b4 cond 2 -cyclic
server s1 {
rxreq
txresp \
-status 200 \
-body "response 1"
barrier b2 sync
rxreq
txresp \
-status 200 \
-body "response 2"
barrier b3 sync
rxreq
txresp \
-status 200 \
-body "response 3"
barrier b4 sync
# the next request is never received
} -repeat 2 -start
haproxy h1 -conf {
defaults
#log stdout format raw daemon
mode http
option http-buffer-request
${no-htx} option http-use-htx
timeout connect 1s
timeout client 1s
timeout server 1s
listen feh1
bind "fd@${feh1}"
bind "fd@${feh2}" proto h2
server s1 ${s1_addr}:${s1_port}
} -start
client c1h2 -connect ${h1_feh2_sock} {
txpri
stream 0 {
txsettings
rxsettings
txsettings -ack
rxsettings
expect settings.ack == true
} -run
# first request is valid
stream 1 {
txreq \
-req "GET" \
-scheme "https" \
-url "/test1.html"
rxhdrs
expect resp.status == 200
rxdata -all
expect resp.body == "response 1"
} -run
# second request is valid and advertises C-L:0
stream 3 {
barrier b2 sync
txreq \
-req "GET" \
-scheme "https" \
-url "/test2.html" \
-hdr "content-length" "0"
rxhdrs
expect resp.status == 200
rxdata -all
expect resp.body == "response 2"
} -run
# third request sends a body with a GET
stream 5 {
barrier b3 sync
txreq \
-req "GET" \
-scheme "https" \
-url "/test3.html" \
-nostrend \
-body "this must be delivered, like it or not"
rxwinup
rxhdrs
expect resp.status == 200
rxdata -all
expect resp.body == "response 3"
} -run
# fourth request is valid and advertises C-L:2, and close, and is
# followed by a string "this is not sent\r\n\r\n" which causes a
# stream error of type PROTOCOL_ERROR.
stream 7 {
barrier b4 sync
txreq \
-req "GET" \
-scheme "https" \
-url "/test4.html" \
-hdr "content-length" "2" \
-nostrend
txdata -data "this is sent and ignored"
rxrst
} -run
} -run
# HEAD requests : don't work well yet
#client c2h2 -connect ${h1_feh2_sock} {
# txpri
# stream 0 {
# txsettings
# rxsettings
# txsettings -ack
# rxsettings
# expect settings.ack == true
# } -run
#
# # first request is valid
# stream 1 {
# txreq \
# -req "HEAD" \
# -scheme "https" \
# -url "/test11.html"
# rxhdrs
# expect resp.status == 200
# rxdata -all
# expect resp.bodylen == 0
# } -run
#
# # second request is valid and advertises C-L:0
# stream 3 {
# barrier b2 sync
# txreq \
# -req "HEAD" \
# -scheme "https" \
# -url "/test12.html" \
# -hdr "content-length" "0"
# rxhdrs
# expect resp.status == 200
# rxdata -all
# expect resp.bodylen == 0
# } -run
#
# # third request sends a body with a GET
# stream 5 {
# barrier b3 sync
# txreq \
# -req "HEAD" \
# -scheme "https" \
# -url "/test13.html" \
# -nostrend \
# -body "this must be delivered, like it or not"
# rxwinup
# rxhdrs
# expect resp.status == 200
# rxdata -all
# expect resp.bodylen == 0
# } -run
#
# # fourth request is valid and advertises C-L:0, and close, and is
# # followed by a string "this is not sent\r\n\r\n" which must be
# # dropped.
# stream 7 {
# barrier b4 sync
# txreq \
# -req "HEAD" \
# -scheme "https" \
# -url "/test14.html" \
# -hdr "content-length" "0" \
# -nostrend
# txdata -data "this is sent and ignored"
# rxwinup
# rxhdrs
# expect resp.status == 200
# rxdata -all
# expect resp.bodylen == 0
# } -run
#} -run
# POST requests
client c3h2 -connect ${h1_feh2_sock} {
txpri
stream 0 {
txsettings
rxsettings
txsettings -ack
rxsettings
expect settings.ack == true
} -run
# first request is valid
stream 1 {
txreq \
-req "POST" \
-scheme "https" \
-url "/test21.html"
rxhdrs
expect resp.status == 200
rxdata -all
expect resp.body == "response 1"
} -run
# second request is valid and advertises C-L:0
stream 3 {
barrier b2 sync
txreq \
-req "POST" \
-scheme "https" \
-url "/test22.html" \
-hdr "content-length" "0"
rxhdrs
expect resp.status == 200
rxdata -all
expect resp.body == "response 2"
} -run
# third request sends a body with a GET
stream 5 {
barrier b3 sync
txreq \
-req "POST" \
-scheme "https" \
-url "/test23.html" \
-nostrend \
-body "this must be delivered, like it or not"
rxwinup
rxhdrs
expect resp.status == 200
rxdata -all
expect resp.body == "response 3"
} -run
# fourth request is valid and advertises C-L:2, and close, and is
# followed by a string "this is not sent\r\n\r\n" which results
# in a stream error.
stream 7 {
barrier b4 sync
txreq \
-req "POST" \
-scheme "https" \
-url "/test24.html" \
-hdr "content-length" "2" \
-nostrend
txdata -data "this is sent and ignored"
rxrst
} -run
} -run