CHECK_OBJ_NOTNULL(sp->obj, OBJECT_MAGIC); /* XXX */
WSP(sp, SLT_TTL, "%u VCL %.0f %.0f",
sp->obj->xid, a, sp->t_req);
- if (a < 0)
- a = 0;
- sp->obj->ttl = sp->t_req + a;
+ /*
+ * If people set obj.ttl = 0s, they don't expect it to be cacheable
+ * any longer, but it will still be for up to 1s - epsilon because
+ * of the rounding to seconds.
+ * We special case and make sure that rounding does not surprise.
+ */
+ if (a <= 0)
+ sp->obj->ttl = sp->t_req - 1;
+ else
+ sp->obj->ttl = sp->t_req + a;
EXP_Rearm(sp->obj);
}
--- /dev/null
+# $Id$
+
+test "Test that obj.ttl = 0s prevents subsequent hits"
+
+server s1 {
+ rxreq
+ expect req.url == "/foo"
+ txresp -status 200 -body "1"
+ rxreq
+ expect req.url == "/foo"
+ txresp -status 200 -body "22"
+} -start
+
+varnish v1 -vcl+backend {
+ sub vcl_hit {
+ set obj.ttl = 0s;
+ restart;
+ }
+} -start
+
+client c1 {
+ txreq -url "/foo"
+ rxresp
+ expect resp.status == 200
+ expect resp.bodylen == 1
+
+ txreq -url "/foo"
+ rxresp
+ expect resp.status == 200
+ expect resp.bodylen == 2
+} -run