varnishtest "Expires support"

#REQUIRE_VERSION=2.3

feature ignore_unknown_macro

server s1 {
       rxreq
       txresp -nolen -hdr "Transfer-Encoding: chunked" \
               -hdr "Cache-Control: max-age=5"
       chunkedlen 15
       chunkedlen 15
       chunkedlen 15
       chunkedlen 0
} -start

server s2 {
       rxreq
       txresp -nolen -hdr "Transfer-Encoding: chunked"
       chunkedlen 16
       chunkedlen 16
       chunkedlen 16
       chunkedlen 0
} -start

server s3 {
       rxreq
       txresp -nolen -hdr "Transfer-Encoding: chunked"
       chunkedlen 16
       chunkedlen 16
       chunkedlen 16
       chunkedlen 0

       rxreq
       txresp -nolen -hdr "Transfer-Encoding: chunked"
       chunkedlen 17
       chunkedlen 17
       chunkedlen 17
       chunkedlen 0
} -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 cache_control_be if { path_beg /cache_control }
               use_backend future_expires_be if { path_beg /future }
               default_backend past_expires_be

       backend cache_control_be
               # Expires header should be ignored since a Cache-Control one is present
               http-request cache-use my_cache
               server www ${s1_addr}:${s1_port}
               http-response set-header X-Cache-Hit %[res.cache_hit]
               http-response set-header Expires %[date(-1),http_date]
               http-response cache-store my_cache

       backend future_expires_be
               # Expires value set in the future (current_time+5s)
               http-request cache-use my_cache
               server www ${s2_addr}:${s2_port}
               http-response set-header X-Cache-Hit %[res.cache_hit]
               http-response set-header Expires %[date(5),http_date]
               http-response cache-store my_cache

       backend past_expires_be
               # Expires value set in the past
               http-request cache-use my_cache
               server www ${s3_addr}:${s3_port}
               http-response set-header X-Cache-Hit %[res.cache_hit]
               http-response set-header Expires %[date(-1),http_date]
               http-response cache-store my_cache

       cache my_cache
               total-max-size 3
               max-age 20
               max-object-size 3072
} -start


client c1 -connect ${h1_fe_sock} {
       txreq -url "/cache_control"
       rxresp
       expect resp.status == 200
       expect resp.bodylen == 45

       txreq -url "/cache_control"
       rxresp
       expect resp.status == 200
       expect resp.bodylen == 45
       expect resp.http.X-Cache-Hit == 1

       txreq -url "/future"
       rxresp
       expect resp.status == 200
       expect resp.bodylen == 48

       txreq -url "/future"
       rxresp
       expect resp.status == 200
       expect resp.bodylen == 48
       expect resp.http.X-Cache-Hit == 1

       txreq -url "/past"
       rxresp
       expect resp.status == 200
       expect resp.bodylen == 48

       txreq -url "/past"
       rxresp
       expect resp.status == 200
       expect resp.bodylen == 51
       expect resp.http.X-Cache-Hit == 0

} -run