aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoramelia squires <[email protected]>2024-09-11 00:02:08 -0500
committeramelia squires <[email protected]>2024-09-11 00:02:08 -0500
commitbd405bc6f3104ba7c6d41c42561975d73fd81134 (patch)
tree25f1642859355d7cbe82a8b57549c2d2f52f8dbe
parenteda53f915dc319cec7a4fe680734db87a113fe5e (diff)
add res:stop
-rw-r--r--docs/net.md14
-rw-r--r--src/net.c18
-rw-r--r--src/net.h4
-rw-r--r--src/net/lua.c10
-rw-r--r--src/net/lua.h1
-rw-r--r--src/net/luai.c6
-rw-r--r--src/net/util.c128
-rw-r--r--src/net/util.h4
-rw-r--r--tests/net.lua3
9 files changed, 111 insertions, 77 deletions
diff --git a/docs/net.md b/docs/net.md
index e548cb1..9b85c18 100644
--- a/docs/net.md
+++ b/docs/net.md
@@ -48,13 +48,13 @@ the actual name of the function will change based on what request method you wan
```lua
server:all("*", function(res, req)
if(req['Version'] ~= "HTTP/1.1") then
- res:close()
+ res:stop()
end
end)
...
server:GET("/", function(res, req)
- --version will always be 1.1, as per the middleware
+ --version will always be 1.1, because the request passes through the function sequentially
...
end)
...
@@ -69,7 +69,7 @@ end)
'takes a string
sends the string to the client, constructs a header on first call (whether or not res.header._sent is null)
-(the constructed header can not be changed later on in the request), and sends the string without closing the client
+(the constructed header can not be changed later on in the request*), and sends the string without closing the client
```lua
...
@@ -78,6 +78,8 @@ res:write("<h1>good bye world</h1>")
...
```
+*well it can but it wont do anything
+
#### res:send
'takes a string
@@ -94,6 +96,12 @@ res:send("<h1>hello world</h1>")
closes connection, sets res.client_fd to -1, any calls that use this value will fail
+this will still run any selected functions!
+
+#### res:stop
+
+prevents all further selected functions from running
+
#### res.header
table containing all head information, anything added to it will be used, certain keys will affect other values or have other side effects on res:send, listed below
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);
diff --git a/tests/net.lua b/tests/net.lua
index 90a18c3..d1b5369 100644
--- a/tests/net.lua
+++ b/tests/net.lua
@@ -18,10 +18,11 @@ net.listen(
io.pprint("online")
_G.server = server
- server:all("/{name}", function(res, req)
+ server:POST("/{name}", function(res, req)
--print("name is "..req.name)
print("name")
io.pprint(req.paramaters)
+ res:stop()
end)
server:all("/{name}/nya/{user}", function(res, req)