[master] 94459d4 Handle the case where we receive gziped from backend, ungzip so we can do ESI, then gzip again to store it.

Poul-Henning Kamp phk at project.varnish-software.com
Sat Jan 22 14:01:56 CET 2011


commit 94459d4ab4cb9c33626b377f45dcbbec578a25c5
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Sat Jan 22 10:48:10 2011 +0000

    Handle the case where we receive gziped from backend, ungzip
    so we can do ESI, then gzip again to store it.

diff --git a/bin/varnishd/cache_esi_fetch.c b/bin/varnishd/cache_esi_fetch.c
index 7a76313..e8ccdc8 100644
--- a/bin/varnishd/cache_esi_fetch.c
+++ b/bin/varnishd/cache_esi_fetch.c
@@ -232,7 +232,7 @@ vfp_esi_bytes_ug(struct sess *sp, struct http_conn *htc, ssize_t bytes)
 		if (vef->bufp < ibuf + w) {
 			w = (ibuf + w) - vef->bufp;
 			assert(w + vef->npend < sizeof vef->pending);
-			memcpy(vef->pending + vef->npend, vef->bufp, w);
+			memmove(vef->pending + vef->npend, vef->bufp, w);
 			vef->npend += w;
 		}
 	}
@@ -246,7 +246,45 @@ vfp_esi_bytes_ug(struct sess *sp, struct http_conn *htc, ssize_t bytes)
 static int __match_proto__()
 vfp_esi_bytes_gg(struct sess *sp, struct http_conn *htc, size_t bytes)
 {
-	return (vfp_esi_bytes_uu(sp, htc, bytes));
+	ssize_t w;
+	char ibuf[1024 * params->gzip_stack_buffer];
+	char ibuf2[1024 * params->gzip_stack_buffer];
+	struct vef_priv *vef;
+	size_t dl;
+	const void *dp;
+	int i;
+
+	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+	vef = sp->wrk->vef_priv;
+	CHECK_OBJ_NOTNULL(vef, VEF_MAGIC);
+
+	while (bytes > 0) {
+		w = vef_read(htc, ibuf, sizeof ibuf, bytes);
+		if (w <= 0)
+			return (w);
+		bytes -= w;
+		
+		vef->bufp = ibuf;
+		VGZ_Ibuf(sp->wrk->vgz_rx, ibuf, w);
+		do {
+			VGZ_Obuf(sp->wrk->vgz_rx, ibuf2, sizeof ibuf2);
+			i = VGZ_Gunzip(sp->wrk->vgz_rx, &dp, &dl);
+			vef->bufp = ibuf2;
+			if (dl > 0)
+				VEP_parse(sp, ibuf2, dl);
+			if (vef->error) {
+				errno = vef->error;
+				return (-1);
+			}
+			if (vef->bufp < ibuf2 + dl) {
+				dl = (ibuf2 + dl) - vef->bufp;
+				assert(dl + vef->npend < sizeof vef->pending);
+				memmove(vef->pending + vef->npend, vef->bufp, dl);
+				vef->npend += dl;
+			}
+		} while (!VGZ_IbufEmpty(sp->wrk->vgz_rx));
+	}
+	return (1);
 }
 
 
@@ -264,7 +302,16 @@ vfp_esi_begin(struct sess *sp, size_t estimate)
 		sp->wrk->vgz_rx = VGZ_NewUngzip(sp, sp->ws);
 		VEP_Init(sp, NULL);
 	} else if (sp->wrk->is_gunzip && sp->wrk->do_gzip) {
+		vef = (void*)WS_Alloc(sp->ws, sizeof *vef);
+		AN(vef);
+		memset(vef, 0, sizeof *vef);
+		vef->magic = VEF_MAGIC;
+		vef->vgz = VGZ_NewGzip(sp, sp->ws);
+		AZ(sp->wrk->vef_priv);
+		sp->wrk->vef_priv = vef;
 		VEP_Init(sp, vfp_vep_callback);
+	} else if (sp->wrk->is_gzip) {
+		sp->wrk->vgz_rx = VGZ_NewUngzip(sp, sp->ws);
 		vef = (void*)WS_Alloc(sp->ws, sizeof *vef);
 		AN(vef);
 		memset(vef, 0, sizeof *vef);
@@ -272,6 +319,7 @@ vfp_esi_begin(struct sess *sp, size_t estimate)
 		vef->vgz = VGZ_NewGzip(sp, sp->ws);
 		AZ(sp->wrk->vef_priv);
 		sp->wrk->vef_priv = vef;
+		VEP_Init(sp, vfp_vep_callback);
 	} else {
 		VEP_Init(sp, NULL);
 	}
@@ -325,7 +373,6 @@ vfp_esi_end(struct sess *sp)
 		sp->wrk->vef_priv = NULL;
 		CHECK_OBJ_NOTNULL(vef, VEF_MAGIC);
 		XXXAZ(vef->error);
-		// sp->obj->len = vef->tot;
 	}
 	return (0);
 }



More information about the varnish-commit mailing list