:param class_txn txn: The class txn object containing the data.
:param opaque data: The data which is stored in the transaction.
-.. js:function:: TXN.set_var(TXN, var, value)
+.. js:function:: TXN.set_var(TXN, var, value[, ifexist])
Converts a Lua type in a HAProxy type and store it in a variable <var>.
:param string var: The variable name according with the HAProxy variable syntax.
:param type value: The value associated to the variable. The type can be string or
integer.
+ :param boolean ifexist: If this parameter is set to a truthy value the variable
+ will only be set if it was defined elsewhere (i.e. used
+ within the configuration). It is highly recommended to
+ always set this to true.
.. js:function:: TXN.unset_var(TXN, var)
:param opaque data: The data which is stored in the transaction.
:see: :js:func:`AppletHTTP.get_priv`
-.. js:function:: AppletHTTP.set_var(applet, var, value)
+.. js:function:: AppletHTTP.set_var(applet, var, value[, ifexist])
Converts a Lua type in a HAProxy type and store it in a variable <var>.
:param string var: The variable name according with the HAProxy variable syntax.
:param type value: The value associated to the variable. The type ca be string or
integer.
+ :param boolean ifexist: If this parameter is set to a truthy value the variable
+ will only be set if it was defined elsewhere (i.e. used
+ within the configuration). It is highly recommended to
+ always set this to true.
:see: :js:func:`AppletHTTP.unset_var`
:see: :js:func:`AppletHTTP.get_var`
:param opaque data: The data which is stored in the transaction.
:see: :js:func:`AppletTCP.get_priv`
-.. js:function:: AppletTCP.set_var(applet, var, value)
+.. js:function:: AppletTCP.set_var(applet, var, value[, ifexist])
Converts a Lua type in a HAProxy type and stores it in a variable <var>.
:param string var: The variable name according with the HAProxy variable syntax.
:param type value: The value associated to the variable. The type can be string or
integer.
+ :param boolean ifexist: If this parameter is set to a truthy value the variable
+ will only be set if it was defined elsewhere (i.e. used
+ within the configuration). It is highly recommended to
+ always set this to true.
:see: :js:func:`AppletTCP.unset_var`
:see: :js:func:`AppletTCP.get_var`
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)
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"
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
size_t len;
struct sample smp;
- MAY_LJMP(check_args(L, 3, "set_var"));
+ if (lua_gettop(L) < 3 || lua_gettop(L) > 4)
+ WILL_LJMP(luaL_error(L, "'set_var' needs between 3 and 4 arguments"));
/* It is useles to retrieve the stream, but this function
* runs only in a stream context.
/* Store the sample in a variable. */
smp_set_owner(&smp, s->be, s->sess, s, 0);
- lua_pushboolean(L, vars_set_by_name(name, len, &smp) != 0);
+
+ if (lua_gettop(L) == 4 && lua_toboolean(L, 4))
+ lua_pushboolean(L, vars_set_by_name_ifexist(name, len, &smp) != 0);
+ else
+ lua_pushboolean(L, vars_set_by_name(name, len, &smp) != 0);
+
return 1;
}
size_t len;
struct sample smp;
- MAY_LJMP(check_args(L, 3, "set_var"));
+ if (lua_gettop(L) < 3 || lua_gettop(L) > 4)
+ WILL_LJMP(luaL_error(L, "'set_var' needs between 3 and 4 arguments"));
/* It is useles to retrieve the stream, but this function
* runs only in a stream context.
/* Store the sample in a variable. */
smp_set_owner(&smp, s->be, s->sess, s, 0);
- lua_pushboolean(L, vars_set_by_name(name, len, &smp) != 0);
+
+ if (lua_gettop(L) == 4 && lua_toboolean(L, 4))
+ lua_pushboolean(L, vars_set_by_name_ifexist(name, len, &smp) != 0);
+ else
+ lua_pushboolean(L, vars_set_by_name(name, len, &smp) != 0);
+
return 1;
}
size_t len;
struct sample smp;
- MAY_LJMP(check_args(L, 3, "set_var"));
+ if (lua_gettop(L) < 3 || lua_gettop(L) > 4)
+ WILL_LJMP(luaL_error(L, "'set_var' needs between 3 and 4 arguments"));
/* It is useles to retrieve the stream, but this function
* runs only in a stream context.
/* Store the sample in a variable. */
smp_set_owner(&smp, htxn->p, htxn->s->sess, htxn->s, htxn->dir & SMP_OPT_DIR);
- lua_pushboolean(L, vars_set_by_name(name, len, &smp) != 0);
+
+ if (lua_gettop(L) == 4 && lua_toboolean(L, 4))
+ lua_pushboolean(L, vars_set_by_name_ifexist(name, len, &smp) != 0);
+ else
+ lua_pushboolean(L, vars_set_by_name(name, len, &smp) != 0);
+
return 1;
}