When tearing down the ESI data structures, propagate the gzip crc
checksum up the stack.

Fixes: #1781
---
 bin/varnishd/cache/cache_esi_deliver.c |  8 +++++++-
 bin/varnishtest/tests/r01781.vtc       | 27 +++++++++++++++++++++++++++
 2 files changed, 34 insertions(+), 1 deletion(-)
 create mode 100644 bin/varnishtest/tests/r01781.vtc

diff --git a/bin/varnishd/cache/cache_esi_deliver.c 
b/bin/varnishd/cache/cache_esi_deliver.c
index ff30ae3..1d617b8 100644
--- a/bin/varnishd/cache/cache_esi_deliver.c
+++ b/bin/varnishd/cache/cache_esi_deliver.c
@@ -228,7 +228,7 @@ VDP_ESI(struct req *req, enum vdp_action act, void **priv,
        uint32_t icrc = 0;
        uint8_t tailbuf[8 + 5];
        const uint8_t *pp;
-       struct ecx *ecx;
+       struct ecx *ecx, *pecx;
        int retval = 0;
 
        if (act == VDP_INIT) {
@@ -241,6 +241,12 @@ VDP_ESI(struct req *req, enum vdp_action act, void **priv,
        }
        CAST_OBJ_NOTNULL(ecx, *priv, ECX_MAGIC);
        if (act == VDP_FINI) {
+               if (req->transport->deliver == VED_Deliver) {
+                       CAST_OBJ_NOTNULL(pecx, req->transport_priv, ECX_MAGIC);
+                       pecx->crc = crc32_combine(pecx->crc,
+                           ecx->crc, ecx->l_crc);
+                       pecx->l_crc += ecx->l_crc;
+               }
                FREE_OBJ(ecx);
                *priv = NULL;
                return (0);
diff --git a/bin/varnishtest/tests/r01781.vtc b/bin/varnishtest/tests/r01781.vtc
new file mode 100644
index 0000000..5b796d8
--- /dev/null
+++ b/bin/varnishtest/tests/r01781.vtc
@@ -0,0 +1,27 @@
+varnishtest "#1781 gzip checksum with multilevel esi"
+
+server s1 {
+       rxreq
+       txresp -body {<esi:include src="/1"/>Baz}
+
+       rxreq
+       txresp -body {<esi:include src="/2"/>Bar}
+
+       rxreq
+       txresp -body {Foo}
+} -start
+
+varnish v1 -vcl+backend {
+       sub vcl_backend_response {
+               set beresp.do_gzip = true;
+               set beresp.do_esi = true;
+       }
+} -start
+
+client c1 {
+       txreq -hdr "Accept-Encoding: gzip"
+       rxresp
+       expect resp.http.content-encoding == "gzip"
+       gunzip
+       expect resp.body == "FooBarBaz"
+} -run
-- 
2.1.4


_______________________________________________
varnish-dev mailing list
[email protected]
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev

Reply via email to