varnishtest "Basic compression test" #REQUIRE_VERSION=1.9 #REQUIRE_OPTION=ZLIB|SLZ feature ignore_unknown_macro server s1 { # client c1 - request 1 rxreq expect req.url == "/c1.1" expect req.http.accept-encoding == "" txresp \ -hdr "Content-Type: text/plain" \ -bodylen 100 # client c1 - request 2 rxreq expect req.url == "/c1.2" expect req.http.user-agent == "Mozilla/4" expect req.http.accept-encoding == "gzip" txresp \ -hdr "Content-Type: text/plain" \ -bodylen 100 # client c1 - request 3 rxreq expect req.url == "/c1.3" expect req.proto == "HTTP/1.0" expect req.http.accept-encoding == "gzip" txresp -bodylen 100 # client c1 - request 4 rxreq expect req.url == "/c1.4" expect req.http.accept-encoding == "gzip" txresp \ -proto "HTTP/1.0" \ -hdr "Connection: keep-alive" \ -hdr "Content-Type: text/plain" \ -bodylen 100 # client c1 - request 5 rxreq expect req.url == "/c1.5" expect req.method == "HEAD" expect req.http.accept-encoding == "gzip" txresp -nolen \ -hdr "Content-Length: 100" \ -hdr "Content-Type: text/plain" \ # client c1 - request 6 rxreq expect req.url == "/c1.6" expect req.http.accept-encoding == "gzip" txresp \ -status 400 \ -hdr "Content-Type: text/plain" \ -bodylen 100 # client c1 - request 7 rxreq expect req.url == "/c1.7" expect req.http.accept-encoding == "gzip" txresp \ -hdr "Content-Type: text/plain" \ -hdr "Content-Encoding: something" \ -body "FOO" # client c1 - request 8 rxreq expect req.url == "/c1.8" expect req.http.accept-encoding == "gzip" txresp \ -hdr "Content-Type: text/plain" \ -hdr "Cache-Control: no-transform" \ -bodylen 100 # client c1 - request 9 rxreq expect req.url == "/c1.9" expect req.http.accept-encoding == "gzip" txresp \ -hdr "Content-Type: text/css" \ -bodylen 100 # client c1 - request 10 rxreq expect req.url == "/c1.10" expect req.http.accept-encoding == "gzip" txresp \ -hdr "Content-Type: multipart/mixed; boundary=\"aaa\"" \ -bodylen 100 # Close the connection with HAProxy and wait for a new one # (C1 has finished and C2 will start) accept # client c2 - request 1 rxreq expect req.url == "/c2.1" expect req.http.accept-encoding == "gzip" txresp \ -hdr "Content-Type: text/plain" \ -bodylen 100 # client c2 - request 2 rxreq expect req.url == "/c2.2" expect req.http.accept-encoding == "gzip" txresp -nolen \ -hdr "Content-Type: text/plain" \ -hdr "Transfer-Encoding: chunked" chunkedlen 1 chunkedlen 1 chunkedlen 2 chunkedlen 3 chunkedlen 5 chunkedlen 8 chunkedlen 13 chunkedlen 21 chunkedlen 34 chunkedlen 55 chunkedlen 89 chunkedlen 144 chunkedlen 233 chunkedlen 0 # Close the connection with HAProxy and wait for a new one # (C2 has finished and C3 will start) accept # client c3 - request 1 rxreq expect req.url == "/c3.1" expect req.http.accept-encoding == "" txresp \ -hdr "Content-Type: text/plain" \ -bodylen 50000 # client c3 - request 2 rxreq expect req.url == "/c3.2" expect req.http.accept-encoding == "" txresp -nolen \ -hdr "Content-Type: text/plain" \ -hdr "Transfer-Encoding: chunked" chunkedlen 1000 chunkedlen 1000 chunkedlen 1000 chunkedlen 1000 chunkedlen 1000 chunkedlen 5000 chunkedlen 10000 chunkedlen 30000 chunkedlen 0 # Close the connection with HAProxy and wait for a new one # (C3 has finished and C4 will start) accept # client c4 - request 1 rxreq expect req.url == "/c4.1" expect req.http.accept-encoding == "" txresp \ -hdr "Content-Type: text/plain" \ -bodylen 100 # client c4 - request 2 rxreq expect req.url == "/c4.2" expect req.http.accept-encoding == "" txresp \ -hdr "Content-Type: text/plain" \ -bodylen 100 } -start haproxy h1 -conf { defaults mode http timeout connect 1s timeout client 1s timeout server 1s frontend fe-gzip bind "fd@${fe_gzip}" default_backend be-gzip frontend fe-identity bind "fd@${fe_identity}" default_backend be-identity frontend fe-gzip-deflate bind "fd@${fe_gzip_deflate}" default_backend be-gzip-defalte backend be-gzip compression algo gzip compression type text/html text/plain server www ${s1_addr}:${s1_port} backend be-identity compression algo identity server www ${s1_addr}:${s1_port} backend be-gzip-defalte compression algo gzip deflate compression offload server www ${s1_addr}:${s1_port} } -start # No compression expected because not supported by the client or because # something in the request or response headers forbids it. client c1 -connect ${h1_fe_gzip_sock} { # 1. no "Accept-Encoding header" txreq -url "/c1.1" rxresp expect resp.status == 200 expect resp.http.content-encoding == "" expect resp.http.transfer-encoding == "" expect resp.bodylen == 100 # 2. Buggy User-Agent txreq -url "/c1.2" \ -hdr "Accept-Encoding: gzip" \ -hdr "User-Agent: Mozilla/4" rxresp expect resp.status == 200 expect resp.http.content-encoding == "" expect resp.http.transfer-encoding == "" expect resp.bodylen == 100 # 3. HTTP/1.0 request txreq -url "/c1.3" \ -proto "HTTP/1.0" \ -hdr "Accept-Encoding: gzip" \ -hdr "Connection: keep-alive" rxresp expect resp.status == 200 expect resp.http.content-encoding == "" expect resp.http.transfer-encoding == "" expect resp.bodylen == 100 # 4. HTTP/1.0 response txreq -url "/c1.4" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 200 expect resp.proto == "HTTP/1.0" expect resp.http.content-encoding == "" expect resp.http.transfer-encoding == "" expect resp.bodylen == 100 # 5. HEAD method txreq -req "HEAD" -url "/c1.5" \ -hdr "Accept-Encoding: gzip" rxresp -no_obj expect resp.status == 200 expect resp.http.content-length == "100" expect resp.http.content-encoding == "" expect resp.http.transfer-encoding == "" # 6. Response status code != 20[0-3] txreq -url "/c1.6" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 400 expect resp.http.content-encoding == "" expect resp.http.transfer-encoding == "" expect resp.bodylen == 100 # 7. Response alerady compressed by the server (with "Accept-Encoding") txreq -url "/c1.7" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 200 expect resp.http.content-encoding == "something" expect resp.http.transfer-encoding == "" expect resp.bodylen == 3 expect resp.body == "FOO" # 8. Response with "Cache-Control: no-transform" txreq -url "/c1.8" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 200 expect resp.http.content-encoding == "" expect resp.http.transfer-encoding == "" expect resp.http.cache-control == "no-transform" expect resp.bodylen == 100 # 9. Response with uncompressable content-type txreq -url "/c1.9" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 200 expect resp.http.content-encoding == "" expect resp.http.transfer-encoding == "" expect resp.http.content-type == "text/css" expect resp.bodylen == 100 # 10. Response with uncompressable content-type txreq -url "/c1.10" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 200 expect resp.http.content-encoding == "" expect resp.http.transfer-encoding == "" expect resp.http.content-type == "multipart/mixed; boundary=\"aaa\"" expect resp.bodylen == 100 } -run # GZIP Compression expected (small body) client c2 -connect ${h1_fe_gzip_sock} { # 1. response from the server with a small body with a C-L txreq -url "/c2.1" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 200 expect resp.http.content-encoding == "gzip" expect resp.http.transfer-encoding == "chunked" gunzip expect resp.bodylen == 100 # 2. response from the server with a small chunked body txreq -url "/c2.2" \ -hdr "Accept-Encoding: gzip" rxresp expect resp.status == 200 expect resp.http.content-encoding == "gzip" expect resp.http.transfer-encoding == "chunked" gunzip expect resp.bodylen == 609 } -run # Identity compression expect (Huge body) # Identity is used because of a limitation of vtest (the uncompressed body size # must be lower than 10 times of the compressed one) client c3 -connect ${h1_fe_identity_sock} { # 1. response from the server with a huge body with a C-L txreq -url "/c3.1" rxresp expect resp.status == 200 expect resp.http.content-encoding == "" expect resp.http.transfer-encoding == "chunked" expect resp.bodylen == 50000 # 2. response from the server with a huge chunked body txreq -url "/c3.2" rxresp expect resp.status == 200 expect resp.http.content-encoding == "" expect resp.http.transfer-encoding == "chunked" expect resp.bodylen == 50000 } -run # Compression expected with priority client c4 -connect ${h1_fe_gzip_deflate_sock} { # 1. response from the server with a small body with a C-L txreq -url "/c4.1" \ -hdr "Accept-Encoding: *;q=0, gzip;q=0.750, deflate;q=0.500" rxresp expect resp.status == 200 expect resp.http.content-encoding == "gzip" expect resp.http.transfer-encoding == "chunked" # 2. response from the server with a small body with a C-L txreq -url "/c4.2" \ -hdr "Accept-Encoding: *;q=0, gzip;q=0.500, deflate;q=0.750" rxresp expect resp.status == 200 expect resp.http.content-encoding == "deflate" expect resp.http.transfer-encoding == "chunked" } -run