varnishtest "HTTP request tests: H1 to H1 (HTX mode supported only for HAProxy >= 1.9)"

# 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
	timeout connect "${HAPROXY_TEST_TIMEOUT-5s}"
	timeout client  "${HAPROXY_TEST_TIMEOUT-5s}"
	timeout server  "${HAPROXY_TEST_TIMEOUT-5s}"

    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
