Commit 2e5b8949 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Add an (unlocked) counter for number of ESI objects we have parsed.

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



git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@3566 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 3a30654a
......@@ -630,6 +630,59 @@ esi_parse(struct esi_work *ew)
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 @@ VRT_ESI(struct sess *sp)
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 @@ VRT_ESI(struct sess *sp)
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);
......
......@@ -22,7 +22,9 @@ varnish v1 -vcl+backend {
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"
......
# $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
# $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
......@@ -130,3 +130,5 @@ MAC_STAT(n_purge_dups, uint64_t, 'a', "N duplicate purges removed")
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)")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment