mirror of
https://github.com/lxsang/antd-lua-plugin
synced 2024-12-26 17:38:21 +01:00
122 lines
2.5 KiB
C
122 lines
2.5 KiB
C
#include "lua-api.h"
|
|
|
|
void init();
|
|
call __init__ = init;
|
|
static const struct luaL_Reg modules [] = {
|
|
#ifdef USE_DB
|
|
{"sqlite", luaopen_sqlite},
|
|
#endif
|
|
{"std", luaopen_standard},
|
|
{"JSON", luaopen_json},
|
|
{"bytes",luaopen_barray},
|
|
{"array",luaopen_array},
|
|
{NULL,NULL}
|
|
};
|
|
|
|
void init()
|
|
{
|
|
//signal(SIGPIPE, SIG_IGN);
|
|
//signal(SIGABRT, SIG_IGN);
|
|
// init the plugin here
|
|
LOG("%s \n","INIT LUA HANDLER");
|
|
}
|
|
/**
|
|
|
|
* Plugin handler, reads request from the server and processes it
|
|
*
|
|
*/
|
|
static void push_dict_to_lua(lua_State* L, dictionary d)
|
|
{
|
|
lua_newtable(L);
|
|
|
|
association as;
|
|
if(d)
|
|
for_each_assoc(as, d)
|
|
{
|
|
lua_pushstring(L,as->key);
|
|
//printf("KEY %s\n", as->key);
|
|
if(EQU(as->key,"cookie") || EQU(as->key,"__xheader__"))
|
|
push_dict_to_lua(L, (dictionary)as->value);
|
|
else
|
|
{
|
|
lua_pushstring(L,as->value);
|
|
//printf("VALUE : %s\n",as->value );
|
|
}
|
|
lua_settable(L, -3);
|
|
}
|
|
}
|
|
void handle(void* client, const char* method, const char* path, dictionary rq)
|
|
{
|
|
lua_State* L = NULL;
|
|
//char * index = __s("%s/%s",__plugin__.htdocs,"router.lua");
|
|
char* cnf = config_dir();
|
|
char * apis = __s("%s/%s",cnf,"api.lua");
|
|
L = luaL_newstate();
|
|
luaL_openlibs(L);
|
|
//module loader
|
|
luaL_newlib(L, modules);
|
|
lua_setglobal(L, "modules");
|
|
// set up global variable
|
|
// API header
|
|
lua_newtable(L);
|
|
lua_pushstring(L,"name");
|
|
lua_pushstring(L, __plugin__.name);
|
|
lua_settable(L,-3);
|
|
|
|
lua_pushstring(L,"root");
|
|
lua_pushstring(L, __plugin__.htdocs);
|
|
lua_settable(L,-3);
|
|
|
|
lua_pushstring(L,"apiroot");
|
|
lua_pushstring(L, cnf);
|
|
lua_settable(L,-3);
|
|
|
|
lua_setglobal(L, "__api__");
|
|
|
|
// Request
|
|
lua_newtable(L);
|
|
lua_pushstring(L,"id");
|
|
lua_pushlightuserdata(L, client);
|
|
//lua_pushnumber(L,client);
|
|
lua_settable(L, -3);
|
|
|
|
lua_pushstring(L,"method");
|
|
lua_pushstring(L,method);
|
|
lua_settable(L, -3);
|
|
|
|
lua_pushstring(L,"path");
|
|
lua_pushstring(L,path);
|
|
lua_settable(L, -3);
|
|
|
|
lua_pushstring(L,"query");
|
|
push_dict_to_lua(L,rq);
|
|
lua_settable(L, -3);
|
|
lua_setglobal(L, "REQUEST");
|
|
|
|
// load major apis
|
|
if(is_file(apis))
|
|
if (luaL_loadfile(L, apis) || lua_pcall(L, 0, 0, 0))
|
|
{
|
|
LOG( "cannot run apis. file: %s\n", lua_tostring(L, -1));
|
|
}
|
|
|
|
/*if (luaL_loadfile(L, index) || lua_pcall(L, 0, 0, 0))
|
|
{
|
|
text(client);
|
|
__t(client, "Cannot run router: %s", lua_tostring(L, -1));
|
|
}
|
|
free(index);*/
|
|
// clear request
|
|
if(L)
|
|
lua_close(L);
|
|
if(cnf)
|
|
free(cnf);
|
|
if(apis)
|
|
free(apis);
|
|
//lua_close(L);
|
|
}
|
|
void pexit()
|
|
{
|
|
LOG("%s \n","Exit LUA Handler");
|
|
}
|