REGTEST: Add a basic test for the compression
diff --git a/reg-tests/compression/h00000.vtc b/reg-tests/compression/h00000.vtc
new file mode 100644
index 0000000..6154e66
--- /dev/null
+++ b/reg-tests/compression/h00000.vtc
@@ -0,0 +1,379 @@
+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 == "<undef>"
+        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 == "<undef>"
+        txresp \
+          -hdr "Content-Type: text/plain" \
+          -bodylen 50000
+
+        # client c3 - request 2
+        rxreq
+        expect req.url == "/c3.2"
+        expect req.http.accept-encoding == "<undef>"
+        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 == "<undef>"
+        txresp \
+          -hdr "Content-Type: text/plain" \
+          -bodylen 100
+
+        # client c4 - request 2
+        rxreq
+        expect req.url == "/c4.2"
+        expect req.http.accept-encoding == "<undef>"
+        txresp \
+          -hdr "Content-Type: text/plain" \
+          -bodylen 100
+} -start
+
+
+haproxy h1 -conf {
+    defaults
+        mode http
+        ${no-htx} option http-use-htx
+        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 == "<undef>"
+        expect resp.http.transfer-encoding == "<undef>"
+        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 == "<undef>"
+        expect resp.http.transfer-encoding == "<undef>"
+        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 == "<undef>"
+        expect resp.http.transfer-encoding == "<undef>"
+        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 == "<undef>"
+        expect resp.http.transfer-encoding == "<undef>"
+        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 == "<undef>"
+        expect resp.http.transfer-encoding == "<undef>"
+
+        # 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 == "<undef>"
+        expect resp.http.transfer-encoding == "<undef>"
+        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 == "<undef>"
+        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 == "<undef>"
+        expect resp.http.transfer-encoding == "<undef>"
+        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 == "<undef>"
+        expect resp.http.transfer-encoding == "<undef>"
+        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 == "<undef>"
+        expect resp.http.transfer-encoding == "<undef>"
+        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 == "<undef>"
+        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 == "<undef>"
+        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