#REGTEST_TYPE=devel # This teg-test verifies that different ALPN values on the "server" line # will negotiate the expected protocol depending on the ALPN "bind" line. # It requires OpenSSL >= 1.0.2 for ALPN varnishtest "Test the bind 'alpn' setting" feature cmd "$HAPROXY_PROGRAM -cc 'version_atleast(2.8-dev7)'" feature cmd "$HAPROXY_PROGRAM -cc 'feature(OPENSSL) && openssl_version_atleast(1.0.2)'" feature ignore_unknown_macro haproxy h1 -conf { global tune.ssl.default-dh-param 2048 defaults mode http option httplog log stderr local0 debug err timeout connect "${HAPROXY_TEST_TIMEOUT-5s}" timeout client "${HAPROXY_TEST_TIMEOUT-5s}" timeout server "${HAPROXY_TEST_TIMEOUT-5s}" listen px-clr bind "fd@${clearfe}" default-server ssl verify none # first digit select the alpn sent by the client, second digit, the server one use-server s00 if { path /00 } server s00 "${tmpdir}/ssl0.sock" use-server s01 if { path /01 } server s01 "${tmpdir}/ssl1.sock" use-server s02 if { path /02 } server s02 "${tmpdir}/ssl2.sock" use-server s03 if { path /03 } server s03 "${tmpdir}/ssl3.sock" use-server s04 if { path /04 } server s04 "${tmpdir}/ssl4.sock" use-server s10 if { path /10 } server s10 "${tmpdir}/ssl0.sock" alpn http/1.1 use-server s11 if { path /11 } server s11 "${tmpdir}/ssl1.sock" alpn http/1.1 use-server s12 if { path /12 } server s12 "${tmpdir}/ssl2.sock" alpn http/1.1 use-server s13 if { path /13 } server s13 "${tmpdir}/ssl3.sock" alpn http/1.1 use-server s14 if { path /14 } server s14 "${tmpdir}/ssl4.sock" alpn http/1.1 use-server s20 if { path /20 } server s20 "${tmpdir}/ssl0.sock" alpn h2 use-server s21 if { path /21 } server s21 "${tmpdir}/ssl1.sock" alpn h2 use-server s22 if { path /22 } server s22 "${tmpdir}/ssl2.sock" alpn h2 use-server s23 if { path /23 } server s23 "${tmpdir}/ssl3.sock" alpn h2 use-server s24 if { path /24 } server s24 "${tmpdir}/ssl4.sock" alpn h2 use-server s30 if { path /30 } server s30 "${tmpdir}/ssl0.sock" alpn h2,http/1.1 use-server s31 if { path /31 } server s31 "${tmpdir}/ssl1.sock" alpn h2,http/1.1 use-server s32 if { path /32 } server s32 "${tmpdir}/ssl2.sock" alpn h2,http/1.1 use-server s33 if { path /33 } server s33 "${tmpdir}/ssl3.sock" alpn h2,http/1.1 use-server s34 if { path /34 } server s34 "${tmpdir}/ssl4.sock" alpn h2,http/1.1 frontend fe-ssl bind "${tmpdir}/ssl0.sock" ssl crt ${testdir}/common.pem bind "${tmpdir}/ssl1.sock" ssl crt ${testdir}/common.pem alpn http/1.1 bind "${tmpdir}/ssl2.sock" ssl crt ${testdir}/common.pem alpn h2 bind "${tmpdir}/ssl3.sock" ssl crt ${testdir}/common.pem alpn h2,http/1.1 bind "${tmpdir}/ssl4.sock" ssl crt ${testdir}/common.pem no-alpn http-request return status 200 hdr x-alpn _%[ssl_fc_alpn] hdr x-path %[path] hdr x-ver _%[req.ver] } -start # client sends no alpn client c1 -connect ${h1_clearfe_sock} { txreq -url "/00" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_" expect resp.http.x-ver == "_1.1" txreq -url "/01" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_" expect resp.http.x-ver == "_1.1" txreq -url "/02" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_" expect resp.http.x-ver == "_1.1" txreq -url "/03" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_" expect resp.http.x-ver == "_1.1" txreq -url "/04" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_" expect resp.http.x-ver == "_1.1" } -run # client sends alpn=http/1.1 client c1 -connect ${h1_clearfe_sock} { txreq -url "/10" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_http/1.1" expect resp.http.x-ver == "_1.1" txreq -url "/11" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_http/1.1" expect resp.http.x-ver == "_1.1" txreq -url "/12" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_" expect resp.http.x-ver == "_1.1" txreq -url "/13" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_http/1.1" expect resp.http.x-ver == "_1.1" txreq -url "/14" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_" expect resp.http.x-ver == "_1.1" } -run # client sends alpn=h2 client c1 -connect ${h1_clearfe_sock} { txreq -url "/20" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_h2" expect resp.http.x-ver == "_2.0" txreq -url "/21" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_" expect resp.http.x-ver == "_1.1" txreq -url "/22" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_h2" expect resp.http.x-ver == "_2.0" txreq -url "/23" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_h2" expect resp.http.x-ver == "_2.0" txreq -url "/24" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_" expect resp.http.x-ver == "_1.1" } -run # client sends alpn=h2,http/1.1 client c1 -connect ${h1_clearfe_sock} { txreq -url "/30" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_h2" expect resp.http.x-ver == "_2.0" txreq -url "/31" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_http/1.1" expect resp.http.x-ver == "_1.1" txreq -url "/32" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_h2" expect resp.http.x-ver == "_2.0" txreq -url "/33" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_h2" expect resp.http.x-ver == "_2.0" txreq -url "/34" rxresp expect resp.status == 200 expect resp.http.x-alpn == "_" expect resp.http.x-ver == "_1.1" } -run