'call' ident ';'
'rewrite' cstr cstr ';'
'set' assignment ';'
+ 'remove' variable ';'
# see variable 'returns' in vcc_gen_fixed_token.tcl
return_action:
'-=' cnum
'=' cnum
+
ratio:
'*=' double
'/=' double
*/
#include <stdio.h>
-#include <assert.h>
#include <stdlib.h>
#include "vsb.h"
#include "vcc_priv.h"
#include "vcc_compile.h"
+#include "libvarnish.h"
static void
vcc_acl_top(struct tokenlist *tl, const char *acln)
}
void
-vcc_Cond_Ip(struct var *vp, struct tokenlist *tl)
+vcc_Cond_Ip(const struct var *vp, struct tokenlist *tl)
{
unsigned tcond;
char *acln;
/*--------------------------------------------------------------------*/
static void
-illegal_assignment(struct tokenlist *tl, const char *type)
+illegal_assignment(const struct tokenlist *tl, const char *type)
{
vsb_printf(tl->sb, "Invalid assignment operator ");
}
static void
-check_writebit(struct tokenlist *tl, struct var *vp)
+check_writebit(struct tokenlist *tl, const struct var *vp)
{
if (vp->access == V_RW || vp->access == V_WO)
vcc_NextToken(tl);
Fb(tl, 0, ");\n");
break;
- return;
case HASH:
ExpectErr(tl, T_INCR);
vcc_NextToken(tl);
vcc_StringVal(tl);
Fb(tl, 0, ");\n");
- return;
+ break;
case STRING:
if (tl->t->tok != '=') {
illegal_assignment(tl, "strings");
}
vcc_NextToken(tl);
vcc_StringVal(tl);
- if (vp->ishdr) {
+ if (vp->hdr != NULL) {
while (tl->t->tok != ';') {
Fb(tl, 0, ", ");
vcc_StringVal(tl);
parse_remove(struct tokenlist *tl)
{
struct var *vp;
- struct token *vt;
vcc_NextToken(tl);
ExpectErr(tl, VAR);
- vt = tl->t;
vp = vcc_FindVar(tl, tl->t, vcc_vars);
- if (vp->fmt != STRING || !vp->ishdr) {
+ ERRCHK(tl);
+ assert(vp != NULL);
+ if (vp->fmt != STRING || vp->hdr == NULL) {
vsb_printf(tl->sb, "Only http header lines can be removed.\n");
vcc_ErrWhere(tl, tl->t);
return;
#include "vcl_returns.h"
#undef VCL_MET_MAC
#undef VCL_RET_MAC
- { NULL, 0U }
+ { NULL, 0U, 0}
};
/*--------------------------------------------------------------------*/
const char *rname;
const char *lname;
enum {V_RO, V_RW, V_WO} access;
- char ishdr;
+ const char *hdr;
unsigned methods;
};
/* vcc_acl.c */
void vcc_Acl(struct tokenlist *tl);
-void vcc_Cond_Ip(struct var *vp, struct tokenlist *tl);
+void vcc_Cond_Ip(const struct var *vp, struct tokenlist *tl);
/* vcc_action.c */
void vcc_ParseAction(struct tokenlist *tl);
# Objects available in backends
set beobj {
- { backend.host WO HOSTNAME }
- { backend.port WO PORTNAME }
- { backend.dnsttl WO TIME }
+ { backend.host WO HOSTNAME {} }
+ { backend.port WO PORTNAME {} }
+ { backend.dnsttl WO TIME {} }
}
# Variables available in sessions
{ req.http.
RW HEADER
{recv pipe pass hash miss hit fetch }
+ HDR_REQ
}
# Possibly misnamed, not really part of the request
{ bereq.http.
RW HEADER
{ pipe pass miss }
+ HDR_BEREQ
}
# The (possibly) cached object
{ obj.http.
RW HEADER
{ hit fetch }
+ HDR_OBJ
}
{ obj.valid
{ resp.http.
RW HEADER
{ deliver }
+ HDR_RESP
}
# Miscellaneous
append l " | "
append l VCL_MET_[string toupper $i]
}
+ if {$l == ""} {
+ return "0"
+ }
return [string range $l 3 end]
}
puts $fo "\t NULL,"
}
puts $fo "\t V_$a,"
- puts $fo "\t 0,"
+ if {$t != "HEADER"} {
+ puts $fo "\t 0,"
+ } else {
+ puts $fo "\t \"[lindex $v 4]\","
+ }
puts $fo "\t [method_map [lindex $v 3]]"
puts $fo "\t\},"
"VRT_l_backend_host(backend, ",
V_WO,
0,
-
+ 0
},
{ "backend.port", PORTNAME, 12,
NULL,
"VRT_l_backend_port(backend, ",
V_WO,
0,
-
+ 0
},
{ "backend.dnsttl", TIME, 14,
NULL,
"VRT_l_backend_dnsttl(backend, ",
V_WO,
0,
-
+ 0
},
{ NULL }
};
"VRT_r_req_http_(sp)",
"VRT_l_req_http_(sp, ",
V_RW,
- 0,
+ "HDR_REQ",
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,
"VRT_r_bereq_http_(sp)",
"VRT_l_bereq_http_(sp, ",
V_RW,
- 0,
+ "HDR_BEREQ",
VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_MISS
},
{ "obj.proto", STRING, 9,
"VRT_r_obj_http_(sp)",
"VRT_l_obj_http_(sp, ",
V_RW,
- 0,
+ "HDR_OBJ",
VCL_MET_HIT | VCL_MET_FETCH
},
{ "obj.valid", BOOL, 9,
"VRT_r_resp_http_(sp)",
"VRT_l_resp_http_(sp, ",
V_RW,
- 0,
+ "HDR_RESP",
VCL_MET_DELIVER
},
{ "now", TIME, 3,
ERRCHK(tl);
vp = vcc_FindVar(tl, tl->t, vcc_vars);
ERRCHK(tl);
+ assert(vp != NULL);
switch (vp->fmt) {
case STRING:
Fb(tl, 0, "%s", vp->rname);
HeaderVar(struct tokenlist *tl, const struct token *t, const struct var *vh)
{
char *p;
- const char *wh;
struct var *v;
int i;
v->name = p;
v->access = V_RW;
v->fmt = STRING;
- v->ishdr = 1;
+ v->hdr = vh->hdr;
v->methods = vh->methods;
- if (!memcmp(vh->name, "req.", 4))
- wh = "HDR_REQ";
- else if (!memcmp(vh->name, "resp.", 5))
- wh = "HDR_RESP";
- else if (!memcmp(vh->name, "obj.", 4))
- wh = "HDR_OBJ";
- else if (!memcmp(vh->name, "bereq.", 6))
- wh = "HDR_BEREQ";
- else
- assert(0 == 1);
- asprintf(&p, "VRT_GetHdr(sp, %s, \"\\%03o%s:\")", wh,
+ asprintf(&p, "VRT_GetHdr(sp, %s, \"\\%03o%s:\")", v->hdr,
(unsigned)(strlen(v->name + vh->len) + 1), v->name + vh->len);
AN(p);
v->rname = p;
- asprintf(&p, "VRT_SetHdr(sp, %s, \"\\%03o%s:\", ", wh,
+ asprintf(&p, "VRT_SetHdr(sp, %s, \"\\%03o%s:\", ", v->hdr,
(unsigned)(strlen(v->name + vh->len) + 1), v->name + vh->len);
AN(p);
v->lname = p;
}
static struct procuse *
-vcc_FindIllegalUse(struct proc *p, struct method *m)
+vcc_FindIllegalUse(const struct proc *p, const struct method *m)
{
struct procuse *pu;
}
static int
-vcc_CheckUseRecurse(struct tokenlist *tl, struct proc *p, struct method *m)
+vcc_CheckUseRecurse(struct tokenlist *tl, const struct proc *p, struct method *m)
{
struct proccall *pc;
struct procuse *pu;