[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