haproxy/reg-tests/cache/vary_accept_encoding.vtc
Willy Tarreau f673923629 REGTESTS: extend the default I/O timeouts and make them overridable
With the CI occasionally slowing down, we're starting to see again some
spurious failures despite the long 1-second timeouts. This reports false
positives that are disturbing and doesn't provide as much value as this
could. However at this delay it already becomes a pain for developers
to wait for the tests to complete.

This commit adds support for the new environment variable
HAPROXY_TEST_TIMEOUT that will allow anyone to modify the connect,
client and server timeouts. It was set to 5 seconds by default, which
should be plenty for quite some time in the CI. All relevant values
that were 200ms or above were replaced by this one. A few larger
values were left as they are special. One test for the set-timeout
action that used to rely on a fixed 1-sec value was extended to a
fixed 5-sec, as the timeout is normally not reached, but it needs
to be known to compare the old and new values.
2021-11-18 17:57:11 +01:00

334 lines
11 KiB
Plaintext

varnishtest "Check the Accept-Encoding processing implemented in the Vary mechanism"
#REQUIRE_VERSION=2.4
feature ignore_unknown_macro
server s1 {
# Response varying on "accept-encoding" with a gzip content-encoding
rxreq
expect req.url == "/accept-encoding"
txresp -hdr "Content-Encoding: gzip" \
-hdr "Vary: accept-encoding" \
-hdr "Cache-Control: max-age=5" \
-bodylen 45
# Response varying on "accept-encoding" with a deflate content-encoding
rxreq
expect req.url == "/accept-encoding"
txresp -hdr "Content-Encoding: deflate" \
-hdr "Vary: accept-encoding" \
-hdr "Cache-Control: max-age=5" \
-bodylen 55
# Response varying on "accept-encoding" with no content-encoding (identity)
rxreq
expect req.url == "/accept-encoding-identity"
txresp -hdr "Vary: accept-encoding" \
-hdr "Cache-Control: max-age=5" \
-bodylen 65
# Response varying on "accept-encoding" with refused identity encoding
rxreq
expect req.url == "/accept-encoding-identity"
txresp -hdr "Vary: accept-encoding" \
-hdr "Cache-Control: max-age=5" \
-hdr "Content-Encoding: deflate" \
-bodylen 75
rxreq
expect req.url == "/accept-encoding-star"
txresp -hdr "Vary: accept-encoding" \
-hdr "Cache-Control: max-age=5" \
-hdr "Content-Encoding: br" \
-bodylen 89
rxreq
expect req.url == "/accept-encoding-star"
txresp -hdr "Vary: accept-encoding" \
-hdr "Cache-Control: max-age=5" \
-hdr "Content-Encoding: deflate" \
-bodylen 99
rxreq
expect req.url == "/multiple-content-encoding"
txresp -hdr "Vary: accept-encoding" \
-hdr "Cache-Control: max-age=5" \
-hdr "Content-Encoding: deflate, gzip" \
-bodylen 109
rxreq
expect req.url == "/unknown-content-encoding"
txresp -hdr "Vary: accept-encoding" \
-hdr "Cache-Control: max-age=5" \
-hdr "Content-Encoding: unknown_encoding" \
-bodylen 119
rxreq
expect req.url == "/unknown-content-encoding"
txresp -hdr "Vary: accept-encoding" \
-hdr "Cache-Control: max-age=5" \
-hdr "Content-Encoding: unknown_encoding" \
-bodylen 119
rxreq
expect req.url == "/hash-collision"
txresp -hdr "Vary: accept-encoding" \
-hdr "Cache-Control: max-age=5" \
-hdr "Content-Encoding: br" \
-bodylen 129
rxreq
expect req.url == "/hash-collision"
txresp -hdr "Vary: accept-encoding" \
-hdr "Cache-Control: max-age=5" \
-hdr "Content-Encoding: gzip" \
-bodylen 139
} -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
bind "fd@${fe}"
default_backend test
backend test
http-request cache-use my_cache
server www ${s1_addr}:${s1_port}
http-response cache-store my_cache
http-response set-header X-Cache-Hit %[res.cache_hit]
cache my_cache
total-max-size 3
max-age 20
max-object-size 3072
process-vary on
} -start
client c1 -connect ${h1_fe_sock} {
#
# Accept-Encoding Vary
#
# First request
txreq -url "/accept-encoding" -hdr "Accept-Encoding: gzip"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "gzip"
expect resp.bodylen == 45
# Regular case
txreq -url "/accept-encoding" -hdr "Accept-Encoding: gzip"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "gzip"
expect resp.bodylen == 45
expect resp.http.X-Cache-Hit == 1
# Regular case with upper case encoding
txreq -url "/accept-encoding" -hdr "Accept-Encoding: GZIP"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "gzip"
expect resp.bodylen == 45
expect resp.http.X-Cache-Hit == 1
# Multiple accepted encodings (all standard)
txreq -url "/accept-encoding" -hdr "Accept-Encoding: deflate,gzip"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "gzip"
expect resp.bodylen == 45
expect resp.http.X-Cache-Hit == 1
# Multiple accept-encoding headers + non-standard accepted encodings
txreq -url "/accept-encoding" -hdr "Accept-Encoding: first_encoding,second_encoding" -hdr "Accept-Encoding: gzip"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "gzip"
expect resp.bodylen == 45
expect resp.http.X-Cache-Hit == 1
# Regular case with positive weight
txreq -url "/accept-encoding" -hdr "Accept-Encoding: gzip;q=0.8"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "gzip"
expect resp.bodylen == 45
expect resp.http.X-Cache-Hit == 1
# Regular case with positive weight and extra whitespaces
txreq -url "/accept-encoding" -hdr "Accept-Encoding: gzip ; q=0.8"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "gzip"
expect resp.bodylen == 45
expect resp.http.X-Cache-Hit == 1
# Regular case with null weight
txreq -url "/accept-encoding" -hdr "Accept-Encoding: deflate;q=0.8, gzip;q=0"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "deflate"
expect resp.bodylen == 55
expect resp.http.X-Cache-Hit == 0
#
# Identity tests
#
txreq -url "/accept-encoding-identity"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "<undef>"
expect resp.bodylen == 65
expect resp.http.X-Cache-Hit == 0
# Regular case
txreq -url "/accept-encoding-identity"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "<undef>"
expect resp.bodylen == 65
expect resp.http.X-Cache-Hit == 1
# Identity is allowed by default even if another encoding is specified
txreq -url "/accept-encoding-identity" -hdr "Accept-Encoding: gzip"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "<undef>"
expect resp.bodylen == 65
expect resp.http.X-Cache-Hit == 1
# Refused identity encoding (explicit null weight)
txreq -url "/accept-encoding-identity" -hdr "Accept-Encoding: deflate, identity;q=0"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "deflate"
expect resp.bodylen == 75
expect resp.http.X-Cache-Hit == 0
#
# Star tests
#
txreq -url "/accept-encoding-star" -hdr "Accept-Encoding: *"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "br"
expect resp.bodylen == 89
expect resp.http.X-Cache-Hit == 0
# Regular case
txreq -url "/accept-encoding-star" -hdr "Accept-Encoding: *"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "br"
expect resp.bodylen == 89
expect resp.http.X-Cache-Hit == 1
# Reject some encodings
txreq -url "/accept-encoding-star" -hdr "Accept-Encoding: gzip;q=0, deflate,*"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "br"
expect resp.bodylen == 89
expect resp.http.X-Cache-Hit == 1
# Weighted star
txreq -url "/accept-encoding-star" -hdr "Accept-Encoding: gzip;q=0, deflate,*;q=0.1"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "br"
expect resp.bodylen == 89
expect resp.http.X-Cache-Hit == 1
# Rejected identity
txreq -url "/accept-encoding-star" -hdr "Accept-Encoding: gzip;q=0, deflate,*;q=0.1,identity;q=0"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "br"
expect resp.bodylen == 89
expect resp.http.X-Cache-Hit == 1
# Rejected star and "br" not accepted
txreq -url "/accept-encoding-star" -hdr "Accept-Encoding: gzip;q=0, deflate,*;q=0"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "deflate"
expect resp.bodylen == 99
expect resp.http.X-Cache-Hit == 0
#
# Multiple content-encodings
#
txreq -url "/multiple-content-encoding" -hdr "Accept-Encoding: gzip;q=0.8, deflate"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "deflate, gzip"
expect resp.bodylen == 109
expect resp.http.X-Cache-Hit == 0
txreq -url "/multiple-content-encoding" -hdr "Accept-Encoding: deflate,gzip;q=0.7"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "deflate, gzip"
expect resp.bodylen == 109
expect resp.http.X-Cache-Hit == 1
#
# Unknown content-encoding
# The response should not be cached since it has an unknown content encoding
#
txreq -url "/unknown-content-encoding" -hdr "Accept-Encoding: gzip;q=0.8, deflate, first_encoding"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "unknown_encoding"
expect resp.bodylen == 119
expect resp.http.X-Cache-Hit == 0
txreq -url "/unknown-content-encoding" -hdr "Accept-Encoding: deflate,gzip;q=0.8, first_encoding"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "unknown_encoding"
expect resp.bodylen == 119
expect resp.http.X-Cache-Hit == 0
#
# Hash collision (https://github.com/haproxy/haproxy/issues/988)
#
# crc32(gzip) ^ crc32(br) ^ crc32(xxx) ^ crc32(jdcqiab) == crc32(gzip)
txreq -url "/hash-collision" -hdr "Accept-Encoding: br,gzip,xxx,jdcqiab"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "br"
expect resp.bodylen == 129
expect resp.http.X-Cache-Hit == 0
txreq -url "/hash-collision" -hdr "Accept-Encoding: gzip"
rxresp
expect resp.status == 200
expect resp.http.content-encoding == "gzip"
expect resp.bodylen == 139
expect resp.http.X-Cache-Hit == 0
} -run