Commit 9d0e838e authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Markup all VCL variables as RO, WO or RW and generate and check code

accordingly.



git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@1576 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 54998bb6
...@@ -152,13 +152,6 @@ VRT_l_backend_##onm(struct backend *be, type a) \ ...@@ -152,13 +152,6 @@ VRT_l_backend_##onm(struct backend *be, type a) \
CHECK_OBJ_NOTNULL(be, BACKEND_MAGIC); \ CHECK_OBJ_NOTNULL(be, BACKEND_MAGIC); \
be->field = a; \ be->field = a; \
} \ } \
\
type \
VRT_r_backend_##onm(struct backend *be) \
{ \
CHECK_OBJ_NOTNULL(be, BACKEND_MAGIC); \
return (be->field); \
}
VBACKEND(const char *, host, hostname) VBACKEND(const char *, host, hostname)
VBACKEND(const char *, port, portname) VBACKEND(const char *, port, portname)
......
...@@ -6,29 +6,17 @@ ...@@ -6,29 +6,17 @@
* Edit vcc_gen_obj.tcl instead * Edit vcc_gen_obj.tcl instead
*/ */
const char * VRT_r_backend_host(struct backend *);
void VRT_l_backend_host(struct backend *, const char *); void VRT_l_backend_host(struct backend *, const char *);
const char * VRT_r_backend_port(struct backend *);
void VRT_l_backend_port(struct backend *, const char *); void VRT_l_backend_port(struct backend *, const char *);
double VRT_r_backend_dnsttl(struct backend *);
void VRT_l_backend_dnsttl(struct backend *, double); void VRT_l_backend_dnsttl(struct backend *, double);
struct sockaddr * VRT_r_client_ip(struct sess *); struct sockaddr * VRT_r_client_ip(struct sess *);
void VRT_l_client_ip(struct sess *, struct sockaddr *);
struct sockaddr * VRT_r_server_ip(struct sess *); struct sockaddr * VRT_r_server_ip(struct sess *);
void VRT_l_server_ip(struct sess *, struct sockaddr *);
const char * VRT_r_req_request(struct sess *); const char * VRT_r_req_request(struct sess *);
void VRT_l_req_request(struct sess *, const char *);
const char * VRT_r_req_host(struct sess *);
void VRT_l_req_host(struct sess *, const char *);
const char * VRT_r_req_url(struct sess *); const char * VRT_r_req_url(struct sess *);
void VRT_l_req_url(struct sess *, const char *);
const char * VRT_r_req_proto(struct sess *); const char * VRT_r_req_proto(struct sess *);
void VRT_l_req_proto(struct sess *, const char *);
struct backend * VRT_r_req_backend(struct sess *); struct backend * VRT_r_req_backend(struct sess *);
void VRT_l_req_backend(struct sess *, struct backend *); void VRT_l_req_backend(struct sess *, struct backend *);
const char * VRT_r_req_http_(struct sess *); const char * VRT_r_req_http_(struct sess *);
void VRT_l_req_http_(struct sess *, const char *);
const char * VRT_r_req_hash(struct sess *);
void VRT_l_req_hash(struct sess *, const char *); void VRT_l_req_hash(struct sess *, const char *);
unsigned VRT_r_obj_valid(struct sess *); unsigned VRT_r_obj_valid(struct sess *);
void VRT_l_obj_valid(struct sess *, unsigned); void VRT_l_obj_valid(struct sess *, unsigned);
...@@ -37,10 +25,6 @@ void VRT_l_obj_cacheable(struct sess *, unsigned); ...@@ -37,10 +25,6 @@ void VRT_l_obj_cacheable(struct sess *, unsigned);
double VRT_r_obj_ttl(struct sess *); double VRT_r_obj_ttl(struct sess *);
void VRT_l_obj_ttl(struct sess *, double); void VRT_l_obj_ttl(struct sess *, double);
const char * VRT_r_resp_proto(struct sess *); const char * VRT_r_resp_proto(struct sess *);
void VRT_l_resp_proto(struct sess *, const char *);
int VRT_r_resp_status(struct sess *); int VRT_r_resp_status(struct sess *);
void VRT_l_resp_status(struct sess *, int);
const char * VRT_r_resp_response(struct sess *); const char * VRT_r_resp_response(struct sess *);
void VRT_l_resp_response(struct sess *, const char *);
const char * VRT_r_resp_http_(struct sess *); const char * VRT_r_resp_http_(struct sess *);
void VRT_l_resp_http_(struct sess *, const char *);
...@@ -105,6 +105,12 @@ parse_set(struct tokenlist *tl) ...@@ -105,6 +105,12 @@ parse_set(struct tokenlist *tl)
vp = vcc_FindVar(tl, tl->t, vcc_vars); vp = vcc_FindVar(tl, tl->t, vcc_vars);
ERRCHK(tl); ERRCHK(tl);
assert(vp != NULL); assert(vp != NULL);
if (vp->access != V_RW && vp->access != V_WO) {
vsb_printf(tl->sb, "Variable %.*s cannot be written.\n",
PF(vt));
vcc_ErrWhere(tl, vt);
return;
}
Fb(tl, 1, "%s", vp->lname); Fb(tl, 1, "%s", vp->lname);
vcc_NextToken(tl); vcc_NextToken(tl);
switch (vp->fmt) { switch (vp->fmt) {
......
...@@ -120,6 +120,7 @@ struct var { ...@@ -120,6 +120,7 @@ struct var {
unsigned len; unsigned len;
const char *rname; const char *rname;
const char *lname; const char *lname;
enum {V_RO, V_RW, V_WO} access;
unsigned methods; unsigned methods;
}; };
......
...@@ -32,30 +32,74 @@ ...@@ -32,30 +32,74 @@
# Objects which operate on backends # Objects which operate on backends
set beobj { set beobj {
{ backend.host HOSTNAME } { backend.host WO HOSTNAME }
{ backend.port PORTNAME } { backend.port WO PORTNAME }
{ backend.dnsttl TIME } { backend.dnsttl WO TIME }
} }
# Objects which operate on sessions # Objects which operate on sessions
set spobj { set spobj {
{ client.ip IP {recv pipe pass hash miss hit fetch } } { client.ip
{ server.ip IP {recv pipe pass hash miss hit fetch } } RO IP
{ req.request STRING {recv pipe pass hash miss hit fetch } } {recv pipe pass hash miss hit fetch }
{ req.host STRING {recv pipe pass hash miss hit fetch } } }
{ req.url STRING {recv pipe pass hash miss hit fetch } } { server.ip
{ req.proto STRING {recv pipe pass hash miss hit fetch } } RO IP
{ req.backend BACKEND {recv pipe pass hash miss hit fetch } } {recv pipe pass hash miss hit fetch }
{ req.http. HEADER {recv pipe pass hash miss hit fetch } } }
{ req.hash HASH { hash } } { req.request
{ obj.valid BOOL { hit fetch discard timeout} } RO STRING
{ obj.cacheable BOOL { hit fetch discard timeout} } {recv pipe pass hash miss hit fetch }
{ obj.ttl TIME { hit fetch discard timeout} } }
{ resp.proto STRING { fetch } } { req.url
{ resp.status INT { fetch } } RO STRING
{ resp.response STRING { fetch } } {recv pipe pass hash miss hit fetch }
{ resp.http. HEADER { fetch } } }
{ req.proto
RO STRING
{recv pipe pass hash miss hit fetch }
}
{ req.backend
RW BACKEND
{recv pipe pass hash miss hit fetch }
}
{ req.http.
RO HEADER
{recv pipe pass hash miss hit fetch }
}
{ req.hash
WO HASH
{ hash }
}
{ obj.valid
RW BOOL
{ hit fetch discard timeout}
}
{ obj.cacheable
RW BOOL
{ hit fetch discard timeout}
}
{ obj.ttl
RW TIME
{ hit fetch discard timeout}
}
{ resp.proto
RO STRING
{ fetch }
}
{ resp.status
RO INT
{ fetch }
}
{ resp.response
RO STRING
{ fetch }
}
{ resp.http.
RO HEADER
{ fetch }
}
} }
set tt(IP) "struct sockaddr *" set tt(IP) "struct sockaddr *"
...@@ -105,15 +149,25 @@ proc vars {v ty pa} { ...@@ -105,15 +149,25 @@ proc vars {v ty pa} {
foreach v $v { foreach v $v {
set n [lindex $v 0] set n [lindex $v 0]
regsub -all {[.]} $n "_" m regsub -all {[.]} $n "_" m
set t [lindex $v 1] set a [lindex $v 1]
set t [lindex $v 2]
puts $fo "\t\{ \"$n\", $t, [string length $n]," puts $fo "\t\{ \"$n\", $t, [string length $n],"
puts $fo "\t \"VRT_r_${m}($pa)\"," if {$a == "RO" || $a == "RW"} {
puts $fo "\t \"VRT_l_${m}($pa, \"," puts $fo "\t \"VRT_r_${m}($pa)\","
puts $fo "\t [method_map [lindex $v 2]]" puts $fp "$tt($t) VRT_r_${m}($ty);"
} else {
puts $fo "\t NULL,"
}
if {$a == "WO" || $a == "RW"} {
puts $fo "\t \"VRT_l_${m}($pa, \","
puts $fp "void VRT_l_${m}($ty, $tt($t));"
} else {
puts $fo "\t NULL,"
}
puts $fo "\t V_$a,"
puts $fo "\t [method_map [lindex $v 3]]"
puts $fo "\t\}," puts $fo "\t\},"
puts $fp "$tt($t) VRT_r_${m}($ty);"
puts $fp "void VRT_l_${m}($ty, $tt($t));"
} }
puts $fo "\t{ NULL }" puts $fo "\t{ NULL }"
} }
......
...@@ -11,18 +11,21 @@ ...@@ -11,18 +11,21 @@
struct var vcc_be_vars[] = { struct var vcc_be_vars[] = {
{ "backend.host", HOSTNAME, 12, { "backend.host", HOSTNAME, 12,
"VRT_r_backend_host(backend)", NULL,
"VRT_l_backend_host(backend, ", "VRT_l_backend_host(backend, ",
V_WO,
}, },
{ "backend.port", PORTNAME, 12, { "backend.port", PORTNAME, 12,
"VRT_r_backend_port(backend)", NULL,
"VRT_l_backend_port(backend, ", "VRT_l_backend_port(backend, ",
V_WO,
}, },
{ "backend.dnsttl", TIME, 14, { "backend.dnsttl", TIME, 14,
"VRT_r_backend_dnsttl(backend)", NULL,
"VRT_l_backend_dnsttl(backend, ", "VRT_l_backend_dnsttl(backend, ",
V_WO,
}, },
{ NULL } { NULL }
...@@ -31,82 +34,92 @@ struct var vcc_be_vars[] = { ...@@ -31,82 +34,92 @@ struct var vcc_be_vars[] = {
struct var vcc_vars[] = { struct var vcc_vars[] = {
{ "client.ip", IP, 9, { "client.ip", IP, 9,
"VRT_r_client_ip(sp)", "VRT_r_client_ip(sp)",
"VRT_l_client_ip(sp, ", NULL,
V_RO,
VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH
}, },
{ "server.ip", IP, 9, { "server.ip", IP, 9,
"VRT_r_server_ip(sp)", "VRT_r_server_ip(sp)",
"VRT_l_server_ip(sp, ", NULL,
V_RO,
VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH
}, },
{ "req.request", STRING, 11, { "req.request", STRING, 11,
"VRT_r_req_request(sp)", "VRT_r_req_request(sp)",
"VRT_l_req_request(sp, ", NULL,
VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH V_RO,
},
{ "req.host", STRING, 8,
"VRT_r_req_host(sp)",
"VRT_l_req_host(sp, ",
VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH
}, },
{ "req.url", STRING, 7, { "req.url", STRING, 7,
"VRT_r_req_url(sp)", "VRT_r_req_url(sp)",
"VRT_l_req_url(sp, ", NULL,
V_RO,
VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH
}, },
{ "req.proto", STRING, 9, { "req.proto", STRING, 9,
"VRT_r_req_proto(sp)", "VRT_r_req_proto(sp)",
"VRT_l_req_proto(sp, ", NULL,
V_RO,
VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH
}, },
{ "req.backend", BACKEND, 11, { "req.backend", BACKEND, 11,
"VRT_r_req_backend(sp)", "VRT_r_req_backend(sp)",
"VRT_l_req_backend(sp, ", "VRT_l_req_backend(sp, ",
V_RW,
VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH
}, },
{ "req.http.", HEADER, 9, { "req.http.", HEADER, 9,
"VRT_r_req_http_(sp)", "VRT_r_req_http_(sp)",
"VRT_l_req_http_(sp, ", NULL,
V_RO,
VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH
}, },
{ "req.hash", HASH, 8, { "req.hash", HASH, 8,
"VRT_r_req_hash(sp)", NULL,
"VRT_l_req_hash(sp, ", "VRT_l_req_hash(sp, ",
V_WO,
VCL_MET_HASH VCL_MET_HASH
}, },
{ "obj.valid", BOOL, 9, { "obj.valid", BOOL, 9,
"VRT_r_obj_valid(sp)", "VRT_r_obj_valid(sp)",
"VRT_l_obj_valid(sp, ", "VRT_l_obj_valid(sp, ",
V_RW,
VCL_MET_HIT | VCL_MET_FETCH | VCL_MET_DISCARD | VCL_MET_TIMEOUT VCL_MET_HIT | VCL_MET_FETCH | VCL_MET_DISCARD | VCL_MET_TIMEOUT
}, },
{ "obj.cacheable", BOOL, 13, { "obj.cacheable", BOOL, 13,
"VRT_r_obj_cacheable(sp)", "VRT_r_obj_cacheable(sp)",
"VRT_l_obj_cacheable(sp, ", "VRT_l_obj_cacheable(sp, ",
V_RW,
VCL_MET_HIT | VCL_MET_FETCH | VCL_MET_DISCARD | VCL_MET_TIMEOUT VCL_MET_HIT | VCL_MET_FETCH | VCL_MET_DISCARD | VCL_MET_TIMEOUT
}, },
{ "obj.ttl", TIME, 7, { "obj.ttl", TIME, 7,
"VRT_r_obj_ttl(sp)", "VRT_r_obj_ttl(sp)",
"VRT_l_obj_ttl(sp, ", "VRT_l_obj_ttl(sp, ",
V_RW,
VCL_MET_HIT | VCL_MET_FETCH | VCL_MET_DISCARD | VCL_MET_TIMEOUT VCL_MET_HIT | VCL_MET_FETCH | VCL_MET_DISCARD | VCL_MET_TIMEOUT
}, },
{ "resp.proto", STRING, 10, { "resp.proto", STRING, 10,
"VRT_r_resp_proto(sp)", "VRT_r_resp_proto(sp)",
"VRT_l_resp_proto(sp, ", NULL,
V_RO,
VCL_MET_FETCH VCL_MET_FETCH
}, },
{ "resp.status", INT, 11, { "resp.status", INT, 11,
"VRT_r_resp_status(sp)", "VRT_r_resp_status(sp)",
"VRT_l_resp_status(sp, ", NULL,
V_RO,
VCL_MET_FETCH VCL_MET_FETCH
}, },
{ "resp.response", STRING, 13, { "resp.response", STRING, 13,
"VRT_r_resp_response(sp)", "VRT_r_resp_response(sp)",
"VRT_l_resp_response(sp, ", NULL,
V_RO,
VCL_MET_FETCH VCL_MET_FETCH
}, },
{ "resp.http.", HEADER, 10, { "resp.http.", HEADER, 10,
"VRT_r_resp_http_(sp)", "VRT_r_resp_http_(sp)",
"VRT_l_resp_http_(sp, ", NULL,
V_RO,
VCL_MET_FETCH VCL_MET_FETCH
}, },
{ NULL } { NULL }
......
...@@ -44,7 +44,6 @@ void ...@@ -44,7 +44,6 @@ void
vcc_StringVal(struct tokenlist *tl) vcc_StringVal(struct tokenlist *tl)
{ {
struct var *vp; struct var *vp;
struct token *vt;
if (tl->t->tok == CSTR) { if (tl->t->tok == CSTR) {
EncToken(tl->fb, tl->t); EncToken(tl->fb, tl->t);
...@@ -53,7 +52,6 @@ vcc_StringVal(struct tokenlist *tl) ...@@ -53,7 +52,6 @@ vcc_StringVal(struct tokenlist *tl)
} }
ExpectErr(tl, VAR); ExpectErr(tl, VAR);
ERRCHK(tl); ERRCHK(tl);
vt = tl->t;
vp = vcc_FindVar(tl, tl->t, vcc_vars); vp = vcc_FindVar(tl, tl->t, vcc_vars);
ERRCHK(tl); ERRCHK(tl);
switch (vp->fmt) { switch (vp->fmt) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment