varnishtest "Compression converts strong ETags to weak ETags"

#REQUIRE_OPTION=ZLIB|SLZ

feature ignore_unknown_macro

server s1 {
        rxreq
        expect req.url == "/strong"
        expect req.http.accept-encoding == "gzip"
        txresp \
          -hdr "Content-Type: text/plain" \
          -hdr "ETag: \"123\"" \
          -bodylen 100

        rxreq
        expect req.url == "/weak"
        expect req.http.accept-encoding == "gzip"
        txresp \
          -hdr "Content-Type: text/plain" \
          -hdr "ETag: W/\"456\"" \
          -bodylen 100

        rxreq
        expect req.url == "/weak-incorrect-quoting"
        expect req.http.accept-encoding == "gzip"
        txresp \
          -hdr "Content-Type: text/plain" \
          -hdr "ETag: \"W/789\"" \
          -bodylen 100

        rxreq
        expect req.url == "/empty-strong"
        expect req.http.accept-encoding == "gzip"
        txresp \
          -hdr "Content-Type: text/plain" \
          -hdr "ETag: \"\"" \
          -bodylen 100

        rxreq
        expect req.url == "/empty-weak"
        expect req.http.accept-encoding == "gzip"
        txresp \
          -hdr "Content-Type: text/plain" \
          -hdr "ETag: W/\"\"" \
          -bodylen 100

        rxreq
        expect req.url == "/invalid1"
        expect req.http.accept-encoding == "gzip"
        txresp \
          -hdr "Content-Type: text/plain" \
          -hdr "ETag: \"invalid" \
          -bodylen 100

        rxreq
        expect req.url == "/invalid2"
        expect req.http.accept-encoding == "gzip"
        txresp \
          -hdr "Content-Type: text/plain" \
          -hdr "ETag: invalid\"" \
          -bodylen 100

        rxreq
        expect req.url == "/invalid3"
        expect req.http.accept-encoding == "gzip"
        txresp \
          -hdr "Content-Type: text/plain" \
          -hdr "ETag: invalid" \
          -bodylen 100

        rxreq
        expect req.url == "/invalid4"
        expect req.http.accept-encoding == "gzip"
        txresp \
          -hdr "Content-Type: text/plain" \
          -hdr "ETag: W/\"invalid" \
          -bodylen 100

        rxreq
        expect req.url == "/invalid5"
        expect req.http.accept-encoding == "gzip"
        txresp \
          -hdr "Content-Type: text/plain" \
          -hdr "ETag: W/invalid\"" \
          -bodylen 100

        rxreq
        expect req.url == "/invalid6"
        expect req.http.accept-encoding == "gzip"
        txresp \
          -hdr "Content-Type: text/plain" \
          -hdr "ETag: W/invalid" \
          -bodylen 100

        rxreq
        expect req.url == "/multiple"
        expect req.http.accept-encoding == "gzip"
        txresp \
          -hdr "Content-Type: text/plain" \
          -hdr "ETag: \"one\"" \
          -hdr "ETag: \"two\"" \
          -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/html text/plain
        server www ${s1_addr}:${s1_port}
} -start

client c1 -connect ${h1_fe_gzip_sock} {
        txreq -url "/strong" \
          -hdr "Accept-Encoding: gzip"
        rxresp
        expect resp.status == 200
        expect resp.http.content-encoding == "gzip"
        expect resp.http.etag == "W/\"123\""
        gunzip
        expect resp.bodylen == 100

        txreq -url "/weak" \
          -hdr "Accept-Encoding: gzip"
        rxresp
        expect resp.status == 200
        expect resp.http.content-encoding == "gzip"
        expect resp.http.etag == "W/\"456\""
        gunzip
        expect resp.bodylen == 100

        txreq -url "/weak-incorrect-quoting" \
          -hdr "Accept-Encoding: gzip"
        rxresp
        expect resp.status == 200
        expect resp.http.content-encoding == "gzip"
        expect resp.http.etag == "W/\"W/789\""
        gunzip
        expect resp.bodylen == 100

        txreq -url "/empty-strong" \
          -hdr "Accept-Encoding: gzip"
        rxresp
        expect resp.status == 200
        expect resp.http.content-encoding == "gzip"
        expect resp.http.etag == "W/\"\""
        gunzip
        expect resp.bodylen == 100

        txreq -url "/empty-weak" \
          -hdr "Accept-Encoding: gzip"
        rxresp
        expect resp.status == 200
        expect resp.http.content-encoding == "gzip"
        expect resp.http.etag == "W/\"\""
        gunzip
        expect resp.bodylen == 100

        txreq -url "/invalid1" \
          -hdr "Accept-Encoding: gzip"
        rxresp
        expect resp.status == 200
        expect resp.http.content-encoding == "<undef>"
        expect resp.http.etag == "\"invalid"
        expect resp.bodylen == 100

        txreq -url "/invalid2" \
          -hdr "Accept-Encoding: gzip"
        rxresp
        expect resp.status == 200
        expect resp.http.content-encoding == "<undef>"
        expect resp.http.etag == "invalid\""
        expect resp.bodylen == 100

        txreq -url "/invalid3" \
          -hdr "Accept-Encoding: gzip"
        rxresp
        expect resp.status == 200
        expect resp.http.content-encoding == "<undef>"
        expect resp.http.etag == "invalid"
        expect resp.bodylen == 100

        txreq -url "/invalid4" \
          -hdr "Accept-Encoding: gzip"
        rxresp
        expect resp.status == 200
        expect resp.http.content-encoding == "<undef>"
        expect resp.http.etag == "W/\"invalid"
        expect resp.bodylen == 100

        txreq -url "/invalid5" \
          -hdr "Accept-Encoding: gzip"
        rxresp
        expect resp.status == 200
        expect resp.http.content-encoding == "<undef>"
        expect resp.http.etag == "W/invalid\""
        expect resp.bodylen == 100

        txreq -url "/invalid6" \
          -hdr "Accept-Encoding: gzip"
        rxresp
        expect resp.status == 200
        expect resp.http.content-encoding == "<undef>"
        expect resp.http.etag == "W/invalid"
        expect resp.bodylen == 100

        txreq -url "/multiple" \
          -hdr "Accept-Encoding: gzip"
        rxresp
        expect resp.status == 200
        expect resp.http.content-encoding == "<undef>"
        expect resp.bodylen == 100
} -run
