varnishtest "Caching rules test" # A response will not be cached unless it has an explicit age (Cache-Control max-age of s-maxage, Expires) or a validator (Last-Modified, or ETag) # A response will not be cached either if it has an Age header that is either invalid (should be an integer) or greater than its max age. #REQUIRE_VERSION=2.4 feature ignore_unknown_macro server s1 { rxreq expect req.url == "/max-age" txresp -hdr "Cache-Control: max-age=5" \ -bodylen 150 rxreq expect req.url == "/s-maxage" txresp -hdr "Cache-Control: s-maxage=5" \ -bodylen 160 rxreq expect req.url == "/last-modified" txresp -hdr "Last-Modified: Thu, 22 Oct 2020 16:51:12 GMT" \ -bodylen 180 rxreq expect req.url == "/etag" txresp -hdr "ETag: \"etag\"" \ -bodylen 190 rxreq expect req.url == "/uncacheable" txresp \ -bodylen 200 rxreq expect req.url == "/uncacheable" txresp \ -bodylen 210 # Age response header checks # Invalid age rxreq expect req.url == "/invalid_age" txresp -hdr "Cache-Control: max-age=5" \ -hdr "Age: abc" -bodylen 120 rxreq expect req.url == "/invalid_age" txresp -hdr "Cache-Control: max-age=5" \ -hdr "Age: abc" -bodylen 120 # Old age (greater than max age) rxreq expect req.url == "/old_age" txresp -hdr "Cache-Control: max-age=5" \ -hdr "Age: 10" -bodylen 130 rxreq expect req.url == "/old_age" txresp -hdr "Cache-Control: max-age=5" \ -hdr "Age: 10" -bodylen 130 # Good age rxreq expect req.url == "/good_age" txresp -hdr "Cache-Control: max-age=500" \ -hdr "Age: 100" -bodylen 140 # "Control-Cache: no-cache" on client request but still stored in cache rxreq expect req.url == "/nocache" txresp -hdr "Cache-Control: max-age=500" \ -hdr "Age: 100" -bodylen 140 rxreq expect req.url == "/nocache" txresp -hdr "Cache-Control: max-age=500" \ -hdr "Age: 100" -bodylen 140 # max-age=0 rxreq expect req.url == "/maxage_zero" txresp -hdr "Cache-Control: max-age=0" \ -bodylen 150 rxreq expect req.url == "/maxage_zero" txresp -hdr "Cache-Control: max-age=0" \ -bodylen 150 # Overridden null max-age rxreq expect req.url == "/overridden" txresp -hdr "Cache-Control: max-age=1, s-maxage=5" \ -bodylen 160 rxreq expect req.url == "/overridden_null_maxage" txresp -hdr "Cache-Control: max-age=0, s-maxage=5" \ -bodylen 190 } -start server s2 { rxreq expect req.url == "/expires" # Expires header is filled directly by the expires_be backend" txresp \ -bodylen 170 } -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}" use_backend expires_be if { path_beg /expires } default_backend test backend expires_be http-request cache-use my_cache server www ${s2_addr}:${s2_port} http-response set-header X-Cache-Hit %[res.cache_hit] # Expires value set in the future (current_time+5s) http-response set-header Expires %[date(5),http_date] http-response cache-store my_cache 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 } -start client c1 -connect ${h1_fe_sock} { txreq -url "/max-age" rxresp expect resp.status == 200 expect resp.bodylen == 150 txreq -url "/max-age" rxresp expect resp.status == 200 expect resp.bodylen == 150 expect resp.http.X-Cache-Hit == 1 txreq -url "/s-maxage" rxresp expect resp.status == 200 expect resp.bodylen == 160 txreq -url "/s-maxage" rxresp expect resp.status == 200 expect resp.bodylen == 160 expect resp.http.X-Cache-Hit == 1 txreq -url "/expires" rxresp expect resp.status == 200 expect resp.bodylen == 170 txreq -url "/expires" rxresp expect resp.status == 200 expect resp.bodylen == 170 expect resp.http.X-Cache-Hit == 1 txreq -url "/last-modified" rxresp expect resp.status == 200 expect resp.bodylen == 180 txreq -url "/last-modified" rxresp expect resp.status == 200 expect resp.bodylen == 180 expect resp.http.X-Cache-Hit == 1 txreq -url "/etag" rxresp expect resp.status == 200 expect resp.bodylen == 190 txreq -url "/etag" rxresp expect resp.status == 200 expect resp.bodylen == 190 expect resp.http.X-Cache-Hit == 1 # The next response should not be cached txreq -url "/uncacheable" rxresp expect resp.status == 200 expect resp.bodylen == 200 txreq -url "/uncacheable" rxresp expect resp.status == 200 expect resp.bodylen == 210 expect resp.http.X-Cache-Hit == 0 # Age header tests txreq -url "/invalid_age" rxresp expect resp.status == 200 expect resp.bodylen == 120 expect resp.http.X-Cache-Hit == 0 txreq -url "/invalid_age" rxresp expect resp.status == 200 expect resp.bodylen == 120 expect resp.http.X-Cache-Hit == 0 txreq -url "/old_age" rxresp expect resp.status == 200 expect resp.bodylen == 130 expect resp.http.X-Cache-Hit == 0 txreq -url "/old_age" rxresp expect resp.status == 200 expect resp.bodylen == 130 expect resp.http.X-Cache-Hit == 0 txreq -url "/good_age" rxresp expect resp.status == 200 expect resp.bodylen == 140 expect resp.http.X-Cache-Hit == 0 txreq -url "/good_age" rxresp expect resp.status == 200 expect resp.bodylen == 140 expect resp.http.X-Cache-Hit == 1 # Cache-Control: no-cache txreq -url "/nocache" -hdr "Cache-Control: no-cache" rxresp expect resp.status == 200 expect resp.bodylen == 140 expect resp.http.X-Cache-Hit == 0 txreq -url "/nocache" -hdr "Cache-Control: no-cache" rxresp expect resp.status == 200 expect resp.bodylen == 140 expect resp.http.X-Cache-Hit == 0 txreq -url "/nocache" rxresp expect resp.status == 200 expect resp.bodylen == 140 expect resp.http.X-Cache-Hit == 1 # max-age=0 (control test for the overridden null max-age test below) txreq -url "/maxage_zero" rxresp expect resp.status == 200 expect resp.bodylen == 150 expect resp.http.X-Cache-Hit == 0 txreq -url "/maxage_zero" rxresp expect resp.status == 200 expect resp.bodylen == 150 expect resp.http.X-Cache-Hit == 0 # Overridden max-age directive txreq -url "/overridden" rxresp expect resp.status == 200 expect resp.bodylen == 160 expect resp.http.X-Cache-Hit == 0 txreq -url "/overridden" rxresp expect resp.status == 200 expect resp.bodylen == 160 expect resp.http.X-Cache-Hit == 1 txreq -url "/overridden_null_maxage" rxresp expect resp.status == 200 expect resp.bodylen == 190 expect resp.http.X-Cache-Hit == 0 # The previous response should have been cached even if it had # a max-age=0 since it also had a positive s-maxage txreq -url "/overridden_null_maxage" rxresp expect resp.status == 200 expect resp.bodylen == 190 expect resp.http.X-Cache-Hit == 1 } -run