[master] c95acca Use brain in low-power mode while sneezing my way through the first cold of spring and add the "duration" conversion function to vmod_std.

Poul-Henning Kamp phk at varnish-cache.org
Wed Mar 9 13:21:40 CET 2011


commit c95acca7351e708cabb3f6b3126aaed878155c2b
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Mar 9 12:19:46 2011 +0000

    Use brain in low-power mode while sneezing my way through the first
    cold of spring and add the "duration" conversion function to vmod_std.
    
    The way these conversions work is that you give them the string you
    want converted, and the value to use if they cannot.
    
    like so:
    
    	set beresp.ttl = std.duration(beresp.http.x-ttl, 10 s);

diff --git a/lib/libvmod_std/Makefile.am b/lib/libvmod_std/Makefile.am
index 5437c02..a284b09 100644
--- a/lib/libvmod_std/Makefile.am
+++ b/lib/libvmod_std/Makefile.am
@@ -11,7 +11,8 @@ libvmod_std_la_SOURCES = \
 	vcc_if.c \
 	vcc_if.h \
 	vmod_std.c \
-	vmod_std_fileread.c
+	vmod_std_fileread.c \
+	vmod_std_conversions.c
 
 vcc_if.c vcc_if.h: $(top_srcdir)/lib/libvmod_std/vmod.py $(top_srcdir)/lib/libvmod_std/vmod.vcc
 	@PYTHON@ $(top_srcdir)/lib/libvmod_std/vmod.py $(top_srcdir)/lib/libvmod_std/vmod.vcc
diff --git a/lib/libvmod_std/vmod.vcc b/lib/libvmod_std/vmod.vcc
index b2923dc..d77d49a 100644
--- a/lib/libvmod_std/vmod.vcc
+++ b/lib/libvmod_std/vmod.vcc
@@ -34,9 +34,5 @@ Function REAL random(REAL, REAL)
 Function VOID log(STRING_LIST)
 Function VOID syslog(INT, STRING_LIST)
 Function STRING fileread(PRIV_CALL, STRING)
-Function STRING author(ENUM {
-	phk,
-	des,
-	kristian,
-	mithrandir
-})
+Function STRING author(ENUM { phk, des, kristian, mithrandir })
+Function DURATION duration(STRING, DURATION)
diff --git a/lib/libvmod_std/vmod_std_conversions.c b/lib/libvmod_std/vmod_std_conversions.c
new file mode 100644
index 0000000..f17b752
--- /dev/null
+++ b/lib/libvmod_std/vmod_std_conversions.c
@@ -0,0 +1,86 @@
+/*-
+ * Copyright (c) 2010 Linpro AS
+ * All rights reserved.
+ *
+ * Author: Poul-Henning Kamp <phk at FreeBSD.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <ctype.h>
+#include <math.h>
+#include <stdlib.h>
+
+#include "../../bin/varnishd/cache.h"
+
+#include "vcc_if.h"
+
+double __match_proto__()
+vmod_duration(struct sess *sp, const char *p, double d)
+{
+	char *e;
+	double r;
+
+	(void)sp;
+
+	if (p == NULL)
+		return (d);
+
+	while(isspace(*p))
+		p++;
+
+	if (*p != '+' && *p != '-' && !isdigit(*p))
+		return (d);
+
+	e = NULL;
+
+	r = strtod(p, &e);
+
+	if (!isfinite(r))
+		return (d);
+
+	if (e == NULL)
+		return (d);
+
+	while(isspace(*e))
+		e++;
+
+	/* NB: Keep this list synchronized with VCC */
+	switch (*e++) {
+	case 's': break;
+	case 'm': r *= 60.; break;
+	case 'h': r *= 60.*60.; break;
+	case 'd': r *= 60.*60.*24.; break;
+	case 'w': r *= 60.*60.*24.*7.; break;
+	default:
+		return (d);
+	}
+
+	while(isspace(*e))
+		e++;
+
+	if (*e != '\0')
+		return (d);
+
+	return (r);
+}



More information about the varnish-commit mailing list