r5745 - trunk/varnish-cache/bin/varnishd
phk at varnish-cache.org
phk at varnish-cache.org
Fri Jan 14 12:43:27 CET 2011
Author: phk
Date: 2011-01-14 12:43:27 +0100 (Fri, 14 Jan 2011)
New Revision: 5745
Modified:
trunk/varnish-cache/bin/varnishd/cache_esi_parse.c
Log:
Append the dot-diagram for the state machine and synchronize the
section letters between the dot and the C-source.
Flesh out a couple of error cases that would still panic.
Modified: trunk/varnish-cache/bin/varnishd/cache_esi_parse.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_esi_parse.c 2011-01-14 00:40:10 UTC (rev 5744)
+++ trunk/varnish-cache/bin/varnishd/cache_esi_parse.c 2011-01-14 11:43:27 UTC (rev 5745)
@@ -453,6 +453,9 @@
* This function is called with the input object piecemal so do not
* assume that we have more than one char available at at time, but
* optimize for getting huge chunks.
+ *
+ * NB: At the bottom of this source-file, there is a dot-diagram matching
+ * NB: the state-machine. Please maintain it along with the code.
*/
static void
@@ -512,7 +515,7 @@
p = e;
/******************************************************
- * SECTION D
+ * SECTION B
*/
} else if (vep->state == VEP_NOTMYTAG) {
@@ -567,7 +570,7 @@
vep->state = VEP_STARTTAG;
/******************************************************
- * SECTION B
+ * SECTION C
*/
} else if (vep->state == VEP_STARTTAG) {
@@ -651,7 +654,7 @@
vep->state = VEP_TAGERROR;
/******************************************************
- * SECTION F
+ * SECTION D
*/
} else if (vep->state == VEP_INTAG) {
@@ -674,14 +677,15 @@
vep->dostuff(vep, DO_TAG);
vep->state = VEP_NEXTTAG;
} else if (p < e && vep->emptytag) {
- INCOMPL(); /* ESI-SYNTAX ERROR */
- } else if (p < e && vct_isxmlnamestart(*p)) {
+ vep_error(vep,
+ "XML 1.0 '>' does not follow '/' in tag");
+ vep->state = VEP_TAGERROR;
+ } else if (p < e && vep->canattr &&
+ vct_isxmlnamestart(*p)) {
vep->state = VEP_ATTR;
} else if (p < e) {
- vep_mark_skip(vep, p);
vep_error(vep,
"XML 1.0 Illegal attribute start char");
- Debug("ERR %d [%.*s]\n", __LINE__, (int)(e-p), p);
vep->state = VEP_TAGERROR;
}
} else if (vep->state == VEP_TAGERROR) {
@@ -694,7 +698,7 @@
}
/******************************************************
- * SECTION G
+ * SECTION E
*/
} else if (vep->state == VEP_ATTR) {
@@ -716,6 +720,10 @@
if (vep->tag[i] == '=') {
assert(i + 1 == vep->tag_i);
vep->state = VEP_ATTRDELIM;
+ } else {
+ vep_error(vep,
+ "XML 1.0 Illegal attr char");
+ vep->state = VEP_TAGERROR;
}
}
xxxassert(i == vep->tag_i);
@@ -1008,3 +1016,130 @@
};
#endif /* OLD_ESI */
+
+#if 0
+
+digraph xml {
+ rankdir="LR"
+ size="7,10"
+#################################################################
+# SECTION A
+#
+
+START [shape=ellipse]
+TESTXML [shape=ellipse]
+NOTXML [shape=ellipse]
+NEXTTAGa [shape=hexagon, label="NEXTTAG"]
+STARTTAGa [shape=hexagon, label="STARTTAG"]
+START -> TESTXML
+START -> NEXTTAGa [style=dotted, label="syntax:1"]
+TESTXML -> TESTXML [label="lws"]
+TESTXML -> NOTXML
+TESTXML -> STARTTAGa [label="'<'"]
+
+#################################################################
+# SECTION B
+
+NOTMYTAG [shape=ellipse]
+NEXTTAG [shape=ellipse]
+NOTMYTAG -> NEXTTAG [style=dotted, label="syntax:2"]
+STARTTAGb [shape=hexagon, label="STARTTAG"]
+NOTMYTAG -> NEXTTAG [label="'>'"]
+NOTMYTAG -> NOTMYTAG [label="*"]
+NEXTTAG -> NEXTTAG [label="'-->'"]
+NEXTTAG -> NEXTTAG [label="*"]
+NEXTTAG -> STARTTAGb [label="'<'"]
+
+#################################################################
+# SECTION C
+
+STARTTAG [shape=ellipse]
+COMMENT [shape=ellipse]
+CDATA [shape=ellipse]
+ESITAG [shape=ellipse]
+ESIETAG [shape=ellipse]
+ESIINCLUDE [shape=ellipse]
+ESIREMOVE [shape=ellipse]
+ESICOMMENT [shape=ellipse]
+ESIBOGON [shape=ellipse]
+INTAGc [shape=hexagon, label="INTAG"]
+NOTMYTAGc [shape=hexagon, label="NOTMYTAG"]
+NEXTTAGc [shape=hexagon, label="NEXTTAG"]
+TAGERRORc [shape=hexagon, label="TAGERROR"]
+C1 [shape=circle,label=""]
+STARTTAG -> COMMENT [label="'<!--'"]
+STARTTAG -> ESIETAG [label="'</esi'"]
+STARTTAG -> ESITAG [label="'<esi'"]
+STARTTAG -> CDATA [label="'<![CDATA['"]
+STARTTAG -> NOTMYTAGc [label="'*'"]
+COMMENT -> NEXTTAGc [label="'esi'"]
+COMMENT -> C1 [label="*"]
+C1 -> C1 [label="*"]
+C1 -> NEXTTAGc [label="-->"]
+CDATA -> CDATA [label="*"]
+CDATA -> NEXTTAGc [label="]]>"]
+ESITAG -> ESIINCLUDE [label="'include'"]
+ESITAG -> ESIREMOVE [label="'remove'"]
+ESITAG -> ESICOMMENT [label="'comment'"]
+ESITAG -> ESIBOGON [label="*"]
+ESITAG -> NOTMYTAGc [style=dotted, label="nested\nin\nremove"]
+ESIETAG -> ESIREMOVE [label="'remove'"]
+ESIETAG -> ESIBOGON [label="*"]
+ESICOMMENT -> INTAGc
+ESIREMOVE -> INTAGc
+ESIINCLUDE -> INTAGc
+ESIBOGON -> TAGERRORc
+
+#################################################################
+# SECTION D
+
+INTAG [shape=ellipse]
+TAGERROR [shape=ellipse]
+NEXTTAGd [shape=hexagon, label="NEXTTAG"]
+ATTRd [shape=hexagon, label="ATTR"]
+D1 [shape=circle, label=""]
+D2 [shape=circle, label=""]
+INTAG -> D1 [label="lws"]
+D1 -> D2 [label="/"]
+INTAG -> D2 [label="/"]
+INTAG -> NEXTTAGd [label=">"]
+D1 -> NEXTTAGd [label=">"]
+D2 -> NEXTTAGd [label=">"]
+D1 -> ATTRd [label="XMLstartchar"]
+D1 -> TAGERROR [label="*"]
+D2 -> TAGERROR [label="*"]
+TAGERROR -> TAGERROR [label="*"]
+TAGERROR -> NEXTTAGd [label="'>'"]
+
+#################################################################
+# SECTION E
+
+ATTR [shape=ellipse]
+SKIPATTR [shape=ellipse]
+SKIPATTR2 [shape=ellipse]
+ATTRGETVAL [shape=ellipse]
+ATTRDELIM [shape=ellipse]
+ATTRVAL [shape=ellipse]
+TAGERRORe [shape=hexagon, label="TAGERROR"]
+INTAGe [shape=hexagon, label="INTAG"]
+ATTR -> SKIPATTR [label="*"]
+ATTR -> ATTRGETVAL [label="wanted attr"]
+SKIPATTR -> SKIPATTR [label="XMLname"]
+SKIPATTR -> ATTRDELIM [label="'='"]
+SKIPATTR -> SKIPATTR2 [label="(when tag exhaused)"]
+SKIPATTR -> TAGERRORe [label="*"]
+SKIPATTR2 -> SKIPATTR2 [label="XMLname"]
+SKIPATTR2 -> ATTRDELIM [label="'='"]
+SKIPATTR2 -> TAGERRORe [label="*"]
+ATTRGETVAL -> ATTRDELIM
+ATTRDELIM -> ATTRVAL [label="\""]
+ATTRDELIM -> ATTRVAL [label="\'"]
+ATTRDELIM -> ATTRVAL [label="*"]
+ATTRDELIM -> TAGERRORe [label="lws"]
+ATTRVAL -> TAGERRORe [label="'>'"]
+ATTRVAL -> INTAGe [label="delim"]
+ATTRVAL -> ATTRVAL [label="*"]
+
+}
+
+#endif
More information about the varnish-commit
mailing list