[master] 6f587a30b Add """ ... """ as a long string format in VCL

Dridi Boukelmoune dridi.boukelmoune at gmail.com
Tue Nov 24 14:26:10 UTC 2020


commit 6f587a30b5098417a54497bf42ede03314287e64
Author: Andrew Wiik <andrew at varnish-software.com>
Date:   Mon Oct 26 16:06:56 2020 -0400

    Add """ ... """ as a long string format in VCL

diff --git a/bin/varnishtest/tests/v00019.vtc b/bin/varnishtest/tests/v00019.vtc
index fc98616a6..d53a5aeb2 100644
--- a/bin/varnishtest/tests/v00019.vtc
+++ b/bin/varnishtest/tests/v00019.vtc
@@ -18,6 +18,11 @@ varnish v1 -errvcl {Unterminated long-string, starting at} {
 	{" }
 }
 
+varnish v1 -errvcl {Unterminated long-string, starting at} {
+	backend b { .host = "127.0.0.1"; }
+	""" ""
+}
+
 varnish v1 -errvcl {Unterminated string at} {
 	backend b { .host = "127.0.0.1"; }
 	"
diff --git a/bin/varnishtest/tests/v00066.vtc b/bin/varnishtest/tests/v00066.vtc
new file mode 100644
index 000000000..3fd9d5deb
--- /dev/null
+++ b/bin/varnishtest/tests/v00066.vtc
@@ -0,0 +1,22 @@
+varnishtest "long string coverage"
+
+varnish v1 -vcl {
+	backend default none;
+
+	sub vcl_recv {
+		return (synth(200));
+	}
+
+	sub vcl_synth {
+                set resp.body = """{"key":"value"}""";
+                return (deliver);
+	}
+} -start
+
+client c1 {
+	txreq
+	rxresp
+	expect resp.status == 200
+        expect resp.bodylen == 15
+	expect resp.body == {{"key":"value"}}
+} -run
diff --git a/lib/libvcc/vcc_token.c b/lib/libvcc/vcc_token.c
index 00e21b414..d8d80491d 100644
--- a/lib/libvcc/vcc_token.c
+++ b/lib/libvcc/vcc_token.c
@@ -462,7 +462,7 @@ vcc_Lexer(struct vcc *tl, const struct source *sp, int eoi)
 			return;
 		}
 
-		/* Recognize long-strings */
+		/* Recognize long-strings {" "} */
 		if (*p == '{' && p[1] == '"') {
 			for (q = p + 2; q < sp->e; q++) {
 				if (*q == '"' && q[1] == '}') {
@@ -487,6 +487,31 @@ vcc_Lexer(struct vcc *tl, const struct source *sp, int eoi)
 			return;
 		}
 
+		/* Recognize long-strings """ """ */
+		if (*p == '"' && p[1] == '"' && p[2] == '"') {
+			for (q = p + 3; q < sp->e; q++) {
+				if (*q == '"' && q[1] == '"' && q[2] == '"') {
+					vcc_addtoken(tl, CSTR, sp, p, q + 3);
+					break;
+				}
+			}
+			if (q < sp->e) {
+				p = q + 3;
+				u = tl->t->e - tl->t->b;
+				u -= 6;		/* """ ... """ */
+				tl->t->dec = TlAlloc(tl, u + 1 );
+				AN(tl->t->dec);
+				memcpy(tl->t->dec, tl->t->b + 3, u);
+				tl->t->dec[u] = '\0';
+				continue;
+			}
+			vcc_addtoken(tl, EOI, sp, p, p + 3);
+			VSB_cat(tl->sb,
+			    "Unterminated long-string, starting at\n");
+			vcc_ErrWhere(tl, tl->t);
+			return;
+		}
+
 		/* Recognize BLOB (= SF-binary) */
 		if (*p == ':') {
 			vsb = VSB_new_auto();


More information about the varnish-commit mailing list