aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/io.c25
-rw-r--r--src/lua.h2
-rw-r--r--src/net.c89
-rw-r--r--test/a1
-rw-r--r--tests/net.lua4
5 files changed, 78 insertions, 43 deletions
diff --git a/src/io.c b/src/io.c
index 674c081..cc33a71 100644
--- a/src/io.c
+++ b/src/io.c
@@ -23,22 +23,15 @@ int l_readfile(lua_State* L){
p_fatal("missing permissions");
}
- fp = fopen(a, "r");
- char* out = malloc(chunk);
-
- for(;;){
- char ch = fgetc(fp);
- if(ch==EOF) break;
-
- if(count >= chunk){
- chunk += chunk_iter;
- out = realloc(out, chunk);
- }
- out[count] = ch;
- count++;
- }
- out[count] = '\0';
- lua_pushstring(L, out);
+ fp = fopen(a, "rb");
+ fseek(fp, 0L, SEEK_END);
+ size_t sz = ftell(fp);
+ fseek(fp, 0L, SEEK_SET);
+ char* out = calloc(sz + 1, sizeof * out);
+
+ fread(out, sizeof * out, sz, fp);
+
+ lua_pushlstring(L, out, sz);
fclose(fp);
free(out);
diff --git a/src/lua.h b/src/lua.h
index 30eefb4..031bfc6 100644
--- a/src/lua.h
+++ b/src/lua.h
@@ -18,6 +18,8 @@ void i_dcopy(lua_State* src, lua_State* dest, void*);
//some macros to make batch adding easier (may switch to arrays for this later)
#define luaI_tseti(L, Tidx, K, V)\
_tset_b(L, Tidx, K, V, lua_pushinteger)
+#define luaI_tsetb(L, Tidx, K, V)\
+ _tset_b(L, Tidx, K, V, lua_pushboolean)
#define luaI_tsets(L, Tidx, K, V)\
_tset_b(L, Tidx, K, V, lua_pushstring)
#define luaI_tsetv(L, Tidx, K, V)\
diff --git a/src/net.c b/src/net.c
index 144c6e7..f1cf70f 100644
--- a/src/net.c
+++ b/src/net.c
@@ -45,7 +45,7 @@ struct sarray_t {
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lua_mutex = PTHREAD_MUTEX_INITIALIZER;
-size_t recv_full_buffer(int client_fd, char** _buffer, int* header_eof){
+int64_t recv_full_buffer(int client_fd, char** _buffer, int* header_eof){
char* buffer = malloc(BUFFER_SIZE * sizeof * buffer);
memset(buffer, 0, BUFFER_SIZE);
char* header;
@@ -55,13 +55,23 @@ size_t recv_full_buffer(int client_fd, char** _buffer, int* header_eof){
int content_len = -1;
//printf("before\n");
//fcntl(client_fd, F_SETFL, fcntl(client_fd, F_GETFL) | O_NONBLOCK)
- printf("\n");
for(;;){
n = recv(client_fd, buffer + len, BUFFER_SIZE, 0);
+ if(n < 0){
+ *_buffer = buffer;
+ if(*header_eof == -1) return -2; //dont even try w/ request, no header to read
+ return -1; //well the header is fine atleast
+
+ };
if(*header_eof == -1 && (header = strstr(buffer, "\r\n\r\n")) != NULL){
//printf("head\n");
*header_eof = header - buffer;
char* cont_len_raw = strstr(buffer, "Content-Length: ");
+ if(cont_len_raw == NULL) {
+ len += n;
+ *_buffer = buffer;
+ return len + BUFFER_SIZE;
+ }
str* cont_len_str = str_init("");
if(cont_len_raw == NULL) abort();
//i is length of 'Content-Length: '
@@ -73,7 +83,7 @@ size_t recv_full_buffer(int client_fd, char** _buffer, int* header_eof){
}
//check if the recv read the whole buffer length, sometimes it wont so i peek to see if there is more
//if(n != BUFFER_SIZE && recv(client_fd, NULL, 1, MSG_PEEK) != 1) break;
- printf("%i %i\n", n, content_len);
+ //printf("%i %i\n", n, content_len);
len += n;
//if(n != 0){
//printf("buffer %i\n", n);
@@ -86,7 +96,7 @@ size_t recv_full_buffer(int client_fd, char** _buffer, int* header_eof){
//}
if(content_len != -1 && len - *header_eof - 4 >= content_len) break;
}
- printf("%i\n",len - *header_eof - 4);
+ //printf("%i\n",len - *header_eof - 4);
*_buffer = buffer;
return len + BUFFER_SIZE;
}
@@ -152,7 +162,7 @@ int stable_key(str** table, char* target, int flen){
return -1;
}
-void http_build(str** _dest, int code, char* code_det, char* header_vs, char* content){
+void http_build(str** _dest, int code, char* code_det, char* header_vs, char* content, size_t len){
/**dest = str_init(
"HTTP/1.1 404 Not Found\r\n"
"Content-Type: text/plain\r\n"
@@ -168,7 +178,10 @@ void http_build(str** _dest, int code, char* code_det, char* header_vs, char* co
, code, code_det, header_vs);
*_dest = str_init(dest);
- str_push(*_dest, content);
+ //str_push(*_dest, content);
+ for(size_t i = 0; i != len; i++){
+ str_pushl(*_dest, content + i, 1);
+ }
free(dest);
}
@@ -247,7 +260,7 @@ void http_code(int code, char* code_det){
}
}
-void i_write_header(lua_State* L, int header_top, str** _resp, char* content){
+void i_write_header(lua_State* L, int header_top, str** _resp, char* content, size_t len){
str* resp;
lua_pushvalue(L, header_top);
@@ -272,12 +285,25 @@ void i_write_header(lua_State* L, int header_top, str** _resp, char* content){
char code_det[50] = {0};
http_code(code, code_det);
- http_build(&resp, code, code_det, header_vs->c, content);
+ http_build(&resp, code, code_det, header_vs->c, content, len);
str_free(header_vs);
*_resp = resp;
}
+
+void client_fd_errors(int client_fd){
+ if(client_fd>=0) return;
+
+ switch(client_fd){
+ case -1:
+ p_fatal("client fd already closed\n");
+ case -2:
+ p_fatal("request was partial\n");
+ default:
+ p_fatal("unknown negative client_fd value");
+ }
+}
int l_write(lua_State* L){
int res_idx = 1;
@@ -291,10 +317,11 @@ int l_write(lua_State* L){
lua_pushstring(L, "client_fd");
lua_gettable(L, res_idx);
int client_fd = luaL_checkinteger(L, -1);
- if(client_fd <= 0)
- p_fatal("client fd already closed\n");
-
- char* content = (char*)luaL_checkstring(L, 2);
+
+ client_fd_errors(client_fd);
+
+ size_t len;
+ char* content = (char*)luaL_checklstring(L, 2, &len);
lua_pushvalue(L, res_idx);
lua_pushstring(L, "header");
@@ -305,8 +332,8 @@ int l_write(lua_State* L){
lua_gettable(L, -2);
str* resp;
if(lua_isnil(L, -1)){
- if(head) i_write_header(L, header_top, &resp, "");
- else i_write_header(L, header_top, &resp, content);
+ if(head) i_write_header(L, header_top, &resp, "", 0);
+ else i_write_header(L, header_top, &resp, content, len);
lua_pushvalue(L, header_top);
lua_pushstring(L, "_sent");
@@ -330,10 +357,11 @@ int l_send(lua_State* L){
lua_pushstring(L, "client_fd");
lua_gettable(L, res_idx);
int client_fd = luaL_checkinteger(L, -1);
- if(client_fd <= 0)
- p_fatal("client fd already closed\n");
+
+ client_fd_errors(client_fd);
- char* content = (char*)luaL_checkstring(L, 2);
+ size_t len;
+ char* content = (char*)luaL_checklstring(L, 2, &len);
lua_pushvalue(L, res_idx);
lua_pushstring(L, "header");
@@ -346,9 +374,9 @@ int l_send(lua_State* L){
lua_gettable(L, -2);
if(strcmp(luaL_checkstring(L, -1), "HEAD") == 0){
- i_write_header(L, header, &resp, "");
+ i_write_header(L, header, &resp, "", 0);
} else
- i_write_header(L, header, &resp, content);
+ i_write_header(L, header, &resp, content, len);
send(client_fd, resp->c, resp->len, 0);
@@ -368,8 +396,8 @@ int l_close(lua_State* L){
lua_pushstring(L, "client_fd");
lua_gettable(L, res_idx);
int client_fd = luaL_checkinteger(L, -1);
- if(client_fd <= 0)
- p_fatal("client fd already closed\n");
+ client_fd_errors(client_fd);
+
lua_pushstring(L, "client_fd");
lua_pushinteger(L, -1);
lua_settable(L, res_idx);
@@ -385,8 +413,7 @@ int l_serve(lua_State* L){
lua_pushstring(L, "client_fd");
lua_gettable(L, res_idx);
int client_fd = luaL_checkinteger(L, -1);
- if(client_fd <= 0)
- p_fatal("client fd already closed\n");
+ client_fd_errors(client_fd);
char* path = (char*)luaL_checkstring(L, 2);
@@ -447,9 +474,9 @@ void* handle_client(void *_arg){
pthread_mutex_unlock(&mutex);
//read full request
- size_t bytes_received = recv_full_buffer(client_fd, &buffer, &header_eof);
- //if the buffer, yknow exists
- if(bytes_received > 0){
+ int64_t bytes_received = recv_full_buffer(client_fd, &buffer, &header_eof);
+ //ignore if header is just fucked
+ if(bytes_received >= -1){
str** table;
int len = 0;
//checks for a valid header
@@ -471,8 +498,9 @@ void* handle_client(void *_arg){
str_free(aa);
if(v == NULL){
+ //this should not be here
str* resp;
- http_build(&resp, 404, "Not Found","text/html", "<h1>404</h1>");
+ http_build(&resp, 404, "Not Found","text/html", "<h1>404</h1>", 12);
send(client_fd, resp->c, resp->len, 0);
str_free(resp);
} else {
@@ -487,6 +515,13 @@ void* handle_client(void *_arg){
}
luaI_tsets(L, req_idx, "ip", inet_ntoa(args->cli.sin_addr));
+
+ if(bytes_received == -1){
+ client_fd = -2;
+ }
+
+ luaI_tsetb(L, req_idx, "partial", bytes_received == -1);
+ luaI_tseti(L, req_idx, "_bytes", bytes_received);
//printf("%s\n",table[T]->c);
//file_parse(L, buffer + header_eof, table[T]);
diff --git a/test/a b/test/a
new file mode 100644
index 0000000..d4a1954
--- /dev/null
+++ b/test/a
@@ -0,0 +1 @@
+MZ� \ No newline at end of file
diff --git a/tests/net.lua b/tests/net.lua
index b115f0e..2e809af 100644
--- a/tests/net.lua
+++ b/tests/net.lua
@@ -38,6 +38,10 @@ llib.net.listen(
--_G.llib.io.pprint(_G._Go)
--_G.llib.io.pprint(_G.wo.crypto.md5("55"))
--_G.llib.io.pprint(req)
+ --print(req.partial)
+ --_G.llib.io.pprint(_G.llib.io.readfile(".gitignore"))
+ --print(req._bytes)
+ res:send(_G.llib.io.readfile("llib.dll"))
end)
server:GET("/aa", function(res, req)