MEDIUM: lua: Add `ifexist` parameter to `set_var`
As discussed in GitHub issue #624 Lua scripts should not use
variables that are never going to be read, because the memory
for variable names is never going to be freed.
Add an optional `ifexist` parameter to the `set_var` function
that allows a Lua developer to set variables that are going to
be ignored if the variable name was not used elsewhere before.
Usually this mean that there is no `var()` sample fetch for the
variable in question within the configuration.
diff --git a/reg-tests/lua/set_var.lua b/reg-tests/lua/set_var.lua
index 78d1fd4..f4d5e7a 100644
--- a/reg-tests/lua/set_var.lua
+++ b/reg-tests/lua/set_var.lua
@@ -10,3 +10,16 @@
applet:start_response()
applet:send("")
end)
+
+core.register_service("set_var_ifexist", "http", function(applet)
+ local var_name = applet.headers["var"][0]
+ local result = applet:set_var(var_name, "value", true)
+ if result then
+ applet:set_status(202)
+ else
+ applet:set_status(400)
+ end
+ applet:add_header("echo", applet:get_var(var_name) or "(nil)")
+ applet:start_response()
+ applet:send("")
+end)
diff --git a/reg-tests/lua/set_var.vtc b/reg-tests/lua/set_var.vtc
index 2f1ba4e..5d37fcb 100644
--- a/reg-tests/lua/set_var.vtc
+++ b/reg-tests/lua/set_var.vtc
@@ -13,11 +13,20 @@
bind "fd@${fe1}"
http-request use-service lua.set_var
+
+ frontend fe2
+ mode http
+ ${no-htx} option http-use-htx
+ bind "fd@${fe2}"
+
+ http-request set-header Dummy %[var(txn.fe2_foo)]
+
+ http-request use-service lua.set_var_ifexist
} -start
client c0 -connect ${h1_fe1_sock} {
txreq -url "/" \
- -hdr "Var: txn.foo"
+ -hdr "Var: txn.fe1_foo"
rxresp
expect resp.status == 202
expect resp.http.echo == "value"
@@ -27,3 +36,16 @@
expect resp.status == 400
expect resp.http.echo == "(nil)"
} -run
+
+client c1 -connect ${h1_fe2_sock} {
+ txreq -url "/" \
+ -hdr "Var: txn.fe2_foo"
+ rxresp
+ expect resp.status == 202
+ expect resp.http.echo == "value"
+ txreq -url "/" \
+ -hdr "Var: txn.fe2_bar"
+ rxresp
+ expect resp.status == 400
+ expect resp.http.echo == "(nil)"
+} -run