From f776ebf34442e0ac6dfc46afd5ac47793db82ac3 Mon Sep 17 00:00:00 2001 From: amelia squires Date: Wed, 11 Sep 2024 00:02:08 -0500 Subject: add res:stop --- src/net.c | 18 ++++++++ src/net.h | 4 -- src/net/lua.c | 10 +++++ src/net/lua.h | 1 + src/net/luai.c | 6 +-- src/net/util.c | 128 ++++++++++++++++++++++++++++----------------------------- src/net/util.h | 4 +- 7 files changed, 98 insertions(+), 73 deletions(-) (limited to 'src') diff --git a/src/net.c b/src/net.c index b71b290..260657a 100644 --- a/src/net.c +++ b/src/net.c @@ -161,6 +161,8 @@ void* handle_client(void *_arg){ luaI_tsetcf(L, res_idx, "sendfile", l_sendfile); luaI_tsetcf(L, res_idx, "write", l_write); luaI_tsetcf(L, res_idx, "close", l_close); + luaI_tsetcf(L, res_idx, "stop", l_stop); + //values luaI_tseti(L, res_idx, "client_fd", client_fd); @@ -210,10 +212,18 @@ void* handle_client(void *_arg){ //call the function lua_call(L, 2, 0); + + //check if res:stop() was called + lua_pushstring(L, "_stop"); + lua_gettable(L, res_idx); + if(!lua_isnil(L, -1)) + goto net_end; } } } + +net_end: larray_clear(params); parray_lclear(owo); //dont free the rest @@ -289,6 +299,7 @@ int start_serv(lua_State* L, int port){ if (pthread_mutex_init(&con_mutex, NULL) != 0) p_fatal("con_mutex init failed\n"); + int count = 0; for(;;){ struct sockaddr_in client_addr; socklen_t client_addr_len = sizeof(client_addr); @@ -297,6 +308,13 @@ int start_serv(lua_State* L, int port){ if((*client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &client_addr_len)) < 0) p_fatal("failed to accept\n"); + if(count >= max_con){ + //deny request + free(client_fd); + continue; + } + count++; + //open a state to call shit, should be somewhat thread safe thread_arg_struct* args = malloc(sizeof * args); diff --git a/src/net.h b/src/net.h index 2efab03..d9c8b4c 100644 --- a/src/net.h +++ b/src/net.h @@ -20,10 +20,6 @@ int64_t recv_full_buffer(int client_fd, char** _buffer, int* header_eof, int* st int parse_header(char* buffer, int header_eof, parray_t** _table); -void http_build(str** _dest, int code, char* code_det, char* header_vs, char* content, size_t len); - -void http_code(int code, char* code_det); - void i_write_header(lua_State* L, int header_top, str** _resp, char* content, size_t len); void client_fd_errors(int client_fd); diff --git a/src/net/lua.c b/src/net/lua.c index 2995326..dd73db2 100644 --- a/src/net/lua.c +++ b/src/net/lua.c @@ -104,6 +104,16 @@ int l_close(lua_State* L){ return 0; } +int l_stop(lua_State* L){ + int res_idx = 1; + + lua_pushstring(L, "_stop"); + lua_pushboolean(L, 1); + lua_settable(L, res_idx); + + return 0; +} + int l_roll(lua_State* L){ int alen; if(lua_gettop(L) > 2) { diff --git a/src/net/lua.h b/src/net/lua.h index 794e45f..19f7262 100644 --- a/src/net/lua.h +++ b/src/net/lua.h @@ -3,6 +3,7 @@ int l_write(lua_State* L); int l_send(lua_State* L); int l_close(lua_State* L); +int l_stop(lua_State* L); int l_roll(lua_State* L); #define bsize 512 int l_sendfile(lua_State* L); diff --git a/src/net/luai.c b/src/net/luai.c index ea93285..1929818 100644 --- a/src/net/luai.c +++ b/src/net/luai.c @@ -1,5 +1,6 @@ #include "luai.h" #include "common.h" +#include "util.h" void i_write_header(lua_State* L, int header_top, str** _resp, char* content, size_t len){ str* resp; @@ -24,9 +25,8 @@ void i_write_header(lua_State* L, int header_top, str** _resp, char* content, si lua_gettable(L, header_top); int code = luaL_checkinteger(L, -1); - char code_det[50] = {0}; - http_code(code, code_det); - http_build(&resp, code, code_det, header_vs->c, content, len); + const char* code_det = http_code(code); + http_build(&resp, code, code_det, header_vs->c, content, len); str_free(header_vs); *_resp = resp; diff --git a/src/net/util.c b/src/net/util.c index 1fec987..2dd9a7f 100644 --- a/src/net/util.c +++ b/src/net/util.c @@ -128,7 +128,7 @@ int parse_header(char* buffer, int header_eof, parray_t** _table){ * @brief contructs an http request * */ -void http_build(str** _dest, int code, char* code_det, char* header_vs, char* content, size_t len){ +void http_build(str** _dest, int code, const char* code_det, char* header_vs, char* content, size_t len){ char* dest = malloc(HTTP_BUFFER_SIZE); memset(dest, 0, HTTP_BUFFER_SIZE); @@ -147,70 +147,70 @@ void http_build(str** _dest, int code, char* code_det, char* header_vs, char* co * @brief gets a string representation of a http code * */ -void http_code(int code, char* code_det){ +const char* http_code(int code){ switch(code){ - case 100: sprintf(code_det,"Continue"); break; - case 101: sprintf(code_det,"Switching Protocols"); break; - case 102: sprintf(code_det,"Processing"); break; - case 103: sprintf(code_det,"Early Hints"); break; - case 200: sprintf(code_det,"OK"); break; - case 201: sprintf(code_det,"Created"); break; - case 202: sprintf(code_det,"Accepted"); break; - case 203: sprintf(code_det,"Non-Authoritative Information"); break; - case 204: sprintf(code_det,"No Content"); break; - case 205: sprintf(code_det,"Reset Content"); break; - case 206: sprintf(code_det,"Partial Content"); break; - case 207: sprintf(code_det,"Multi-Status"); break; - case 208: sprintf(code_det,"Already Reported"); break; - case 226: sprintf(code_det,"IM Used"); break; - case 300: sprintf(code_det,"Multiple Choices"); break; - case 301: sprintf(code_det,"Moved Permanently"); break; - case 302: sprintf(code_det,"Found"); break; - case 303: sprintf(code_det,"See Other"); break; - case 304: sprintf(code_det,"Not Modified"); break; - case 307: sprintf(code_det,"Temporary Redirect"); break; - case 308: sprintf(code_det,"Permanent Redirect"); break; - case 400: sprintf(code_det,"Bad Request"); break; - case 401: sprintf(code_det,"Unauthorized"); break; - case 402: sprintf(code_det,"Payment Required"); break; - case 403: sprintf(code_det,"Forbidden"); break; - case 404: sprintf(code_det,"Not Found"); break; - case 405: sprintf(code_det,"Method Not Allowed"); break; - case 406: sprintf(code_det,"Not Acceptable"); break; - case 407: sprintf(code_det,"Proxy Authentication Required"); break; - case 408: sprintf(code_det,"Request Timeout"); break; - case 409: sprintf(code_det,"Conflict"); break; - case 410: sprintf(code_det,"Gone"); break; - case 411: sprintf(code_det,"Length Required"); break; - case 412: sprintf(code_det,"Precondition Failed"); break; - case 413: sprintf(code_det,"Content Too Large"); break; - case 414: sprintf(code_det,"URI Too Long"); break; - case 415: sprintf(code_det,"Unsupported Media Type"); break; - case 416: sprintf(code_det,"Range Not Satisfiable"); break; - case 417: sprintf(code_det,"Expectation Failed"); break; - case 418: sprintf(code_det,"I'm a teapot"); break; - case 421: sprintf(code_det,"Misdirected Request"); break; - case 422: sprintf(code_det,"Unprocessable Content"); break; - case 423: sprintf(code_det,"Locked"); break; - case 424: sprintf(code_det,"Failed Dependency"); break; - case 425: sprintf(code_det,"Too Early"); break; - case 426: sprintf(code_det,"Upgrade Required"); break; - case 428: sprintf(code_det,"Precondition Required"); break; - case 429: sprintf(code_det,"Too Many Requests"); break; - case 431: sprintf(code_det,"Request Header Fields Too Large"); break; - case 451: sprintf(code_det,"Unavailable For Legal Reasons"); break; - case 500: sprintf(code_det,"Internal Server Error"); break; - case 501: sprintf(code_det,"Not Implemented"); break; - case 502: sprintf(code_det,"Bad Gateway"); break; - case 503: sprintf(code_det,"Service Unavailable"); break; - case 504: sprintf(code_det,"Gateway Timeout"); break; - case 505: sprintf(code_det,"HTTP Version Not Supported"); break; - case 506: sprintf(code_det,"Variant Also Negotiates"); break; - case 507: sprintf(code_det,"Insufficient Storage"); break; - case 508: sprintf(code_det,"Loop Detected"); break; - case 510: sprintf(code_det,"Not Extended"); break; - case 511: sprintf(code_det,"Network Authentication Required"); break; - default: sprintf(code_det,"unknown"); + case 100: return "Continue"; break; + case 101: return "Switching Protocols"; break; + case 102: return "Processing"; break; + case 103: return "Early Hints"; break; + case 200: return "OK"; break; + case 201: return "Created"; break; + case 202: return "Accepted"; break; + case 203: return "Non-Authoritative Information"; break; + case 204: return "No Content"; break; + case 205: return "Reset Content"; break; + case 206: return "Partial Content"; break; + case 207: return "Multi-Status"; break; + case 208: return "Already Reported"; break; + case 226: return "IM Used"; break; + case 300: return "Multiple Choices"; break; + case 301: return "Moved Permanently"; break; + case 302: return "Found"; break; + case 303: return "See Other"; break; + case 304: return "Not Modified"; break; + case 307: return "Temporary Redirect"; break; + case 308: return "Permanent Redirect"; break; + case 400: return "Bad Request"; break; + case 401: return "Unauthorized"; break; + case 402: return "Payment Required"; break; + case 403: return "Forbidden"; break; + case 404: return "Not Found"; break; + case 405: return "Method Not Allowed"; break; + case 406: return "Not Acceptable"; break; + case 407: return "Proxy Authentication Required"; break; + case 408: return "Request Timeout"; break; + case 409: return "Conflict"; break; + case 410: return "Gone"; break; + case 411: return "Length Required"; break; + case 412: return "Precondition Failed"; break; + case 413: return "Content Too Large"; break; + case 414: return "URI Too Long"; break; + case 415: return "Unsupported Media Type"; break; + case 416: return "Range Not Satisfiable"; break; + case 417: return "Expectation Failed"; break; + case 418: return "I'm a teapot"; break; + case 421: return "Misdirected Request"; break; + case 422: return "Unprocessable Content"; break; + case 423: return "Locked"; break; + case 424: return "Failed Dependency"; break; + case 425: return "Too Early"; break; + case 426: return "Upgrade Required"; break; + case 428: return "Precondition Required"; break; + case 429: return "Too Many Requests"; break; + case 431: return "Request Header Fields Too Large"; break; + case 451: return "Unavailable For Legal Reasons"; break; + case 500: return "Internal Server Error"; break; + case 501: return "Not Implemented"; break; + case 502: return "Bad Gateway"; break; + case 503: return "Service Unavailable"; break; + case 504: return "Gateway Timeout"; break; + case 505: return "HTTP Version Not Supported"; break; + case 506: return "Variant Also Negotiates"; break; + case 507: return "Insufficient Storage"; break; + case 508: return "Loop Detected"; break; + case 510: return "Not Extended"; break; + case 511: return "Network Authentication Required"; break; + default: return "unknown"; } } diff --git a/src/net/util.h b/src/net/util.h index 98d4d93..fbe73f8 100644 --- a/src/net/util.h +++ b/src/net/util.h @@ -32,7 +32,7 @@ int parse_header(char* buffer, int header_eof, parray_t** _table); * @param {char*} response content * @param {size_t} content length */ -void http_build(str** _dest, int code, char* code_det, char* header_vs, char* content, size_t len); +void http_build(str** _dest, int code, const char* code_det, char* header_vs, char* content, size_t len); /** * @brief gets a string representation of a http code @@ -40,7 +40,7 @@ void http_build(str** _dest, int code, char* code_det, char* header_vs, char* co * @param {int} http response code * @param {char*} allocated destination string */ -void http_code(int code, char* code_det); +const char* http_code(int code); void client_fd_errors(int client_fd); -- cgit v1.2.3