varnishtest "Compression sets Vary header" #REQUIRE_OPTION=ZLIB|SLZ feature ignore_unknown_macro server s1 { rxreq expect req.url == "/plain/accept-encoding-gzip" expect req.http.accept-encoding == "gzip" txresp \ -hdr "Content-Type: text/plain" \ -bodylen 100 rxreq expect req.url == "/plain/accept-encoding-invalid" expect req.http.accept-encoding == "invalid" txresp \ -hdr "Content-Type: text/plain" \ -bodylen 100 rxreq expect req.url == "/plain/accept-encoding-null" expect req.http.accept-encoding == "" txresp \ -hdr "Content-Type: text/plain" \ -bodylen 100 rxreq expect req.url == "/html/accept-encoding-gzip" expect req.http.accept-encoding == "gzip" txresp \ -hdr "Content-Type: text/html" \ -bodylen 100 rxreq expect req.url == "/html/accept-encoding-invalid" expect req.http.accept-encoding == "invalid" txresp \ -hdr "Content-Type: text/html" \ -bodylen 100 rxreq expect req.url == "/html/accept-encoding-null" expect req.http.accept-encoding == "" txresp \ -hdr "Content-Type: text/html" \ -bodylen 100 rxreq expect req.url == "/dup-etag/accept-encoding-gzip" expect req.http.accept-encoding == "gzip" txresp \ -hdr "Content-Type: text/plain" \ -hdr "ETag: \"123\"" \ -hdr "ETag: \"123\"" \ -bodylen 100 } -repeat 2 -start server s2 { rxreq expect req.url == "/vary/no-vary" expect req.http.accept-encoding == "gzip" txresp \ -hdr "Content-Type: text/plain" \ -bodylen 100 rxreq expect req.url == "/vary/accept-encoding" expect req.http.accept-encoding == "gzip" txresp \ -hdr "Content-Type: text/plain" \ -hdr "Vary: Accept-Encoding" \ -bodylen 100 rxreq expect req.url == "/vary/other" expect req.http.accept-encoding == "gzip" txresp \ -hdr "Content-Type: text/plain" \ -hdr "Vary: Other" \ -bodylen 100 rxreq expect req.url == "/vary/accept-encoding-and-other" expect req.http.accept-encoding == "gzip" txresp \ -hdr "Content-Type: text/plain" \ -hdr "Vary: Accept-Encoding,Other" \ -bodylen 100 rxreq expect req.url == "/vary/other-and-accept-encoding" expect req.http.accept-encoding == "gzip" txresp \ -hdr "Content-Type: text/plain" \ -hdr "Vary: Other,Accept-Encoding" \ -bodylen 100 rxreq expect req.url == "/vary/empty" expect req.http.accept-encoding == "gzip" txresp \ -hdr "Content-Type: text/plain" \ -hdr "Vary: " \ -bodylen 100 } -start haproxy h1 -conf { global # WT: limit false-positives causing "HTTP header incomplete" due to # idle server connections being randomly used and randomly expiring # under us. tune.idle-pool.shared off defaults mode http timeout connect "${HAPROXY_TEST_TIMEOUT-5s}" timeout client "${HAPROXY_TEST_TIMEOUT-5s}" timeout server "${HAPROXY_TEST_TIMEOUT-5s}" frontend fe-gzip bind "fd@${fe_gzip}" default_backend be-gzip backend be-gzip compression algo gzip compression type text/plain server www ${s1_addr}:${s1_port} frontend fe-nothing bind "fd@${fe_nothing}" default_backend be-nothing backend be-nothing server www ${s1_addr}:${s1_port} frontend fe-vary bind "fd@${fe_vary}" default_backend be-vary backend be-vary compression algo gzip compression type text/plain server www ${s2_addr}:${s2_port} } -start client c1 -connect ${h1_fe_gzip_sock} { txreq -url "/plain/accept-encoding-gzip" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 200 expect resp.http.content-encoding == "gzip" expect resp.http.vary == "Accept-Encoding" gunzip expect resp.bodylen == 100 txreq -url "/plain/accept-encoding-invalid" \ -hdr "Accept-Encoding: invalid" rxresp expect resp.status == 200 expect resp.http.vary == "" expect resp.bodylen == 100 txreq -url "/plain/accept-encoding-null" rxresp expect resp.status == 200 expect resp.http.vary == "" expect resp.bodylen == 100 txreq -url "/html/accept-encoding-gzip" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 200 expect resp.http.vary == "" expect resp.bodylen == 100 txreq -url "/html/accept-encoding-invalid" \ -hdr "Accept-Encoding: invalid" rxresp expect resp.status == 200 expect resp.http.vary == "" expect resp.bodylen == 100 txreq -url "/html/accept-encoding-null" rxresp expect resp.status == 200 expect resp.http.vary == "" expect resp.bodylen == 100 txreq -url "/dup-etag/accept-encoding-gzip" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 200 expect resp.http.vary == "" expect resp.bodylen == 100 } -run # This Client duplicates c1, against the "nothing" frontend, ensuring no Vary header is ever set. client c2 -connect ${h1_fe_nothing_sock} { txreq -url "/plain/accept-encoding-gzip" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 200 expect resp.http.vary == "" expect resp.bodylen == 100 txreq -url "/plain/accept-encoding-invalid" \ -hdr "Accept-Encoding: invalid" rxresp expect resp.status == 200 expect resp.http.vary == "" expect resp.bodylen == 100 txreq -url "/plain/accept-encoding-null" rxresp expect resp.status == 200 expect resp.http.vary == "" expect resp.bodylen == 100 txreq -url "/html/accept-encoding-gzip" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 200 expect resp.http.vary == "" expect resp.bodylen == 100 txreq -url "/html/accept-encoding-invalid" \ -hdr "Accept-Encoding: invalid" rxresp expect resp.status == 200 expect resp.http.vary == "" expect resp.bodylen == 100 txreq -url "/html/accept-encoding-null" rxresp expect resp.status == 200 expect resp.http.vary == "" expect resp.bodylen == 100 txreq -url "/dup-etag/accept-encoding-gzip" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 200 expect resp.http.vary == "" expect resp.bodylen == 100 } -run client c3 -connect ${h1_fe_vary_sock} { txreq -url "/vary/no-vary" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 200 expect resp.http.content-encoding == "gzip" expect resp.http.vary == "Accept-Encoding" gunzip expect resp.bodylen == 100 txreq -url "/vary/accept-encoding" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 200 expect resp.http.content-encoding == "gzip" expect resp.http.vary == "Accept-Encoding" gunzip expect resp.bodylen == 100 txreq -url "/vary/other" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 200 expect resp.http.content-encoding == "gzip" expect resp.http.vary == "Other,Accept-Encoding" gunzip expect resp.bodylen == 100 txreq -url "/vary/accept-encoding-and-other" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 200 expect resp.http.content-encoding == "gzip" expect resp.http.vary == "Accept-Encoding,Other" gunzip expect resp.bodylen == 100 txreq -url "/vary/other-and-accept-encoding" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 200 expect resp.http.content-encoding == "gzip" expect resp.http.vary == "Other,Accept-Encoding" gunzip expect resp.bodylen == 100 txreq -url "/vary/empty" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 200 expect resp.http.content-encoding == "gzip" expect resp.http.vary == "Accept-Encoding" gunzip expect resp.bodylen == 100 } -run