You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by jp...@apache.org on 2012/06/12 17:51:37 UTC
[27/50] git commit: Add Lua plugin forwarding wrappers
Add Lua plugin forwarding wrappers
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/ce8d011d
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/ce8d011d
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/ce8d011d
Branch: refs/heads/jpeach/lua
Commit: ce8d011d78386b349d8f05d99de3441a8f5403fc
Parents: 73bf155
Author: James Peach <jp...@apache.org>
Authored: Mon Apr 9 22:05:42 2012 -0700
Committer: James Peach <jp...@apache.org>
Committed: Tue Jun 12 08:48:34 2012 -0700
----------------------------------------------------------------------
plugins/lua/lua.cc | 108 ++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 92 insertions(+), 16 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/ce8d011d/plugins/lua/lua.cc
----------------------------------------------------------------------
diff --git a/plugins/lua/lua.cc b/plugins/lua/lua.cc
index 7deefe6..0accbb5 100644
--- a/plugins/lua/lua.cc
+++ b/plugins/lua/lua.cc
@@ -56,6 +56,88 @@ static const luaL_Reg LUAEXPORTS[] =
{ NULL, NULL}
};
+static TSReturnCode
+LuaPluginInit(lua_State * lua)
+{
+ TSReturnCode status = TS_ERROR;
+
+ lua_getglobal(lua, "init");
+ if (lua_isnil(lua, -1)) {
+ // No "init" callback.
+ return TS_SUCCESS;
+ }
+
+ if (lua_pcall(lua, 0, 1, 0) != 0) {
+ TSDebug("lua", "init failed: %s", lua_tostring(lua, -1));
+ lua_pop(lua, 1);
+ }
+
+ // Return type is bool; check it and pop it.
+ if (lua_isboolean(lua, 1) && lua_isboolean(lua, 1)) {
+ status = TS_SUCCESS;
+ }
+
+ lua_pop(lua, 1);
+ return status;
+}
+
+static TSReturnCode
+LuaPluginRelease(lua_State * lua)
+{
+ lua_getglobal(lua, "release");
+ if (lua_isnil(lua, -1)) {
+ // No "release" callback.
+ return TS_SUCCESS;
+ }
+
+ if (lua_pcall(lua, 0, 0, 0) != 0) {
+ TSDebug("lua", "release failed: %s", lua_tostring(lua, -1));
+ lua_pop(lua, 1);
+ }
+
+ lua_close(lua);
+ return TS_SUCCESS;
+}
+
+static TSRemapStatus
+LuaPluginRemap(lua_State * lua, TSHttpTxn txn, TSRemapRequestInfo * rri)
+{
+ lua_Integer status = TSREMAP_ERROR;
+
+ lua_getglobal(lua, "remap");
+ if (lua_isnil(lua, -1)) {
+ // No "remap" callback, better continue.
+ return TSREMAP_NO_REMAP;
+ }
+
+ if (lua_pcall(lua, 0, 1, 0) != 0) {
+ TSDebug("lua", "remap failed: %s", lua_tostring(lua, -1));
+ lua_pop(lua, 1);
+ return TSREMAP_ERROR;
+ }
+
+ // Return type is integer. It must be one of the REMAP constants.
+ if (!lua_isnumber(lua, 1)) {
+ lua_pop(lua, 1);
+ return TSREMAP_ERROR;
+ }
+
+ status = lua_tointeger(lua, 1);
+ lua_pop(lua, 1);
+
+ // Lua remap plugins only get to say whether to continue the remap chain or to stop.
+ switch (status) {
+ case TSREMAP_DID_REMAP:
+ case TSREMAP_NO_REMAP_STOP:
+ return (TSRemapStatus)status;
+ case TSREMAP_NO_REMAP:
+ case TSREMAP_DID_REMAP_STOP:
+ case TSREMAP_ERROR:
+ default:
+ return TSREMAP_ERROR;
+ }
+}
+
TSReturnCode
TSRemapInit(TSRemapInterface * api_info, char * errbuf, int errbuf_size)
{
@@ -83,7 +165,7 @@ TSRemapNewInstance(int argc, char * argv[], void ** ih, char * errbuf, int errbu
TSReleaseAssert(lua_istable(lua, -1));
// Push constants into the "ts" module.
- lua_pushinteger(lua, TSREMAP_DID_REMAP);
+ lua_pushinteger(lua, TSREMAP_DID_REMAP_STOP);
lua_setfield(lua, -2, "REMAP_COMPLETE");
lua_pushinteger(lua, TSREMAP_DID_REMAP);
@@ -103,14 +185,13 @@ TSRemapNewInstance(int argc, char * argv[], void ** ih, char * errbuf, int errbu
}
}
- lua_getglobal(lua, "init");
- if (lua_pcall(lua, 0, 1, 0) != 0) {
- TSDebug("lua", "init failed: %s", lua_tostring(lua, -1));
- lua_pop(lua, 1);
+ if (LuaPluginInit(lua) == TS_SUCCESS) {
+ *ih = lua;
+ return TS_SUCCESS;
+ } else {
+ lua_close(lua);
+ return TS_ERROR;
}
-
- *ih = lua;
- return TS_SUCCESS;
}
void
@@ -118,17 +199,12 @@ TSRemapDeleteInstance(void * ih)
{
lua_State * lua = (lua_State *)ih;
- lua_getglobal(lua, "release");
- if (lua_pcall(lua, 0, 1, 0) != 0) {
- TSDebug("lua", "init failed: %s", lua_tostring(lua, -1));
- lua_pop(lua, 1);
- }
-
+ LuaPluginRelease(lua);
lua_close(lua);
}
TSRemapStatus
-TSRemapDoRemap(void * ih, TSHttpTxn rh, TSRemapRequestInfo *rri)
+TSRemapDoRemap(void * ih, TSHttpTxn txn, TSRemapRequestInfo * rri)
{
- return TSREMAP_NO_REMAP;
+ return LuaPluginRemap((lua_State *)ih, txn, rri);
}