blob: 603c0321027ef1439fb08a82cf64d1890e170ea4 [file] [log] [blame]
varnishtest "HTTP request tests: H1 to H1 (HTX mode supported only for HAProxy >= 1.9)"
#REQUIRE_VERSION=1.6
# Run it with HAPROXY_PROGRAM=$PWD/haproxy varnishtest -l -k -t 1 "$1"
feature ignore_unknown_macro
server s1 {
##
## Handle GET requests
##
rxreq
expect req.bodylen == 0
expect req.body == ""
txresp \
-status 200 \
-body "response 1"
rxreq
expect req.bodylen == 0
expect req.body == ""
txresp \
-status 200 \
-body "response 2"
rxreq
expect req.bodylen == 38
expect req.body == "this must be delivered, like it or not"
txresp \
-status 200 \
-body "response 3"
rxreq
expect req.bodylen == 0
expect req.body == ""
txresp \
-status 200 \
-body "response 4"
accept
##
## Handle HEAD requests
##
rxreq
expect req.bodylen == 0
expect req.body == ""
txresp \
-status 200 \
-body "response 1"
accept
rxreq
expect req.bodylen == 0
expect req.body == ""
txresp \
-status 200 \
-body "response 2"
accept
rxreq
expect req.bodylen == 38
expect req.body == "this must be delivered, like it or not"
txresp \
-status 200 \
-body "response 3"
accept
rxreq
expect req.bodylen == 0
expect req.body == ""
txresp \
-status 200 \
-body "response 4"
accept
##
## Handle POST requests
##
# POST request without body
rxreq
expect req.bodylen == 0
expect req.body == ""
txresp \
-status 200 \
-body "response 1"
# POST request without body
rxreq
expect req.bodylen == 0
expect req.body == ""
txresp \
-status 200 \
-body "response 2"
# POST request with a body
rxreq
expect req.bodylen == 12
expect req.body == "this is sent"
txresp \
-status 200 \
-body "response 3"
# POST request without body
rxreq
expect req.bodylen == 0
expect req.body == ""
txresp \
-status 200 \
-body "response 4"
} -repeat 3 -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
mode http
${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
# GET requests
client c1h1 -connect ${h1_feh1_sock} {
# first request is valid
txreq \
-req "GET" \
-url "/test1.html"
rxresp
expect resp.status == 200
expect resp.body == "response 1"
# second request is valid and advertises C-L:0
txreq \
-req "GET" \
-url "/test2.html" \
-hdr "content-length: 0"
rxresp
expect resp.status == 200
expect resp.body == "response 2"
# third request sends a body with a GET
txreq \
-req "GET" \
-url "/test3.html" \
-body "this must be delivered, like it or not"
rxresp
expect resp.status == 200
expect resp.body == "response 3"
# 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.
txreq \
-req "GET" \
-url "/test4.html" \
-hdr "content-length: 0" \
-hdr "connection: close"
# "this is not sent"
sendhex "74787973207973206E6F742073656E740D0A0D0A"
rxresp
expect resp.status == 200
expect resp.body == "response 4"
# the connection is expected to be closed and no more response must
# arrive here.
expect_close
} -run
# HEAD requests
# Note: for now they fail with varnishtest, which expects the amount of
# data advertised in the content-length response.
client c2h1 -connect ${h1_feh1_sock} {
# first request is valid
txreq \
-req "HEAD" \
-url "/test11.html"
rxresp
expect resp.status == 200
expect resp.body == ""
# second request is valid and advertises C-L:0
txreq \
-req "HEAD" \
-url "/test12.html" \
-hdr "content-length: 0"
rxresp
expect resp.status == 200
expect resp.body == ""
# third request sends a body with a HEAD
txreq \
-req "HEAD" \
-url "/test13.html" \
-body "this must be delivered, like it or not"
rxresp
expect resp.status == 200
expect resp.body == ""
# 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.
txreq \
-req "HEAD" \
-url "/test14.html" \
-hdr "content-length: 0" \
-hdr "connection: close"
# "this is not sent"
sendhex "74787973207973206E6F742073656E740D0A0D0A"
rxresp
expect resp.status == 200
expect resp.body == ""
# the connection is expected to be closed and no more response must
# arrive here.
expect_close
} -run
client c3h1 -connect ${h1_feh1_sock} {
# first request is valid
txreq \
-req "POST" \
-url "/test21.html"
rxresp
expect resp.status == 200
expect resp.body == "response 1"
# second request is valid and advertises C-L:0
txreq \
-req "POST" \
-url "/test22.html" \
-hdr "content-length: 0"
rxresp
expect resp.status == 200
expect resp.body == "response 2"
# third request is valid and advertises (and sends) some contents
txreq \
-req "POST" \
-url "/test23.html" \
-body "this is sent"
rxresp
expect resp.status == 200
expect resp.body == "response 3"
# 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.
txreq \
-req "POST" \
-url "/test24.html" \
-hdr "content-length: 0" \
-hdr "connection: close"
# "this is not sent"
sendhex "74787973207973206E6F742073656E740D0A0D0A"
rxresp
expect resp.status == 200
expect resp.body == "response 4"
# the connection is expected to be closed and no more response must
# arrive here.
expect_close
} -run
client c4h1 -connect ${h1_feh1_sock} {
# this request is invalid and advertises an invalid C-L ending with an
# empty value, which results in a stream error.
txreq \
-req "GET" \
-url "/test31.html" \
-hdr "content-length: 0," \
-hdr "connection: close"
rxresp
expect resp.status == 400
expect_close
} -run
client c5h1 -connect ${h1_feh1_sock} {
# this request is invalid and advertises an empty C-L, which results
# in a stream error.
txreq \
-req "GET" \
-url "/test41.html" \
-hdr "content-length:" \
-hdr "connection: close"
rxresp
expect resp.status == 400
expect_close
} -run