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/h00002.vtc b/reg-tests/http-messaging/h00002.vtc
new file mode 100644
index 0000000..0b2daee
--- /dev/null
+++ b/reg-tests/http-messaging/h00002.vtc
@@ -0,0 +1,273 @@
+varnishtest "HTTP request tests: H2 to H1, 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
+	rxreq
+	txresp \
+	  -status 200 \
+	  -body "response 4"
+} -repeat 2 -start
+
+haproxy h1 -conf {
+    defaults
+	#log stdout format raw daemon
+	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
+
+client c1h2 -connect ${h1_feh2_sock} {
+	txpri
+	stream 0 {
+		txsettings
+		rxsettings
+		txsettings -ack
+		rxwinup
+		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: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 "GET" \
+		  -scheme "https" \
+		  -url "/test4.html" \
+		  -hdr "content-length" "0" \
+		  -nostrend
+		txdata -data "this is sent and ignored"
+		rxwinup
+		rxhdrs
+		expect resp.status == 200
+		rxdata -all
+		expect resp.body == "response 4"
+	} -run
+} -run
+
+# HEAD requests : don't work well yet
+#client c2h2 -connect ${h1_feh2_sock} {
+#	txpri
+#	stream 0 {
+#		txsettings
+#		rxsettings
+#		txsettings -ack
+#		rxwinup
+#		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
+		rxwinup
+		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: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 "POST" \
+		  -scheme "https" \
+		  -url "/test24.html" \
+		  -hdr "content-length" "0" \
+		  -nostrend
+		txdata -data "this is sent and ignored"
+		rxwinup
+		rxhdrs
+		expect resp.status == 200
+		rxdata -all
+		expect resp.body == "response 4"
+	} -run
+} -run