Commit a7c18717 authored by Tollef Fog Heen's avatar Tollef Fog Heen

Round down synthesized last-modified timestamp in object

Commit 3bd239e9 makes it so we set the
object's last-modified timestamp to the current timestamp if there's
no Last-Modified header.  This makes it so we can do conditional gets
even when there's no Last-Modified or ETag header from the backend.
However, the time entered was a float, so we effectively ended up with
an off-by-up-to-one-minus-epsilon error.  This lead to requests ending
up in a 304/200 response code round-dance.

We now round the timestamp down to the nearest whole second instead,
which should fix this bug.  Thanks to lrowe for a helpful bug report.

Fixes: #907
parent 42b9b11b
......@@ -785,7 +785,7 @@ cnt_fetchbody(struct sess *sp)
if (http_GetHdr(hp, H_Last_Modified, &b))
sp->obj->last_modified = TIM_parse(b);
else
sp->obj->last_modified = sp->wrk->entered;
sp->obj->last_modified = floor(sp->wrk->entered);
assert(WRW_IsReleased(sp->wrk));
......
varnishtest "Ticket #907 200/304 handling with Etags + Last-Modified"
server s1 {
rxreq
txresp \
-hdr "ETag: saengei1Ohshicich4iteesu"
} -start
varnish v1 -vcl+backend {
sub vcl_deliver {
set resp.http.x-timestamp = now;
}
} -start
client c1 {
txreq -hdr "If-None-Match: saengei1Ohshicich4iteesu"
rxresp
expect resp.status == 304
txreq -hdr "If-None-Match: saengei1Ohshicich4iteesu" \
-hdr "If-Modified-Since: ${date}"
rxresp
expect resp.status == 304
} -run
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment