[4.0] c48e48a Fix IMS fetching of ESI objects.

Poul-Henning Kamp phk at FreeBSD.org
Thu Mar 13 10:24:30 CET 2014


commit c48e48ad2cbf2bb4b8e957baeeed2784123dffd1
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Mar 4 10:22:43 2014 +0000

    Fix IMS fetching of ESI objects.
    
    Fixes #1442

diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 8672375..2d5f5ae 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -584,7 +584,14 @@ vbf_stp_condfetch(struct worker *wrk, struct busyobj *bo)
 	obj->gzip_last = bo->ims_obj->gzip_last;
 	obj->gzip_stop = bo->ims_obj->gzip_stop;
 
-	XXXAZ(bo->ims_obj->esidata);
+	if (bo->ims_obj->esidata != NULL) {
+		obj->esidata = STV_alloc(bo, bo->ims_obj->esidata->len);
+		XXXAN(obj->esidata);
+		xxxassert(obj->esidata->space >= bo->ims_obj->esidata->len);
+		memcpy(obj->esidata->ptr, bo->ims_obj->esidata->ptr,
+		    bo->ims_obj->esidata->len);
+		obj->esidata->len = bo->ims_obj->esidata->len;
+	}
 
 	if (bo->ims_obj->vary != NULL) {
 		obj->vary = (void *)WS_Copy(obj->http->ws,
@@ -601,10 +608,10 @@ vbf_stp_condfetch(struct worker *wrk, struct busyobj *bo)
 
 
 	AZ(WS_Overflowed(bo->ws_o));
-	VBO_setstate(bo, BOS_STREAM);
+	if (bo->do_stream)
+		VBO_setstate(bo, BOS_STREAM);
 	HSH_Unbusy(&wrk->stats, obj->objcore);
 
-
 	st = NULL;
 	al = 0;
 
diff --git a/bin/varnishtest/tests/r01442.vtc b/bin/varnishtest/tests/r01442.vtc
new file mode 100644
index 0000000..939d5c9
--- /dev/null
+++ b/bin/varnishtest/tests/r01442.vtc
@@ -0,0 +1,31 @@
+varnishtest "ESI + IMS"
+
+server s1 {
+	rxreq
+	txresp -hdr "Last-Modified: Thu, 26 Jun 2008 12:00:01 GMT" \
+		-body {<html><esi:remove>bla bla bla</esi:remove></html>}
+	rxreq
+	expect req.http.if-modified-since == "Thu, 26 Jun 2008 12:00:01 GMT"
+	txresp -status "304" -hdr "Last-Modified: Thu, 26 Jun 2008 12:00:01 GMT" -nolen
+
+} -start
+
+varnish v1 -vcl+backend {
+	sub vcl_backend_response {
+		set beresp.do_esi = true;
+		set beresp.grace = 0s;
+		set beresp.keep = 60s;
+		set beresp.ttl = 1s;
+	}
+} -start
+
+client c1 {
+	txreq
+	rxresp
+	expect resp.bodylen == 13
+	delay 3
+	txreq
+	rxresp
+	expect resp.bodylen == 13
+} -run
+



More information about the varnish-commit mailing list