From: Thierry FOURNIER Date: Fri, 25 Dec 2015 00:33:18 +0000 (+0100) Subject: MINOR: lua: add set/get priv for applets X-Git-Tag: v1.7-dev2~166 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8db004cbf49ea2bd8da736928bf6bc2fbe71fdf1;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/doc/lua-api/index.rst b/doc/lua-api/index.rst index 7eef9e4708..6adb72ef63 100644 --- a/doc/lua-api/index.rst +++ b/doc/lua-api/index.rst @@ -1596,6 +1596,24 @@ AppletHTTP class :param class_AppletHTTP applet: An :ref:`applethttp_class` :param string msg: the message to send. +.. js:function:: AppletHTTP.get_priv(applet) + + Return Lua data stored in the current transaction (with the + `AppletHTTP.set_priv()`) function. If no data are stored, it returns a nil + value. + + :param class_AppletHTTP applet: An :ref:`applethttp_class` + :returns: the opaque data previsously stored, or nil if nothing is + avalaible. + +.. js:function:: AppletHTTP.set_priv(applet, data) + + Store any data in the current HAProxy transaction. This action replace the + old stored data. + + :param class_AppletHTTP applet: An :ref:`applethttp_class` + :param opaque data: The data which is stored in the transaction. + .. _applettcp_class: AppletTCP class @@ -1659,6 +1677,24 @@ AppletTCP class :param class_AppletTCP applet: An :ref:`applettcp_class` :param string msg: the message to send. +.. js:function:: AppletTCP.get_priv(applet) + + Return Lua data stored in the current transaction (with the + `AppletTCP.set_priv()`) function. If no data are stored, it returns a nil + value. + + :param class_AppletTCP applet: An :ref:`applettcp_class` + :returns: the opaque data previsously stored, or nil if nothing is + avalaible. + +.. js:function:: AppletTCP.set_priv(applet, data) + + Store any data in the current HAProxy transaction. This action replace the + old stored data. + + :param class_AppletTCP applet: An :ref:`applettcp_class` + :param opaque data: The data which is stored in the transaction. + External Lua libraries ====================== diff --git a/src/hlua.c b/src/hlua.c index d70b01b6ca..5cf23203fc 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -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);