aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2015-02-12 12:38:20 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2015-02-12 12:38:20 +0200
commitc36a2210ed6cd53c5c65418fa9c20ac22dec8c59 (patch)
tree95cbf77e8d0851e5ea2b9adaba7ad12c6bf0e1c4
parentb771edaa218bee8a8365cc8e4ee9af4005ad61b2 (diff)
downloadvmod-variable-c36a2210ed6cd53c5c65418fa9c20ac22dec8c59.tar.gz
vmod-variable-c36a2210ed6cd53c5c65418fa9c20ac22dec8c59.tar.bz2
Implement global string variables
* src/variable.c (vmod_global_set) (vmod_global_get): New functions. * src/variable.vcc (global_set) (global_get): New protos. * tests/gstring.at: New file. * tests/Makefile.am (TESTSUITE_AT): Add gstring.at * tests/testsuite.at (AT_VCL): Remove (AT_VARNISHTEST): Rewrite. All uses changed. Include gstring.at * tests/atlocal.in (at_vcl_backend): Remove. * tests/batchset.at: Use new AT_VARNISHTEST. * tests/clear.at: Likewise. * tests/complex.at: Likewise. * tests/defined.at: Likewise. * tests/duration.at: Likewise. * tests/int.at: Likewise. * tests/real.at: Likewise. * tests/string.at: Likewise. * tests/type_of.at: Likewise. * tests/undef.at: Likewise.
-rw-r--r--src/variable.c45
-rw-r--r--src/variable.vcc4
-rw-r--r--tests/Makefile.am1
-rw-r--r--tests/atlocal.in43
-rw-r--r--tests/batchset.at29
-rw-r--r--tests/clear.at68
-rw-r--r--tests/complex.at62
-rw-r--r--tests/defined.at24
-rw-r--r--tests/duration.at26
-rw-r--r--tests/gstring.at46
-rw-r--r--tests/int.at26
-rw-r--r--tests/real.at26
-rw-r--r--tests/string.at28
-rw-r--r--tests/testsuite.at38
-rw-r--r--tests/type_of.at33
-rw-r--r--tests/undef.at32
16 files changed, 292 insertions, 239 deletions
diff --git a/src/variable.c b/src/variable.c
index c8ab8e6..6403c1a 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -314,6 +314,51 @@ static struct symtab **symtabv;
314static size_t symtabc; 314static size_t symtabc;
315static pthread_mutex_t symtab_mtx = PTHREAD_MUTEX_INITIALIZER; 315static pthread_mutex_t symtab_mtx = PTHREAD_MUTEX_INITIALIZER;
316 316
317static struct symtab *global_symtab;
318static pthread_mutex_t global_mtx = PTHREAD_MUTEX_INITIALIZER;
319
320VCL_VOID
321vmod_global_set(VARIABLE_CTX ctx, VCL_STRING name, VCL_STRING value)
322{
323 struct variable *var;
324 int inst;
325
326 AZ(pthread_mutex_lock(&global_mtx));
327 if (!global_symtab)
328 global_symtab = symtab_create();
329 if (!value)
330 symtab_remove(global_symtab, name);
331 else {
332 inst = 1;
333 var = symtab_lookup_or_install(global_symtab, name, &inst);
334 if (!inst && var->type == variable_string)
335 free(var->v.s);
336 var->type = variable_string;
337 var->v.s = strdup(value);
338 AN(var->v.s);
339 }
340 AZ(pthread_mutex_unlock(&global_mtx));
341}
342
343VCL_STRING
344vmod_global_get(VARIABLE_CTX ctx, VCL_STRING name)
345{
346 char *s;
347 struct variable *var;
348
349 AZ(pthread_mutex_lock(&global_mtx));
350 if (!global_symtab)
351 global_symtab = symtab_create();
352 var = symtab_lookup_or_install(global_symtab, name, NULL);
353 if (var && var->type == variable_string) {
354 s = WS_Copy(ctx->ws, var->v.s, -1);
355 AN(s);
356 } else
357 s = NULL;
358 AZ(pthread_mutex_unlock(&global_mtx));
359 return s;
360}
361
317static struct symtab * 362static struct symtab *
318get_symtab(VARIABLE_CTX ctx) 363get_symtab(VARIABLE_CTX ctx)
319{ 364{
diff --git a/src/variable.vcc b/src/variable.vcc
index a87c204..b8eb8e2 100644
--- a/src/variable.vcc
+++ b/src/variable.vcc
@@ -18,8 +18,8 @@ $Module variable 3 Variable Support for Varnish
18 18
19$Function VOID set(STRING, STRING) 19$Function VOID set(STRING, STRING)
20$Function STRING get(STRING) 20$Function STRING get(STRING)
21#$Function VOID global_set(STRING, STRING) 21$Function VOID global_set(STRING, STRING)
22#$Function STRING global_get(STRING) 22$Function STRING global_get(STRING)
23$Function VOID set_int(STRING, INT) 23$Function VOID set_int(STRING, INT)
24$Function INT get_int(STRING) 24$Function INT get_int(STRING)
25$Function VOID set_string(STRING, STRING) 25$Function VOID set_string(STRING, STRING)
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 2e4a53b..1a81bea 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -46,6 +46,7 @@ TESTSUITE_AT = \
46 clear.at\ 46 clear.at\
47 defined.at\ 47 defined.at\
48 duration.at\ 48 duration.at\
49 gstring.at\
49 int.at\ 50 int.at\
50 real.at\ 51 real.at\
51 string.at\ 52 string.at\
diff --git a/tests/atlocal.in b/tests/atlocal.in
index e833179..6cae626 100644
--- a/tests/atlocal.in
+++ b/tests/atlocal.in
@@ -8,46 +8,3 @@ FAILFILE=@abs_builddir@/FAILURE
8VARNISHTEST="@VARNISHSRC@/bin/varnishtest/varnishtest -Dvarnishd=@VARNISHSRC@/bin/varnishd/varnishd" 8VARNISHTEST="@VARNISHSRC@/bin/varnishtest/varnishtest -Dvarnishd=@VARNISHSRC@/bin/varnishd/varnishd"
9VARNISHVERSION=@VARNISHVERSION@ 9VARNISHVERSION=@VARNISHVERSION@
10 10
11at_vcl_backend() {
12 case $VARNISHVERSION in
13 3) cat <<EOT
14server s1 {
15 rxreq
16 txresp
17} -start
18
19varnish v1 -vcl+backend {
20 import std;
21 import variable from "$abs_top_builddir/src/.libs/libvmod_variable.so";
22
23 sub vcl_recv {
24 }
25
26 sub vcl_deliver {
27 }
28} -start
29EOT
30 ;;
31 4) cat <<EOT
32server s1 {
33 rxreq
34 txresp
35} -start
36
37varnish v1 -vcl+backend {
38 import std;
39 import variable from "$abs_top_builddir/src/.libs/libvmod_variable.so";
40
41 sub vcl_recv {
42 $1
43 }
44
45 sub vcl_deliver {
46 $2
47 }
48} -start
49EOT
50 ;;
51 *) echo >&2 "unsupported varnish version: $VARNISHVERSION"
52esac
53}
diff --git a/tests/batchset.at b/tests/batchset.at
index d782191..be07cae 100644
--- a/tests/batchset.at
+++ b/tests/batchset.at
@@ -1,4 +1,4 @@
1# This file is part of vmod-variable 1# This file is part of vmod-variable -*- autotest -*-
2# Copyright (C) 2015 Sergey Poznyakoff 2# Copyright (C) 2015 Sergey Poznyakoff
3# 3#
4# Vmod-variable is free software; you can redistribute it and/or modify 4# Vmod-variable is free software; you can redistribute it and/or modify
@@ -17,20 +17,19 @@
17AT_SETUP(batchset) 17AT_SETUP(batchset)
18AT_KEYWORDS(batchset) 18AT_KEYWORDS(batchset)
19 19
20AT_CHECK([ 20AT_VARNISHTEST([
21AT_VCL([variable.batchset("y=i,x=s", "^/(\d+)/(.+)", req.url); 21sub vcl_recv {
22], 22 variable.batchset("y=i,x=s", "^/(\d+)/(.+)", req.url);
23[set resp.http.X-X = variable.get("x"); 23}
24 set resp.http.X-Y = variable.get_int("y");], 24sub vcl_deliver {
25[txreq -url /10/test 25 set resp.http.X-X = variable.get("x");
26 rxresp 26 set resp.http.X-Y = variable.get_int("y");
27 expect resp.http.X-X == "test" 27}
28 expect resp.http.X-Y == "10" 28],[
29]) 29txreq -url /10/test
30AT_VARNISHTEST 30rxresp
31], 31expect resp.http.X-X == "test"
32[0], 32expect resp.http.X-Y == "10"
33[OK
34]) 33])
35AT_CLEANUP 34AT_CLEANUP
36 35
diff --git a/tests/clear.at b/tests/clear.at
index 53ac20f..a3c602f 100644
--- a/tests/clear.at
+++ b/tests/clear.at
@@ -17,41 +17,39 @@
17AT_SETUP(clear) 17AT_SETUP(clear)
18AT_KEYWORDS(clear) 18AT_KEYWORDS(clear)
19 19
20AT_CHECK([ 20AT_VARNISHTEST([
21AT_VCL([ 21sub vcl_recv {
22variable.set("foo", req.http.Host); 22 variable.set("foo", req.http.Host);
23variable.set("bar","two"); 23 variable.set("bar","two");
24variable.set_int("ten", 10); 24 variable.set_int("ten", 10);
25variable.set_int("five",5); 25 variable.set_int("five",5);
26variable.set_real("one-half", 0.5); 26 variable.set_real("one-half", 0.5);
27variable.set_real("one-fourth",0.25); 27 variable.set_real("one-fourth",0.25);
28variable.set_duration("minute", 1m); 28 variable.set_duration("minute", 1m);
29variable.set_duration("hour",1h); 29 variable.set_duration("hour",1h);
30], 30}
31[variable.clear(); 31sub vcl_deliver {
32 set resp.http.X-Foo = variable.get("foo"); 32 variable.clear();
33 set resp.http.X-Bar = variable.get("bar"); 33 set resp.http.X-Foo = variable.get("foo");
34 set resp.http.X-Five = variable.get_int("five"); 34 set resp.http.X-Bar = variable.get("bar");
35 set resp.http.X-Ten = variable.get_int("ten"); 35 set resp.http.X-Five = variable.get_int("five");
36 set resp.http.X-One-Fourth = variable.get_real("one-fourth"); 36 set resp.http.X-Ten = variable.get_int("ten");
37 set resp.http.X-One-Half = variable.get_real("one-half"); 37 set resp.http.X-One-Fourth = variable.get_real("one-fourth");
38 set resp.http.X-Minute = variable.get_duration("minute"); 38 set resp.http.X-One-Half = variable.get_real("one-half");
39 set resp.http.X-Hour = variable.get_duration("hour");], 39 set resp.http.X-Minute = variable.get_duration("minute");
40[txreq -