r3566 - in trunk/varnish-cache: bin/varnishd bin/varnishtest/tests include
phk at projects.linpro.no
phk at projects.linpro.no
Tue Feb 3 11:26:02 CET 2009
Author: phk
Date: 2009-02-03 11:26:02 +0100 (Tue, 03 Feb 2009)
New Revision: 3566
Added:
trunk/varnish-cache/bin/varnishtest/tests/e00013.vtc
trunk/varnish-cache/bin/varnishtest/tests/e00014.vtc
Modified:
trunk/varnish-cache/bin/varnishd/cache_vrt_esi.c
trunk/varnish-cache/bin/varnishtest/tests/e00007.vtc
trunk/varnish-cache/include/stat_field.h
Log:
Add an (unlocked) counter for number of ESI objects we have parsed.
Add two test-cases for objects we should not esi parse.
Modified: trunk/varnish-cache/bin/varnishd/cache_vrt_esi.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_vrt_esi.c 2009-02-02 16:48:28 UTC (rev 3565)
+++ trunk/varnish-cache/bin/varnishd/cache_vrt_esi.c 2009-02-03 10:26:02 UTC (rev 3566)
@@ -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: trunk/varnish-cache/bin/varnishtest/tests/e00007.vtc
===================================================================
--- trunk/varnish-cache/bin/varnishtest/tests/e00007.vtc 2009-02-02 16:48:28 UTC (rev 3565)
+++ trunk/varnish-cache/bin/varnishtest/tests/e00007.vtc 2009-02-03 10:26:02 UTC (rev 3566)
@@ -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
Added: trunk/varnish-cache/bin/varnishtest/tests/e00013.vtc
===================================================================
--- trunk/varnish-cache/bin/varnishtest/tests/e00013.vtc (rev 0)
+++ trunk/varnish-cache/bin/varnishtest/tests/e00013.vtc 2009-02-03 10:26:02 UTC (rev 3566)
@@ -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
Added: trunk/varnish-cache/bin/varnishtest/tests/e00014.vtc
===================================================================
--- trunk/varnish-cache/bin/varnishtest/tests/e00014.vtc (rev 0)
+++ trunk/varnish-cache/bin/varnishtest/tests/e00014.vtc 2009-02-03 10:26:02 UTC (rev 3566)
@@ -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: trunk/varnish-cache/include/stat_field.h
===================================================================
--- trunk/varnish-cache/include/stat_field.h 2009-02-02 16:48:28 UTC (rev 3565)
+++ trunk/varnish-cache/include/stat_field.h 2009-02-03 10:26:02 UTC (rev 3566)
@@ -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