REGTEST: add a few HTTP messaging tests
These tests send GET/HEAD/POST requests in H1 and H2, with and without
HTX, with and without a body, and verify that the behaviour is the expected
one. For now HEAD requests have been commented out because in H1 they are
not really testable as varnishtest expects to read a body, and in H2 the
behaviour depends on HTX/legacy, indicating a bug in haproxy (it looks
like we can deliver some data in response to HEAD in legacy mode).
diff --git a/reg-tests/http-messaging/h00001.vtc b/reg-tests/http-messaging/h00001.vtc
new file mode 100644
index 0000000..65b2ce0
--- /dev/null
+++ b/reg-tests/http-messaging/h00001.vtc
@@ -0,0 +1,172 @@
+varnishtest "HTTP request tests: H1 to H1, HTX mode"
+#REQUIRE_VERSION=1.9
+
+# Run it with HAPROXY_PROGRAM=$PWD/haproxy varnishtest -l -k -t 1 "$1"
+
+feature ignore_unknown_macro
+
+server s1 {
+ rxreq
+ txresp \
+ -status 200 \
+ -body "response 1"
+
+ rxreq
+ txresp \
+ -status 200 \
+ -body "response 2"
+
+ rxreq
+ txresp \
+ -status 200 \
+ -body "response 3"
+
+ rxreq
+ txresp \
+ -status 200 \
+ -body "response 4"
+} -repeat 2 -start
+
+haproxy h1 -conf {
+ defaults
+ mode http
+ 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
+
+ # second request is valid and advertises C-L:0
+ txreq \
+ -req "GET" \
+ -url "/test2.html" \
+ -hdr "content-length: 0"
+ rxresp
+ expect resp.status == 200
+
+ # 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
+
+ # 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
+
+ # 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
+#
+# # second request is valid and advertises C-L:0
+# txreq \
+# -req "HEAD" \
+# -url "/test12.html" \
+# -hdr "content-length: 0"
+# rxresp
+# expect resp.status == 200
+#
+# # third request sends a body with a GET
+# txreq \
+# -req "GET" \
+# -url "/test13.html" \
+# -body "this must be delivered, like it or not"
+# rxresp
+# expect resp.status == 200
+#
+# # 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
+#
+# # the connection is expected to be closed and no more response must
+# # arrive here.
+# expect_close
+#} -run
+
+client c1h1 -connect ${h1_feh1_sock} {
+ # first request is valid
+ txreq \
+ -req "POST" \
+ -url "/test21.html"
+ rxresp
+ expect resp.status == 200
+
+ # second request is valid and advertises C-L:0
+ txreq \
+ -req "POST" \
+ -url "/test22.html" \
+ -hdr "content-length: 0"
+ rxresp
+ expect resp.status == 200
+
+ # third request is valid and advertises (and sends) somme contents
+ txreq \
+ -req "POST" \
+ -url "/test23.html" \
+ -body "this is sent"
+ rxresp
+ expect resp.status == 200
+
+ # 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
+
+ # the connection is expected to be closed and no more response must
+ # arrive here.
+ expect_close
+} -run