MINOR: lua: add set/get priv for applets

The applet can't have access to the session private data. This patch
fix this problem. Now an applet can use private data stored by actions
and fecthes.
This commit is contained in:
Thierry FOURNIER
2015-12-25 01:33:18 +01:00
committed by Willy Tarreau
parent e34a78e5ce
commit 8db004cbf4
2 changed files with 105 additions and 3 deletions

View File

@@ -3254,6 +3254,37 @@ static int hlua_applet_tcp_new(lua_State *L, struct appctx *ctx)
return 1;
}
__LJMP static int hlua_applet_tcp_set_priv(lua_State *L)
{
struct hlua_appctx *appctx = MAY_LJMP(hlua_checkapplet_tcp(L, 1));
struct stream *s = appctx->htxn.s;
struct hlua *hlua = &s->hlua;
MAY_LJMP(check_args(L, 2, "set_priv"));
/* Remove previous value. */
if (hlua->Mref != -1)
luaL_unref(L, hlua->Mref, LUA_REGISTRYINDEX);
/* Get and store new value. */
lua_pushvalue(L, 2); /* Copy the element 2 at the top of the stack. */
hlua->Mref = luaL_ref(L, LUA_REGISTRYINDEX); /* pop the previously pushed value. */
return 0;
}
__LJMP static int hlua_applet_tcp_get_priv(lua_State *L)
{
struct hlua_appctx *appctx = MAY_LJMP(hlua_checkapplet_tcp(L, 1));
struct stream *s = appctx->htxn.s;
struct hlua *hlua = &s->hlua;
/* Push configuration index in the stack. */
lua_rawgeti(L, LUA_REGISTRYINDEX, hlua->Mref);
return 1;
}
/* If expected data not yet available, it returns a yield. This function
* consumes the data in the buffer. It returns a string containing the
* data. This string can be empty.
@@ -3596,6 +3627,37 @@ static int hlua_applet_http_new(lua_State *L, struct appctx *ctx)
return 1;
}
__LJMP static int hlua_applet_http_set_priv(lua_State *L)
{
struct hlua_appctx *appctx = MAY_LJMP(hlua_checkapplet_http(L, 1));
struct stream *s = appctx->htxn.s;
struct hlua *hlua = &s->hlua;
MAY_LJMP(check_args(L, 2, "set_priv"));
/* Remove previous value. */
if (hlua->Mref != -1)
luaL_unref(L, hlua->Mref, LUA_REGISTRYINDEX);
/* Get and store new value. */
lua_pushvalue(L, 2); /* Copy the element 2 at the top of the stack. */
hlua->Mref = luaL_ref(L, LUA_REGISTRYINDEX); /* pop the previously pushed value. */
return 0;
}
__LJMP static int hlua_applet_http_get_priv(lua_State *L)
{
struct hlua_appctx *appctx = MAY_LJMP(hlua_checkapplet_http(L, 1));
struct stream *s = appctx->htxn.s;
struct hlua *hlua = &s->hlua;
/* Push configuration index in the stack. */
lua_rawgeti(L, LUA_REGISTRYINDEX, hlua->Mref);
return 1;
}
/* If expected data not yet available, it returns a yield. This function
* consumes the data in the buffer. It returns a string containing the
* data. This string can be empty.
@@ -6826,9 +6888,11 @@ void hlua_init(void)
lua_newtable(gL.T);
/* Register Lua functions. */
hlua_class_function(gL.T, "getline", hlua_applet_tcp_getline);
hlua_class_function(gL.T, "receive", hlua_applet_tcp_recv);
hlua_class_function(gL.T, "send", hlua_applet_tcp_send);
hlua_class_function(gL.T, "getline", hlua_applet_tcp_getline);
hlua_class_function(gL.T, "receive", hlua_applet_tcp_recv);
hlua_class_function(gL.T, "send", hlua_applet_tcp_send);
hlua_class_function(gL.T, "set_priv", hlua_applet_tcp_set_priv);
hlua_class_function(gL.T, "get_priv", hlua_applet_tcp_get_priv);
lua_settable(gL.T, -3);
@@ -6857,6 +6921,8 @@ void hlua_init(void)
lua_newtable(gL.T);
/* Register Lua functions. */
hlua_class_function(gL.T, "set_priv", hlua_applet_http_set_priv);
hlua_class_function(gL.T, "get_priv", hlua_applet_http_get_priv);
hlua_class_function(gL.T, "getline", hlua_applet_http_getline);
hlua_class_function(gL.T, "receive", hlua_applet_http_recv);
hlua_class_function(gL.T, "send", hlua_applet_http_send);