r3735 - in branches/2.0/varnish-cache: bin/varnishd bin/varnishtest/tests include

tfheen at projects.linpro.no tfheen at projects.linpro.no
Wed Feb 11 08:25:54 CET 2009


Author: tfheen
Date: 2009-02-11 08:25:54 +0100 (Wed, 11 Feb 2009)
New Revision: 3735

Added:
   branches/2.0/varnish-cache/bin/varnishtest/tests/e00013.vtc
   branches/2.0/varnish-cache/bin/varnishtest/tests/e00014.vtc
Modified:
   branches/2.0/varnish-cache/bin/varnishd/cache_vrt_esi.c
   branches/2.0/varnish-cache/bin/varnishtest/tests/e00007.vtc
   branches/2.0/varnish-cache/include/stat_field.h
Log:
Merge r3566: Add an (unlocked) counter for number of ESI objects we have parsed.

Add two test-cases for objects we should not esi parse.



Modified: branches/2.0/varnish-cache/bin/varnishd/cache_vrt_esi.c
===================================================================
--- branches/2.0/varnish-cache/bin/varnishd/cache_vrt_esi.c	2009-02-11 07:21:07 UTC (rev 3734)
+++ branches/2.0/varnish-cache/bin/varnishd/cache_vrt_esi.c	2009-02-11 07:25:54 UTC (rev 3735)
@@ -630,6 +630,59 @@
 	return (p);
 }
 
+/*--------------------------------------------------------------------
+ * See if this looks like XML: first non-white char must be '<'
+ */
+
+static int
+looks_like_xml(struct object *obj) {
+	struct storage *st;
+	unsigned u;
+
+	VTAILQ_FOREACH(st, &obj->store, list) {
+		AN(st);
+		for (u = 0; u < st->len; u++) {
+			if (isspace(st->ptr[u]))
+				continue;
+			if (st->ptr[u] == '<')
+				return (1);
+			else
+				return (0);
+		}
+	}
+	return (0);
+}
+
+/*--------------------------------------------------------------------
+ * A quick stroll through the object, to find out if it contains any
+ * esi sequences at all.
+ */
+
+static int
+contain_esi(struct object *obj) {
+	struct storage *st;
+	unsigned u;
+	const char *r;
+	static const char *wanted = "<esi:";
+
+	/*
+	 * Do a fast check to see if there is any '<esi:' sequences at all
+	 */
+	r = wanted;
+	VTAILQ_FOREACH(st, &obj->store, list) {
+		AN(st);
+		for (u = 0; u < st->len; u++) {
+			if (st->ptr[u] != *r) {
+				r = wanted;
+				continue;
+			}
+			if (*++r == '\0')
+				return (1);
+		}
+	}
+	return (0);
+}
+
 /*--------------------------------------------------------------------*/
 
 void
@@ -642,6 +695,8 @@
 	char *p, *q;
 
 	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+	CHECK_OBJ_NOTNULL(sp->obj, OBJECT_MAGIC);
+
 	assert(sp->obj->busy);
 	if (sp->cur_method != VCL_MET_FETCH) {
 		/* XXX: we should catch this at compile time */
@@ -653,28 +708,25 @@
 	if (VTAILQ_EMPTY(&sp->obj->store))
 		return;
 
-	CHECK_OBJ_NOTNULL(sp->obj, OBJECT_MAGIC);
-
 	if (!(params->esi_syntax & 0x00000001)) {
 		/*
 		 * By default, we will not ESI process an object where
 		 *  the first non-space character is different from '<'
 		 */
-		st = VTAILQ_FIRST(&sp->obj->store);
-		AN(st);
-		for (u = 0; u < st->len; u++) {
-			if (isspace(st->ptr[u]))
-				continue;
-			if (st->ptr[u] == '<')
-				break;
+		if (!looks_like_xml(sp->obj)) {
 			WSP(sp, SLT_ESI_xmlerror,
-			    "No ESI processing, "
-			    "binary object: 0x%02x at pos %u.",
-			    st->ptr[u], u);
+			    "No ESI processing, first char not '<'");
 			return;
 		}
 	}
 
+	/*
+	 * Do a fast check to see if there is any '<esi:' sequences at all
+	 */
+	if (!contain_esi(sp->obj))
+		return;
+
+	VSL_stats->esi_parse++;
 	/* XXX: only if GET ? */
 	ew = eww;
 	memset(eww, 0, sizeof eww);

Modified: branches/2.0/varnish-cache/bin/varnishtest/tests/e00007.vtc
===================================================================
--- branches/2.0/varnish-cache/bin/varnishtest/tests/e00007.vtc	2009-02-11 07:21:07 UTC (rev 3734)
+++ branches/2.0/varnish-cache/bin/varnishtest/tests/e00007.vtc	2009-02-11 07:25:54 UTC (rev 3735)
@@ -22,8 +22,10 @@
 	sub vcl_fetch {
 		esi;
 	}
-} -start -cli "debug.fragfetch 32"
+} -start
 
