From 53b5ea2bafca4ea7e9bdcbe55f1ed0a458b270e1 Mon Sep 17 00:00:00 2001 From: Aki Date: Sat, 15 Aug 2020 16:31:05 +0200 Subject: Moved headers parsing to new system and extended default lua script with debug --- default.lua | 7 ++++++- plop.c | 2 +- request.c | 49 ++++++++++++++++--------------------------------- request.h | 3 --- 4 files changed, 23 insertions(+), 38 deletions(-) diff --git a/default.lua b/default.lua index 1dc535f..914c990 100644 --- a/default.lua +++ b/default.lua @@ -1,5 +1,10 @@ --- Default client request handler. --- @return string Body of the response -function Handler (...) +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") + end + print(data) return [["Hello, from plop/Lua"]] end diff --git a/plop.c b/plop.c index e770a5a..4aadd2f 100644 --- a/plop.c +++ b/plop.c @@ -113,7 +113,7 @@ int handle_client(lua_State * L, struct pollfd * pfd, struct request ** request, lua_getglobal((*request)->lua, "Handler"); lua_insert((*request)->lua, 1); lua_pushlstring((*request)->lua, (*request)->data, (*request)->length); - lua_call((*request)->lua, 4, 1); + lua_call((*request)->lua, 5, 1); size_t length; const char * body = lua_tolstring((*request)->lua, -1, &length); diff --git a/request.c b/request.c index d67eab7..7902f1f 100644 --- a/request.c +++ b/request.c @@ -13,7 +13,6 @@ #include "http.h" static const int REQUEST_DATA_SIZE = 4096; -static const int MAX_HEADERS = 30; /// Allocates and initializes request structure. /// \return Pointer to initialized request or NULL in case of an error @@ -54,11 +53,6 @@ void free_request(lua_State * L, struct request * request) free(request->data); } - if (NULL != request->headerv) - { - free(request->headerv); - } - luaL_unref(L, LUA_REGISTRYINDEX, request->reference); free(request); @@ -246,16 +240,9 @@ int parse_step_version(struct request * request) /// \return -1 if an error has occured, 0 if too little data available or total number of bytes processed int parse_step_header_name(struct request * request) { - if (NULL == request->headerv) + if (0 == lua_istable(request->lua, -1)) { - request->headerv = malloc(sizeof(struct header) * MAX_HEADERS); - request->headerc = 0; - memset(request->headerv, 0, sizeof(struct header) * MAX_HEADERS); - - if (NULL == request->headerv) - { - return -1; - } + lua_newtable(request->lua); } // TODO: Check for the header section end without backtracking. @@ -275,11 +262,11 @@ int parse_step_header_name(struct request * request) request->position = position; - if (0 >= request->headerv[request->headerc].name.start) + if (0 >= request->temp.start) { - request->headerv[request->headerc].name.start = read_until_word(request); + request->temp.start = read_until_word(request); - if (0 == request->headerv[request->headerc].name.start) + if (0 == request->temp.start) { return 0; } @@ -292,13 +279,13 @@ int parse_step_header_name(struct request * request) return 0; } - request->headerv[request->headerc].name.length = request->position - request->headerv[request->headerc].name.start; - request->step = parse_step_header_value; + request->temp.length = request->position - request->temp.start; + + lua_pushlstring(request->lua, request->data + request->temp.start, request->temp.length); // Skip ':' request->position++; - - return parse_step_header_value(request); + PROCEED_TO(parse_step_header_value); } /// Parses and verifies value of a single header from the request. @@ -306,11 +293,11 @@ int parse_step_header_name(struct request * request) /// \return -1 if an error has occured, 0 if too little data available or total number of bytes processed int parse_step_header_value(struct request * request) { - if (0 >= request->headerv[request->headerc].value.start) + if (0 >= request->temp.start) { - request->headerv[request->headerc].value.start = read_until_word(request); + request->temp.start = read_until_word(request); - if (0 == request->headerv[request->headerc].value.start) + if (0 == request->temp.start) { return 0; } @@ -323,14 +310,10 @@ int parse_step_header_value(struct request * request) return 0; } - request->headerv[request->headerc].value.length = request->position - request->headerv[request->headerc].value.start; - request->step = parse_step_header_name; - request->headerc++; + request->temp.length = request->position - request->temp.start; - if (MAX_HEADERS == request->headerc) - { - return -1; - } + lua_pushlstring(request->lua, request->data + request->temp.start, request->temp.length); + lua_rawset(request->lua, -3); - return parse_step_header_name(request); + PROCEED_TO(parse_step_header_name); } diff --git a/request.h b/request.h index be5ff0e..26284f0 100644 --- a/request.h +++ b/request.h @@ -23,9 +23,6 @@ struct request lua_State * lua; int reference; struct span temp; - struct header * headerv; - int headerc; - struct span body; }; struct request * new_request(lua_State *); -- cgit v1.1