diff options
-rw-r--r-- | default.lua | 4 | ||||
-rw-r--r-- | response.c | 30 |
2 files changed, 29 insertions, 5 deletions
diff --git a/default.lua b/default.lua index d3a0c61..95ba609 100644 --- a/default.lua +++ b/default.lua @@ -1,5 +1,7 @@ --- Default client request handler. -- TODO: Add documentation once request and response API are more stable. return function (method, path, version, headers, data) - return [["Hello from plop/lua!"]] + local response_data = [["Hello from plop/lua!"]] + local headers = {Connection="close", ["Content-Length"]=#response_data, ["Content-Type"]="application/json"} + return {status=200, headers=headers, data=response_data} end @@ -1,5 +1,6 @@ #include "response.h" +#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -100,11 +101,32 @@ int response_send(lua_State * L, const int fd) buffer[bytes_used + 1] = '\n'; bytes_used += 2; - // TODO: Add data write + lua_pushstring(L, "data"); + lua_gettable(L, -2); + size_t data_length = 0; + const char * data = lua_tolstring(L, -1, &data_length); - int result = write(fd, buffer, bytes_used ); - free(buffer); - lua_pop(L, 1); + if (NULL != data && 0 < data_length) + { + // TODO: There are quite a few parts which could be moved out of this function. + if (bytes_total < bytes_used + (int) data_length) + { + bytes_total += data_length; + buffer = realloc(buffer, bytes_total); + if (NULL == buffer) + { + lua_pop(L, 2); + return write(fd, error_response, strlen(error_response)); + } + } + + memcpy(buffer + bytes_used, data, data_length); + bytes_used += data_length; + } + + int result = write(fd, buffer, bytes_used); + free(buffer); // TODO: Don't free the buffer if EAGAIN or EWOULDBLOCK, so it can be reused. + lua_pop(L, 2); return result; } |