blob: ec7a7c123163b0c1966578bbd5f457a5888c7b8f [file] [log] [blame]
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
barrier b5 cond 2 -cyclic
barrier b6 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
barrier b5 sync
# the next request is never received
barrier b6 sync
# the next request is never received
} -repeat 2 -start
haproxy h1 -conf {
global
# WT: limit false-positives causing "HTTP header incomplete" due to
# idle server connections being randomly used and randomly expiring
# under us.
tune.idle-pool.shared off
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
# fifth request is invalid and advertises an invalid C-L ending with an
# empty value, which results in a stream error.
stream 9 {
barrier b5 sync
txreq \
-req "GET" \
-scheme "https" \
-url "/test5.html" \
-hdr "content-length" "0," \
-nostrend
rxrst
} -run
# sixth request is invalid and advertises an empty C-L, which results
# in a stream error.
stream 11 {
barrier b6 sync
txreq \
-req "GET" \
-scheme "https" \
-url "/test6.html" \
-hdr "content-length" "" \
-nostrend
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
# fifth request is invalid and advertises invalid C-L ending with an
# empty value, which results in a stream error.
stream 9 {
barrier b5 sync
txreq \
-req "POST" \
-scheme "https" \
-url "/test25.html" \
-hdr "content-length" "0," \
-nostrend
rxrst
} -run
# sixth request is invalid and advertises an empty C-L, which results
# in a stream error.
stream 11 {
barrier b6 sync
txreq \
-req "POST" \
-scheme "https" \
-url "/test26.html" \
-hdr "content-length" "" \
-nostrend
rxrst
} -run
} -run