[master] bab1226 Use RFC5861::stale-while-revalidate to initialize beresp.grace

Poul-Henning Kamp phk at FreeBSD.org
Tue Oct 7 11:03:59 CEST 2014


commit bab12263b1561c3d45e5bc6a0ab9b66e8b0ed115
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Oct 7 09:03:28 2014 +0000

    Use RFC5861::stale-while-revalidate to initialize beresp.grace
    
    Submitted by:	fgs

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 056f61e..254c22e 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -1158,6 +1158,7 @@ unsigned RFC2616_Req_Gzip(const struct http *);
 int RFC2616_Do_Cond(const struct req *sp);
 void RFC2616_Weaken_Etag(struct http *hp);
 void RFC2616_Vary_AE(struct http *hp);
+void RFC5861_Stale(const struct busyobj *);
 
 /* stevedore.c */
 int STV_NewObject(struct objcore *, struct worker *,
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 674845d..2f9ab92 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -365,6 +365,8 @@ vbf_stp_startfetch(struct worker *wrk, struct busyobj *bo)
 	EXP_Clr(&bo->fetch_objcore->exp);
 	RFC2616_Ttl(bo, now);
 
+	RFC5861_Stale(bo);
+
 	/* private objects have negative TTL */
 	if (bo->fetch_objcore->flags & OC_F_PRIVATE)
 		bo->fetch_objcore->exp.ttl = -1.;
diff --git a/bin/varnishd/cache/cache_rfc2616.c b/bin/varnishd/cache/cache_rfc2616.c
index 20b366b..4733b56 100644
--- a/bin/varnishd/cache/cache_rfc2616.c
+++ b/bin/varnishd/cache/cache_rfc2616.c
@@ -275,3 +275,35 @@ RFC2616_Vary_AE(struct http *hp)
 		http_SetHeader(hp, "Vary: Accept-Encoding");
 	}
 }
+
+/*
+ * RFC5861 outlines a way to control the use of stale responses.
+ * We use this to initialize the grace period.
+ */
+
+void
+RFC5861_Stale(const struct busyobj *bo)
+{
+	const char *p;
+	const struct http *hp;
+	struct exp *expp;
+
+	expp = &bo->fetch_objcore->exp;
+
+	/*
+	 * If we are not meant to cache this ignore any potential
+	 * stale-while-revalidate values.
+	 */
+	if (expp->ttl < 0.)
+		return;
+
+	hp = bo->beresp;
+
+	if (http_GetHdrField(hp, H_Cache_Control,
+	    "stale-while-revalidate", &p) && p != NULL) {
+		if (*p == '-')
+			expp->grace = 0;
+		else
+			expp->grace = strtoul(p, NULL, 0);
+	}
+}
diff --git a/bin/varnishtest/tests/b00043.vtc b/bin/varnishtest/tests/b00043.vtc
new file mode 100644
index 0000000..1591a03
--- /dev/null
+++ b/bin/varnishtest/tests/b00043.vtc
@@ -0,0 +1,41 @@
+varnishtest "Test stale-while-revalidate"
+
+server s1 {
+	rxreq
+	txresp -hdr "Cache-Control: max-age=30, stale-while-revalidate=30"
+	rxreq
+	txresp -hdr "Cache-Control: max-age=0, stale-while-revalidate=30"
+	rxreq
+	txresp -hdr "Cache-Control: max-age=30, stale-while-revalidate=30" -hdr "Age: 40"
+	rxreq
+	txresp -status 500 -hdr "Cache-Control: max-age=30, stale-while-revalidate=30"
+} -start
+
+varnish v1 -vcl+backend {
+	sub vcl_backend_response {
+		set beresp.http.grace = beresp.grace;
+		set beresp.http.ttl = beresp.ttl;
+	}
+} -start
+
+client c1 {
+	txreq -url /1
+	rxresp
+	expect resp.http.grace == 30.000
+	expect resp.http.ttl == 30.000
+
+	txreq -url /2
+	rxresp
+	expect resp.http.grace == 30.000
+	expect resp.http.ttl == 0.000
+
+	txreq -url /3
+	rxresp
+	expect resp.http.grace == 30.000
+	expect resp.http.ttl == -10.000
+
+	txreq -url /4
+	rxresp
+	expect resp.http.grace == 10.000
+	expect resp.http.ttl == 0.000
+} -run



More information about the varnish-commit mailing list