[master] fa014c8 Change the "error" syntax to:

Poul-Henning Kamp phk at varnish-cache.org
Sun May 12 13:08:44 CEST 2013


commit fa014c869726b540ba86d51ff0f777c82a10c5c8
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Sun May 12 11:08:06 2013 +0000

    Change the "error" syntax to:
    
    	return (error(status_code [ , response_string ]));

diff --git a/bin/varnishtest/tests/b00016.vtc b/bin/varnishtest/tests/b00016.vtc
index 93be72b..56bbd33 100644
--- a/bin/varnishtest/tests/b00016.vtc
+++ b/bin/varnishtest/tests/b00016.vtc
@@ -6,7 +6,7 @@ varnish v1 -vcl {
 	}
 
 	sub vcl_recv {
-	    error 200 "ok";
+	    return(error(200,"ok"));
 	}
 
 	sub vcl_error {
@@ -33,7 +33,7 @@ varnish v1 -vcl {
 
 	sub vcl_recv {
 		set req.backend = bar.backend();
-		error 200 "ok";
+		return(error(200,"ok"));
 	}
 
 	sub vcl_error {
@@ -59,7 +59,7 @@ varnish v1 -vcl {
 
 	sub vcl_recv {
 	    set req.backend = baz.backend();
-	    error 200 "ok";
+	    return (error(200,"ok"));
 	}
 
 	sub vcl_error {
diff --git a/bin/varnishtest/tests/b00017.vtc b/bin/varnishtest/tests/b00017.vtc
index 85ec39c..053fffd 100644
--- a/bin/varnishtest/tests/b00017.vtc
+++ b/bin/varnishtest/tests/b00017.vtc
@@ -5,7 +5,7 @@ varnish v1 -vcl {
 		.host = "${bad_ip}"; .port = "9080";
 	}
 	sub vcl_recv {
-		error 888;
+		return (error(888));
 	}
 } -start
 
diff --git a/bin/varnishtest/tests/b00028.vtc b/bin/varnishtest/tests/b00028.vtc
index b91c274..0745959 100644
--- a/bin/varnishtest/tests/b00028.vtc
+++ b/bin/varnishtest/tests/b00028.vtc
@@ -11,12 +11,12 @@ varnish v1 -vcl+backend {
 		if (beresp.http.foo ~ "bar") {
 			set beresp.http.foo1 = "1";
 		} else {
-			error 999;
+			set beresp.status = 999;
 		}
 		if (beresp.http.bar !~ "bar") {
 			set beresp.http.bar1 = "2";
 		} else {
-			error 999;
+			set beresp.status = 999;
 		}
 	}
 
@@ -25,6 +25,7 @@ varnish v1 -vcl+backend {
 client c1 {
 	txreq
 	rxresp
+	expect resp.status == "200"
 	expect resp.http.foo1 == "1"
 	expect resp.http.bar1 == "2"
 } -run
diff --git a/bin/varnishtest/tests/b00030.vtc b/bin/varnishtest/tests/b00030.vtc
index fcd0356..9703cc7 100644
--- a/bin/varnishtest/tests/b00030.vtc
+++ b/bin/varnishtest/tests/b00030.vtc
@@ -10,7 +10,7 @@ server s1 {
 
 varnish v1 -vcl+backend {
 	sub vcl_recv {
-		error 200 req.grace;
+		return (error(200,req.grace));
 	}
 	sub vcl_error {
 		set obj.http.x-timestamp = now;
diff --git a/bin/varnishtest/tests/c00022.vtc b/bin/varnishtest/tests/c00022.vtc
index 64511fa..328ef92 100644
--- a/bin/varnishtest/tests/c00022.vtc
+++ b/bin/varnishtest/tests/c00022.vtc
@@ -22,11 +22,11 @@ varnish v1 -vcl+backend {
 	sub vcl_recv {
 		if (req.method == "PURGE") {
 			ban ("req.url == " + req.url);
-			error 410;
+			return (error(410));
 		}
 		if (req.method == "PURGESTR") {
 			ban ("" + req.http.ban);
-			error 410;
+			return (error(410));
 		}
 	}
 } -start
diff --git a/bin/varnishtest/tests/c00033.vtc b/bin/varnishtest/tests/c00033.vtc
index b88acfa..13f69f8 100644
--- a/bin/varnishtest/tests/c00033.vtc
+++ b/bin/varnishtest/tests/c00033.vtc
@@ -26,13 +26,13 @@ varnish v1 -vcl+backend {
 	sub vcl_lookup {
 		if (req.method == "PURGE") {
 			C{ VRT_purge(ctx, 0, 0); }C
-			error 456 "got it";
+			return (error(456, "got it"));
 		}
 	}
 	sub vcl_miss {
 		if (req.method == "PURGE") {
 			C{ VRT_purge(ctx, 0, 0); }C
-			error 456 "got it";
+			return (error(456, "got it"));
 		}
 	}
 } -start
diff --git a/bin/varnishtest/tests/r00558.vtc b/bin/varnishtest/tests/r00558.vtc
index 0efb9e9..3a8ba97 100644
--- a/bin/varnishtest/tests/r00558.vtc
+++ b/bin/varnishtest/tests/r00558.vtc
@@ -1,4 +1,5 @@
 varnishtest "error from vcl_recv{} has no numeric code"
+# XXX: V4 makes this an obsolete test ?
 
 
 server s1 {
@@ -6,7 +7,7 @@ server s1 {
 
 varnish v1 -vcl+backend {
 	sub vcl_recv {
-		return (error);
+		return (error(501));
 	}
 } -start
 
diff --git a/bin/varnishtest/tests/r00769.vtc b/bin/varnishtest/tests/r00769.vtc
index 2306346..838ef17 100644
--- a/bin/varnishtest/tests/r00769.vtc
+++ b/bin/varnishtest/tests/r00769.vtc
@@ -8,7 +8,7 @@ server s1 {
 varnish v1 -vcl+backend {
 	sub vcl_recv {
 		if (req.url ~ "^/test1") {
-			error 700;
+			return (error(700));
 		}
 	}
 	sub vcl_backend_response {
diff --git a/bin/varnishtest/tests/r00896.vtc b/bin/varnishtest/tests/r00896.vtc
index 280a176..b559075 100644
--- a/bin/varnishtest/tests/r00896.vtc
+++ b/bin/varnishtest/tests/r00896.vtc
@@ -8,7 +8,7 @@ server s1 {
 varnish v1 -vcl+backend {
 	sub vcl_recv {
 	    if (req.http.host ~ "^(abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij|abcdefghij)") {
-		error 500 "not ok";
+		return (error(500,"not ok"));
 		}
 	}
 } -start 
diff --git a/bin/varnishtest/tests/r00936.vtc b/bin/varnishtest/tests/r00936.vtc
index 176cc7c..99e1d65 100644
--- a/bin/varnishtest/tests/r00936.vtc
+++ b/bin/varnishtest/tests/r00936.vtc
@@ -9,7 +9,7 @@ varnish v1 -errvcl {'synthetic': not a valid action in method 'vcl_recv'} {
 	backend foo { .host = "127.0.0.1"; }
 
 	sub vcl_recv {
-		synthetic "HELLOO"; return (error);
+		synthetic "HELLOO"; return (error(503));
 	}
 }
 
diff --git a/bin/varnishtest/tests/r00965.vtc b/bin/varnishtest/tests/r00965.vtc
index b3a1299..72317de 100644
--- a/bin/varnishtest/tests/r00965.vtc
+++ b/bin/varnishtest/tests/r00965.vtc
@@ -32,11 +32,15 @@ varnish v1 -vcl+backend {
 	}
 
 	sub vcl_miss {
-		if (req.http.X-Banned == "check") { error 988 "restarting"; }
+		if (req.http.X-Banned == "check") {
+			return (error(988,"restarting"));
+		}
 	}
 
 	sub vcl_pass {
-		if (req.http.X-Banned == "check") { error 988 "restarting"; }
+		if (req.http.X-Banned == "check") {
+			return (error(988,"restarting"));
+		}
 	}
 } -start
 
diff --git a/bin/varnishtest/tests/r01027.vtc b/bin/varnishtest/tests/r01027.vtc
index 347f623..d6d0991 100644
--- a/bin/varnishtest/tests/r01027.vtc
+++ b/bin/varnishtest/tests/r01027.vtc
@@ -1,9 +1,9 @@
 varnishtest "Test if you can error in vcl_deliver"
 
-varnish v1 -errvcl {'error': not a valid action in method 'vcl_deliver'} {
+varnish v1 -errvcl {Invalid return "error"} {
 	backend b { .host = "127.0.0.1"; }
 	sub vcl_deliver {
-		error 201 "ok";
+		return (error(201,"ok"));
 	}
 }
 
diff --git a/bin/varnishtest/tests/r01030.vtc b/bin/varnishtest/tests/r01030.vtc
index f8aa7fb..4f95d70 100644
--- a/bin/varnishtest/tests/r01030.vtc
+++ b/bin/varnishtest/tests/r01030.vtc
@@ -16,7 +16,7 @@ varnish v1 -vcl+backend {
 	sub vcl_recv {
 		if (req.method == "BAN") {
 			ban("obj.http.url ~ /");
-			error 201 "banned";
+			return (error(201,"banned"));
 		}
 		return (hash);
 	}
diff --git a/bin/varnishtest/tests/r01031.vtc b/bin/varnishtest/tests/r01031.vtc
index 435f973..27bbab2 100644
--- a/bin/varnishtest/tests/r01031.vtc
+++ b/bin/varnishtest/tests/r01031.vtc
@@ -6,7 +6,7 @@ varnish v1 -vcl {
 	}
 
 	sub vcl_recv {
-		error 200 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+		return (error(200,"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
 	}
 	sub vcl_error {
 		return(deliver);
diff --git a/bin/varnishtest/tests/r01283.vtc b/bin/varnishtest/tests/r01283.vtc
index eaa7b81..76fa434 100644
--- a/bin/varnishtest/tests/r01283.vtc
+++ b/bin/varnishtest/tests/r01283.vtc
@@ -8,7 +8,7 @@ server s1 {
 varnish v1 -arg "-p nuke_limit=0" -storage "-sTransient=malloc,1m" -vcl+backend {
 	sub vcl_recv {
 		if (req.http.x-do-error) {
-			error 500;
+			return (error(500));
 		}
 	}
 	sub vcl_backend_response {
diff --git a/bin/varnishtest/tests/v00011.vtc b/bin/varnishtest/tests/v00011.vtc
index 89119e4..b815127 100644
--- a/bin/varnishtest/tests/v00011.vtc
+++ b/bin/varnishtest/tests/v00011.vtc
@@ -12,7 +12,7 @@ varnish v1 -vcl+backend {
 	sub vcl_recv {
 		if (req.method == "PURGE") {
 			ban("req.url ~ ^/$");
-			error 209 "foo";
+			return (error(209,"foo"));
 		}
 	}
 
diff --git a/bin/varnishtest/tests/v00014.vtc b/bin/varnishtest/tests/v00014.vtc
index 206e8bc..5477a98 100644
--- a/bin/varnishtest/tests/v00014.vtc
+++ b/bin/varnishtest/tests/v00014.vtc
@@ -26,9 +26,9 @@ varnish v1 -vcl {
 
 	sub vcl_recv {
 		if (req.backend.healthy) {
-			error 200 "Backend healthy";
+			return(error(200,"Backend healthy"));
 		} else {
-			error 500 "Backend sick";
+			return(error(500,"Backend sick"));
 		}
 	}
 } -start
diff --git a/bin/varnishtest/tests/v00018.vtc b/bin/varnishtest/tests/v00018.vtc
index a89ecb6..6b6fa1f 100644
--- a/bin/varnishtest/tests/v00018.vtc
+++ b/bin/varnishtest/tests/v00018.vtc
@@ -8,14 +8,8 @@ varnish v1 -vcl {
 
 varnish v1 -vcl {
 	backend b { .host = "127.0.0.1"; }
-	sub vcl_backend_response { error beresp.status ; }
-}
-
-varnish v1 -vcl {
-	backend b { .host = "127.0.0.1"; }
-	sub vcl_miss { error 100 req.url ; }
-	sub vcl_lookup { error 100 "the butter please" ; }
-	sub vcl_backend_response { error beresp.status req.url; }
+	sub vcl_miss { return(error(100,req.url)); }
+	sub vcl_lookup { return(error(100,"the butter please")); }
 }
 
 varnish v1 -errvcl {Variable 'server.port' is read only.} {
@@ -108,3 +102,13 @@ varnish v1 -errvcl {Unknown token '<<' when looking for STRING_LIST} {
 	backend b { .host = "127.0.0.1"; }
 	sub vcl_error { synthetic << "foo"; }
 }
+
+varnish v1 -errvcl {Syntax has changed, use:} {
+	backend b { .host = "127.0.0.1"; }
+	sub vcl_recv { error 200; }
+}
+
+varnish v1 -errvcl {Syntax has changed, use:} {
+	backend b { .host = "127.0.0.1"; }
+	sub vcl_recv { return(error); }
+}
diff --git a/bin/varnishtest/tests/v00024.vtc b/bin/varnishtest/tests/v00024.vtc
index 9c2040c..5ef311a 100644
--- a/bin/varnishtest/tests/v00024.vtc
+++ b/bin/varnishtest/tests/v00024.vtc
@@ -9,7 +9,7 @@ server s1 {
 varnish v1 -vcl+backend { 
 	sub vcl_recv {
 		if (req.http.etag == req.http.if-none-match) {
-			error 400 "FOO";
+			return(error(400,"FOO"));
 		}
 	}
 } -start
diff --git a/lib/libvcl/vcc_action.c b/lib/libvcl/vcc_action.c
index 057e151..f53248b 100644
--- a/lib/libvcl/vcc_action.c
+++ b/lib/libvcl/vcc_action.c
@@ -58,29 +58,13 @@ static void
 parse_error(struct vcc *tl)
 {
 
-	vcc_NextToken(tl);
-	Fb(tl, 1, "VRT_error(ctx,\n");
-	if (tl->t->tok == '(') {
-		vcc_NextToken(tl);
-		vcc_Expr(tl, INT);
-		if (tl->t->tok == ',') {
-			Fb(tl, 1, ",\n");
-			vcc_NextToken(tl);
-			vcc_Expr(tl, STRING);
-		} else
-			Fb(tl, 1, ", 0\n");
-		SkipToken(tl, ')');
-	} else {
-		vcc_Expr(tl, INT);
-		if (tl->t->tok != ';') {
-			Fb(tl, 1, ",\n");
-			vcc_Expr(tl, STRING);
-		} else
-			Fb(tl, 1, ", 0\n");
-	}
-	Fb(tl, 1, ");\n");
-	Fb(tl, 1, "VRT_handling(ctx, VCL_RET_ERROR);\n");
-	Fb(tl, 1, "return(1);\n");
+	VSB_printf(tl->sb,
+	    "Syntax has changed, use:\n"
+	    "\treturn(error(999));\n"
+	    "or\n"
+	    "\treturn(error(999, \"Response text\"));\n");
+	vcc_ErrWhere(tl, tl->t);
+	return;
 }
 
 /*--------------------------------------------------------------------*/
@@ -300,6 +284,44 @@ parse_return(struct vcc *tl)
 	vcc_NextToken(tl);
 	ExpectErr(tl, ID);
 
+	/* 'error' gets special handling, to allow optional status/response */
+	if (vcc_IdIs(tl->t, "error")) {
+		vcc_NextToken(tl);
+		if (tl->t->tok == ')') {
+			VSB_printf(tl->sb,
+			    "Syntax has changed, use:\n"
+			    "\treturn(error(999));\n"
+			    "or\n"
+			    "\treturn(error(999, \"Response text\"));\n");
+			vcc_ErrWhere(tl, tl->t);
+			return;
+		}
+		ExpectErr(tl, '(');
+		vcc_NextToken(tl);
+		Fb(tl, 1, "VRT_error(ctx,\n");
+		tl->indent += INDENT;
+		vcc_Expr(tl, INT);
+		ERRCHK(tl);
+		Fb(tl, 1, ",\n");
+		if (tl->t->tok == ',') {
+			vcc_NextToken(tl);
+			vcc_Expr(tl, STRING);
+			ERRCHK(tl);
+		} else {
+			Fb(tl, 1, "(const char*)0\n");
+		}
+		tl->indent -= INDENT;
+		ExpectErr(tl, ')');
+		vcc_NextToken(tl);
+		Fb(tl, 1, ");\n");
+		Fb(tl, 1, "VRT_handling(ctx, VCL_RET_ERROR);\n");
+		Fb(tl, 1, "return (1);\n");
+		vcc_ProcAction(tl->curproc, VCL_RET_ERROR, tl->t);
+		ExpectErr(tl, ')');
+		vcc_NextToken(tl);
+		return;
+	}
+
 #define VCL_RET_MAC(l, U, B)						\
 	do {								\
 		if (vcc_IdIs(tl->t, #l)) {				\
@@ -363,23 +385,19 @@ static struct action_table {
 	action_f		*func;
 	unsigned		bitmask;
 } action_table[] = {
-	{ "error",		parse_error,
-	    VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH |
-            VCL_MET_MISS | VCL_MET_LOOKUP | VCL_MET_BACKEND_RESPONSE
-	},
-
 	/* Keep list sorted from here */
+	{ "ban",		parse_ban },
 	{ "call",		parse_call },
+	{ "error",		parse_error },
 	{ "hash_data",		parse_hash_data, VCL_MET_HASH },
-	{ "ban",		parse_ban },
+	{ "new",		parse_new, VCL_MET_INIT},
+	{ "purge",		parse_purge, VCL_MET_MISS | VCL_MET_LOOKUP },
 	{ "remove",		parse_unset }, /* backward compatibility */
 	{ "return",		parse_return },
 	{ "rollback",		parse_rollback },
 	{ "set",		parse_set },
 	{ "synthetic",		parse_synthetic, VCL_MET_ERROR },
 	{ "unset",		parse_unset },
-	{ "purge",		parse_purge, VCL_MET_MISS | VCL_MET_LOOKUP },
-	{ "new",		parse_new, VCL_MET_INIT},
 	{ NULL,			NULL }
 };
 



More information about the varnish-commit mailing list