# This reg-test checks the full support of HTTP protocol upgrade, using a GET
# method and a Connection: Upgrade header. The equivalent mechanism has been
# defined in rfc8441 for HTTP/2 using CONNECT and a new pseudo-header
# :protocol. Check that haproxy handles properly h1/h2 translation of protocol
# upgrade requests and responses.

varnishtest "h1/h2 support for protocol upgrade test"

feature ignore_unknown_macro

#REQUIRE_VERSION=2.4

# http/1.1 server
server srv_h1 {
	rxreq
	expect req.method == "GET"
	expect req.http.connection == "upgrade"
	expect req.http.upgrade == "custom_protocol"

	txresp \
	  -status 101 \
	  -hdr "connection: upgrade" \
	  -hdr "upgrade: custom_protocol"
} -repeat 2 -start

# http2 server
server srv_h2 {
	rxpri

	stream 0 {
		txsettings
		rxsettings
		txsettings -ack
		rxsettings
		expect settings.ack == true
	} -run

	stream 1 {
		rxhdrs
		expect req.method == "CONNECT"
		expect req.http.:scheme == "https"
		expect req.http.:path == "/"
		expect req.http.:authority == "127.0.0.1"
		expect req.http.:protocol == "custom_protocol"

		txresp \
		  -status 200
	} -run
} -repeat 2 -start

haproxy hap -conf {
	defaults
	mode http
	timeout connect 1s
	timeout client  1s
	timeout server  1s

	# h1 frontend connected to h2 frontend
	listen frt_h1_h2
	bind "fd@${frt_h1_h2}"
	server feh2_srv ${hap_frt_h2_addr}:${hap_frt_h2_port} proto h2

	# h2 frontend connected to srv_h1
	listen frt_h2
	bind "fd@${frt_h2}" proto h2
	server srv_h1 ${srv_h1_addr}:${srv_h1_port}

	# h1 frontend connected to srv_h2
	listen frt_h1
	bind "fd@${frt_h1}"
	server srv_h2 ${srv_h2_addr}:${srv_h2_port} proto h2

	# h2 frontend connected to h1 frontend
	listen frt_h2_h1
	bind "fd@${frt_h2_h1}" proto h2
	server frt_h1 ${hap_frt_h1_addr}:${hap_frt_h1_port}
} -start

## connect to h1 translation frontend
client c1_h1_h2 -connect ${hap_frt_h1_h2_sock} {
	txreq \
	  -req "GET" \
	  -url "/" \
	  -hdr "host: 127.0.0.1" \
	  -hdr "connection: upgrade" \
	  -hdr "upgrade: custom_protocol"

	rxresp
	expect resp.status == 101
	expect resp.http.connection == "upgrade"
	expect resp.http.upgrade == "custom_protocol"
} -run

# connect to h2 server frontend
client c2_h2 -connect ${hap_frt_h2_sock} {
	txpri
	stream 0 {
		txsettings
		rxsettings
		txsettings -ack
		rxsettings
		expect settings.ack == true
	} -run

	stream 1 {
		txreq \
		  -req "CONNECT" \
		  -scheme "http" \
		  -url "/" \
		  -hdr ":authority" "127.0.0.1" \
		  -hdr ":protocol" "custom_protocol"

		rxhdrs
		expect resp.status == 200
	} -run
} -run

# connect to h2 translation frontend
client c3_h2_h1 -connect ${hap_frt_h2_h1_sock} {
	txpri
	stream 0 {
		txsettings
		rxsettings
		txsettings -ack
		rxsettings
		expect settings.ack == true
	} -run

	stream 1 {
		txreq \
		  -req "CONNECT" \
		  -scheme "http" \
		  -url "/" \
		  -hdr ":authority" "127.0.0.1" \
		  -hdr ":protocol" "custom_protocol"

		rxhdrs
		expect resp.status == 200
	} -run
} -run

# connect to h1 server frontend
client c4_h1 -connect ${hap_frt_h1_sock} {
	txreq \
	  -req "GET" \
	  -url "/" \
	  -hdr "host: 127.0.0.1" \
	  -hdr "connection: upgrade" \
	  -hdr "upgrade: custom_protocol"

	rxresp
	expect resp.status == 101
	expect resp.http.connection == "upgrade"
	expect resp.http.upgrade == "custom_protocol"
} -run
