mirror of
				https://git.haproxy.org/git/haproxy.git/
				synced 2025-10-31 16:41:01 +01:00 
			
		
		
		
	HAProxy 2.0 is the lowest supported version, thus this always matches. see 1b095cac9468d0c3eeb157e9b1a2947487bd3c83
		
			
				
	
	
		
			378 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			378 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| varnishtest "Basic compression test"
 | |
| 
 | |
| #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
 |