# This reg-test checks websocket support in regards with the server keyword
# 'ws'

varnishtest "h2 backend websocket management via server keyword"

feature ignore_unknown_macro

#REQUIRE_VERSION=2.4
#REQUIRE_OPTION=OPENSSL

# haproxy server
haproxy hapsrv -conf {
	defaults
		mode http
		timeout connect 5s
		timeout client  5s
		timeout server  5s

	frontend fe
		bind "fd@${fe}"
		bind "fd@${fessl}" ssl crt ${testdir}/common.pem alpn h2,http/1.1
		capture request header sec-websocket-key len 128
		http-request set-var(txn.ver) req.ver
		use_backend be

	backend be
		# define websocket ACL
		acl ws_handshake hdr(upgrade) -m str websocket

		# handle non-ws streams
		http-request return status 200 if !ws_handshake

		# handle ws streams
		#capture request header sec-websocket-key len 128
		http-request return status 200 hdr connection upgrade hdr upgrade websocket hdr sec-websocket-accept "%[capture.req.hdr(0),concat(258EAFA5-E914-47DA-95CA-C5AB0DC85B11,,),sha1,base64]" if ws_handshake
		http-after-response set-status 101 if { status eq 200 } { res.hdr(upgrade) -m str websocket }
		http-after-response set-header x-backend-protocol "%[var(txn.ver)]"
} -start

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

	# proto X ws h1 -> websocket on h1
	listen li
		bind "fd@${li}"
		server hap_srv ${hapsrv_fe_addr}:${hapsrv_fe_port} proto h2 ws h1

	# proto X ws h2 -> websocket on h2
	listen lih2
		bind "fd@${lih2}"
		server hap_srv ${hapsrv_fe_addr}:${hapsrv_fe_port} proto h2 ws h2

	# alpn h2,http/1.1 ws h2 -> websocket on h2
	listen lisslh2
		bind "fd@${lisslh2}"
		server hap_srv ${hapsrv_fessl_addr}:${hapsrv_fessl_port} ssl verify none alpn h2,http/1.1 ws h2
		http-response set-header x-alpn "%[ssl_bc_alpn]"

	# ws auto -> websocket on h1
	listen liauto
		bind "fd@${liauto}"
		server hap_srv ${hapsrv_fe_addr}:${hapsrv_fe_port}

	# alpn h2,http/1.1 ws auto -> websocket on h1
	listen lissl
		bind "fd@${lissl}"
		server hap_srv ${hapsrv_fessl_addr}:${hapsrv_fessl_port} ssl verify none alpn h2,http/1.1 ws auto
		http-response set-header x-alpn "%[ssl_bc_alpn]"
	# alpn h2,http/1.1 ws auto -> websocket on h1
	listen lisslauto
		bind "fd@${lisslauto}"
		server hap_srv ${hapsrv_fessl_addr}:${hapsrv_fessl_port} ssl verify none alpn h2,http/1.1
		http-response set-header x-alpn "%[ssl_bc_alpn]"

	# proto h2 ws auto -> websocket on h2
	listen liauto2
		bind "fd@${liauto2}"
		server hap_srv ${hapsrv_fe_addr}:${hapsrv_fe_port} proto h2

	# alpn h2 ws auto -> websocket on h2
	listen lisslauto2
		bind "fd@${lisslauto2}"
		server hap_srv ${hapsrv_fessl_addr}:${hapsrv_fessl_port} ssl verify none alpn h2 ws auto
		http-response set-header x-alpn "%[ssl_bc_alpn]"
} -start

client c1 -connect ${hap_li_sock} {
	txreq \
	  -req "GET" \
	  -url "/" \
	  -hdr "host: 127.0.0.1" \
	  -hdr "connection: upgrade" \
	  -hdr "upgrade: websocket" \
	  -hdr "sec-websocket-key: dGhlIHNhbXBsZSBub25jZQ=="
	rxresp
	expect resp.status == 101
	expect resp.http.x-backend-protocol == "1.1"
} -run

client c1.2 -connect ${hap_lih2_sock} {
	txreq \
	  -req "GET" \
	  -url "/" \
	  -hdr "host: 127.0.0.1" \
	  -hdr "connection: upgrade" \
	  -hdr "upgrade: websocket" \
	  -hdr "sec-websocket-key: dGhlIHNhbXBsZSBub25jZQ=="
	rxresp
	expect resp.status == 101
	expect resp.http.x-backend-protocol == "2.0"
} -run

client c1.3 -connect ${hap_liauto_sock} {
	txreq \
	  -req "GET" \
	  -url "/" \
	  -hdr "host: 127.0.0.1" \
	  -hdr "connection: upgrade" \
	  -hdr "upgrade: websocket" \
	  -hdr "sec-websocket-key: dGhlIHNhbXBsZSBub25jZQ=="
	rxresp
	expect resp.status == 101
	expect resp.http.x-backend-protocol == "1.1"
} -run

client c1.4 -connect ${hap_liauto2_sock} {
	txreq \
	  -req "GET" \
	  -url "/" \
	  -hdr "host: 127.0.0.1" \
	  -hdr "connection: upgrade" \
	  -hdr "upgrade: websocket" \
	  -hdr "sec-websocket-key: dGhlIHNhbXBsZSBub25jZQ=="
	rxresp
	expect resp.status == 101
	expect resp.http.x-backend-protocol == "2.0"
} -run

client c2 -connect ${hap_lisslauto_sock} {
	txreq \
	  -req "GET" \
	  -url "/" \
	  -hdr "host: 127.0.0.1" \
	  -hdr "connection: upgrade" \
	  -hdr "upgrade: websocket" \
	  -hdr "sec-websocket-key: dGhlIHNhbXBsZSBub25jZQ=="
	rxresp
	expect resp.status == 101
	expect resp.http.x-alpn == "http/1.1"
} -run

client c2.2 -connect ${hap_lisslauto2_sock} {
	txreq \
	  -req "GET" \
	  -url "/" \
	  -hdr "host: 127.0.0.1" \
	  -hdr "connection: upgrade" \
	  -hdr "upgrade: websocket" \
	  -hdr "sec-websocket-key: dGhlIHNhbXBsZSBub25jZQ=="
	rxresp
	expect resp.status == 101
	expect resp.http.x-alpn == "h2"
} -run

client c2.3 -connect ${hap_lisslh2_sock} {
	txreq \
	  -req "GET" \
	  -url "/" \
	  -hdr "host: 127.0.0.1" \
	  -hdr "connection: upgrade" \
	  -hdr "upgrade: websocket" \
	  -hdr "sec-websocket-key: dGhlIHNhbXBsZSBub25jZQ=="
	rxresp
	expect resp.status == 101
	expect resp.http.x-alpn == "h2"
} -run
