diff options
-rw-r--r-- | plop.c | 5 | ||||
-rw-r--r-- | request.c | 16 | ||||
-rw-r--r-- | request.h | 10 |
3 files changed, 21 insertions, 10 deletions
@@ -13,7 +13,6 @@ #include <lauxlib.h> #include <lua.h> -#include <lualib.h> #include "http.h" #include "request.h" @@ -104,7 +103,7 @@ int handle_client(lua_State * L, struct pollfd * pfd, struct request ** request, return -1; // TODO: Handle errors properly } - if (-1 == parse_request(pfd->fd, request)) + if (-1 == parse_request(L, pfd->fd, request)) { respond_only_status(pfd->fd, STATUS_BAD_REQUEST); return -1; // TODO: Handle errors properly @@ -150,7 +149,7 @@ int handle_client(lua_State * L, struct pollfd * pfd, struct request ** request, if (NULL != *request) { - free_request(*request); + free_request(L, *request); *request = NULL; } @@ -7,6 +7,9 @@ #include <string.h> #include <unistd.h> +#include <lauxlib.h> +#include <lua.h> + #include "http.h" static const int REQUEST_DATA_SIZE = 4096; @@ -15,7 +18,7 @@ static const int MAX_HEADERS = 30; /// Allocates and initializes request structure. /// \return Pointer to initialized request or NULL in case of an error /// \see /free_request -struct request * new_request(void) +struct request * new_request(lua_State * L) { struct request * request = malloc(sizeof(struct request)); @@ -35,13 +38,16 @@ struct request * new_request(void) return NULL; } + request->lua = lua_newthread(L); + request->reference = luaL_ref(L, LUA_REGISTRYINDEX); + return request; } /// Releases memory used by the request and the request itself. /// \param request Request to free /// \see /new_request -void free_request(struct request * request) +void free_request(lua_State * L, struct request * request) { if (NULL != request->data) { @@ -53,6 +59,8 @@ void free_request(struct request * request) free(request->headerv); } + luaL_unref(L, LUA_REGISTRYINDEX, request->reference); + free(request); } @@ -60,11 +68,11 @@ void free_request(struct request * request) /// \param fd Client socket /// \param request Pointer to current request context of handled client /// \return Number of bytes parsed, -1 if an error occured or 0 if expects more data -int parse_request(const int fd, struct request ** request) +int parse_request(lua_State * L, const int fd, struct request ** request) { if (NULL == *request) { - *request = new_request(); + *request = new_request(L); if (NULL == *request) { return -1; @@ -1,5 +1,7 @@ #pragma once +#include <lua.h> + struct span { int start; @@ -18,6 +20,8 @@ struct request char * data; int length; int position; + lua_State * lua; + int reference; struct span method; struct span path; struct span version; @@ -26,10 +30,10 @@ struct request struct span body; }; -struct request * new_request(void); -void free_request(struct request *); +struct request * new_request(lua_State *); +void free_request(lua_State *, struct request *); -int parse_request(int, struct request **); +int parse_request(lua_State *, int, struct request **); int parse_step_method(struct request *); int parse_step_path(struct request *); |