+varnish v1 -cliok "debug.fragfetch 32"
+
 client c1 {
 	txreq -url /foo/bar -hdr "Host: froboz"
 	rxresp

Copied: branches/2.0/varnish-cache/bin/varnishtest/tests/e00013.vtc (from rev 3566, trunk/varnish-cache/bin/varnishtest/tests/e00013.vtc)
===================================================================
--- branches/2.0/varnish-cache/bin/varnishtest/tests/e00013.vtc	                        (rev 0)
+++ branches/2.0/varnish-cache/bin/varnishtest/tests/e00013.vtc	2009-02-11 07:25:54 UTC (rev 3735)
@@ -0,0 +1,25 @@
+# $Id$
+
+test "All white-space object, in multiple storage segments"
+
+server s1 {
+        rxreq
+        expect req.url == "/foo"
+        txresp -hdr "Connection: close"
+        send {                                         }
+} -start
+
+varnish v1 -vcl+backend {
+        sub vcl_fetch {
+                esi;
+        }
+} -start
+
+varnish v1 -cliok "debug.fragfetch 4"
+
+client c1 {
+        txreq -url /foo
+        rxresp
+} -run
+
+varnish v1 -expect esi_parse == 0

Copied: branches/2.0/varnish-cache/bin/varnishtest/tests/e00014.vtc (from rev 3566, trunk/varnish-cache/bin/varnishtest/tests/e00014.vtc)
===================================================================
--- branches/2.0/varnish-cache/bin/varnishtest/tests/e00014.vtc	                        (rev 0)
+++ branches/2.0/varnish-cache/bin/varnishtest/tests/e00014.vtc	2009-02-11 07:25:54 UTC (rev 3735)
@@ -0,0 +1,25 @@
+# $Id$
+
+test "Check <esi: detector"
+
+server s1 {
+        rxreq
+        expect req.url == "/foo"
+        txresp -hdr "Connection: close"
+        send {           <a>   <esi/>                          }
+} -start
+
+varnish v1 -vcl+backend {
+        sub vcl_fetch {
+                esi;
+        }
+} -start
+
+varnish v1 -cliok "debug.fragfetch 4"
+
+client c1 {
+        txreq -url /foo
+        rxresp
+} -run
+
+varnish v1 -expect esi_parse == 0

Modified: branches/2.0/varnish-cache/include/stat_field.h
===================================================================
--- branches/2.0/varnish-cache/include/stat_field.h	2009-02-11 07:21:07 UTC (rev 3734)
+++ branches/2.0/varnish-cache/include/stat_field.h	2009-02-11 07:25:54 UTC (rev 3735)
@@ -130,3 +130,5 @@
 MAC_STAT(hcb_nolock,		uint64_t, 'a', "HCB Lookups without lock")
 MAC_STAT(hcb_lock,		uint64_t, 'a', "HCB Lookups with lock")
 MAC_STAT(hcb_insert,		uint64_t, 'a', "HCB Inserts")
+
+MAC_STAT(esi_parse,		uint64_t, 'a', "Objects ESI parsed (unlock)")



More information about the varnish-commit mailing list