diff options
-rw-r--r-- | default.lua | 5 | ||||
-rw-r--r-- | main.c | 2 | ||||
-rw-r--r-- | plop.c | 32 | ||||
-rw-r--r-- | plop.h | 3 |
4 files changed, 38 insertions, 4 deletions
diff --git a/default.lua b/default.lua index 914c990..14cdbc9 100644 --- a/default.lua +++ b/default.lua @@ -1,6 +1,7 @@ --- Default client request handler. --- @return string Body of the response -function Handler (method, path, version, headers, data) +local +function handler (method, path, version, headers, data) io.write("(", version, ") [", method, "] ", path, "\n") for header, value in pairs(headers) do io.write(" - ", header, " = '", value, "'\n") @@ -8,3 +9,5 @@ function Handler (method, path, version, headers, data) print(data) return [["Hello, from plop/Lua"]] end + +return handler @@ -21,7 +21,7 @@ int main(int argc, char ** argv) return 1; // TODO: Document error codes/print usage information } - if (LUA_OK != luaL_dofile(L, argv[2])) + if (LUA_OK != load_handler(L, argv[2])) { return 2; // TODO: Document error codes/print usage information } @@ -83,6 +83,36 @@ int make_server(const char * node, const char * service) return server; } +// TODO: Write documentation for load_handler +int load_handler(lua_State * L, const char * path) +{ + lua_getglobal(L, "package"); + lua_pushstring(L, "loaded"); + int result = lua_rawget(L, -2); + + if (LUA_TTABLE != result) + { + lua_pop(L, 2); + return LUA_ERRRUN; + } + + result = luaL_loadfile(L, path) || lua_pcall(L, 0, 1, 0); + + if (LUA_OK != result) + { + lua_pop(L, 3); + return result; + } + + lua_pushstring(L, "handler"); + lua_pushvalue(L, -2); + lua_rawset(L, -4); + lua_setglobal(L, "handler"); + lua_pop(L, 1); + + return LUA_OK; +} + /// Progresses the connection for a client and shifts it back in the array. /// `pfd` must be at least `shift_by + 1`-th element of the array. /// \param L Server's Lua state @@ -110,7 +140,7 @@ int handle_client(lua_State * L, struct pollfd * pfd, struct request ** request, } // TODO: Push the handler to stack earlier to avoid shifting it. - lua_getglobal((*request)->lua, "Handler"); + lua_getglobal((*request)->lua, "handler"); lua_insert((*request)->lua, 1); lua_pushlstring((*request)->lua, (*request)->data, (*request)->length); lua_call((*request)->lua, 5, 1); @@ -8,5 +8,6 @@ #include "request.h" int make_server(const char *, const char *); -int handle_client(lua_State * L, struct pollfd *, struct request **, const int); +int load_handler(lua_State *, const char *); +int handle_client(lua_State *, struct pollfd *, struct request **, const int); int handle_server(struct pollfd *, int, const int); |