mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-24 21:52:17 +00:00
f673923629
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.
379 lines
11 KiB
Plaintext
379 lines
11 KiB
Plaintext
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
|
|
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
|
|
|
|
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
|