| varnishtest "Test the http-reuse with special connection parameters" |
| #REQUIRE_VERSION=2.4 |
| #REQUIRE_OPTIONS=OPENSSL |
| |
| feature ignore_unknown_macro |
| |
| haproxy h1 -conf { |
| defaults |
| mode http |
| |
| # sni |
| # ssl-reuse is disabled because it seems to be the origin of a crash with |
| # libressl from 3.2.2 on the CI (cf github issue #1115) |
| listen sender-sni |
| bind "fd@${feS_sni}" |
| server srv2 ${h1_feR_ssl_addr}:${h1_feR_ssl_port} ssl sni "req.hdr(x-sni)" verify none pool-low-conn 2 no-ssl-reuse |
| |
| # set-dst |
| # specify dst1_addr for server, which should be identical to dst2_addr |
| # port is specified by the client in header x-dst-port |
| listen sender-set-dst |
| bind "fd@${feS_dst}" |
| http-request set-dst-port hdr(x-dst-port) |
| server srv2 ${h1_feR_dst1_addr}:0 pool-low-conn 2 |
| |
| # proxy protocol |
| # must use reuse always as consecutive requests are from different client |
| listen sender-proxy |
| bind "fd@${feS_proxy}" accept-proxy |
| http-reuse always |
| server srv2 ${h1_feR_proxy_addr}:${h1_feR_proxy_port} send-proxy pool-low-conn 2 |
| |
| listen receiver |
| bind "fd@${feR_ssl}" ssl crt ${testdir}/common.pem |
| bind "fd@${feR_proxy}" accept-proxy |
| http-request return status 200 |
| http-after-response set-header http_first_request %[http_first_req] |
| |
| listen receiver-dst1 |
| bind "fd@${feR_dst1}" |
| http-request return status 200 hdr "x-dst" "dst1" |
| http-after-response set-header http_first_request %[http_first_req] |
| |
| listen receiver-dst2 |
| bind "fd@${feR_dst2}" |
| http-request return status 200 hdr "x-dst" "dst2" |
| http-after-response set-header http_first_request %[http_first_req] |
| } -start |
| |
| # http-reuse with sni parameters |
| client c_sni -connect ${h1_feS_sni_sock} { |
| # first request |
| txreq \ |
| -hdr "x-sni: www.custom.com" |
| rxresp |
| expect resp.http.http_first_request == "1" |
| |
| # second request with same sni, connection must be reused |
| txreq \ |
| -hdr "x-sni: www.custom.com" |
| rxresp |
| expect resp.http.http_first_request == "0" |
| |
| # third request with a different sni, a new connection must be used |
| txreq \ |
| -hdr "x-sni: www.custom2.com" |
| rxresp |
| expect resp.http.http_first_request == "1" |
| |
| # fourth request, reuse sni2 |
| txreq \ |
| -hdr "x-sni: www.custom2.com" |
| rxresp |
| expect resp.http.http_first_request == "0" |
| } -run |
| |
| # http-reuse with destination address |
| client c_dst1 -connect ${h1_feS_dst_sock} { |
| txreq \ |
| -hdr "x-dst-port: ${h1_feR_dst1_port}" |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.x-dst == "dst1" |
| expect resp.http.http_first_request == "1" |
| |
| txreq \ |
| -hdr "x-dst-port: ${h1_feR_dst1_port}" |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.x-dst == "dst1" |
| expect resp.http.http_first_request == "0" |
| |
| txreq \ |
| -hdr "x-dst-port: ${h1_feR_dst2_port}" |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.x-dst == "dst2" |
| expect resp.http.http_first_request == "1" |
| |
| txreq \ |
| -hdr "x-dst-port: ${h1_feR_dst1_port}" |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.x-dst == "dst1" |
| expect resp.http.http_first_request == "0" |
| |
| txreq \ |
| -hdr "x-dst-port: ${h1_feR_dst2_port}" |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.x-dst == "dst2" |
| expect resp.http.http_first_request == "0" |
| } -run |
| |
| ## first request with proxy protocol |
| client c_proxy -connect ${h1_feS_proxy_sock} -proxy1 "127.0.0.1:40000 ${h1_feS_proxy_addr}:${h1_feS_proxy_port}" { |
| txreq |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.http_first_request == "1" |
| |
| txreq |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.http_first_request == "0" |
| } -run |
| |
| ## second request with different proxy protocol |
| # this have the nice effect to fill the server pool to 2 connection |
| # (pool-low-conn value) to allow takeover on multi thread run |
| client c_proxy -connect ${h1_feS_proxy_sock} -proxy1 "127.0.0.1:50000 ${h1_feS_proxy_addr}:${h1_feS_proxy_port}" { |
| txreq |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.http_first_request == "1" |
| } -run |
| |
| ## third request, reuse same proxy protocol entry |
| client c_proxy -connect ${h1_feS_proxy_sock} -proxy1 "127.0.0.1:40000 ${h1_feS_proxy_addr}:${h1_feS_proxy_port}" { |
| txreq |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.http_first_request == "0" |
| } -run |
| |
| ## fourth request with different proxy protocol entry, no reuse |
| client c_proxy -connect ${h1_feS_proxy_sock} -proxy1 "127.0.0.1:60000 ${h1_feS_proxy_addr}:${h1_feS_proxy_port}" { |
| txreq |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.http_first_request == "1" |
| } -run |
| |
| ## fifth request, reuse proxy protocol |
| client c_proxy -connect ${h1_feS_proxy_sock} -proxy1 "127.0.0.1:50000 ${h1_feS_proxy_addr}:${h1_feS_proxy_port}" { |
| txreq |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.http_first_request == "0" |
| |
| txreq |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.http_first_request == "0" |
| } -run |