aboutsummaryrefslogtreecommitdiff
path: root/net.c
diff options
context:
space:
mode:
authorame <[email protected]>2024-01-18 14:08:57 -0600
committerame <[email protected]>2024-01-18 14:08:57 -0600
commit06868eee51e5e49581e969164ba6fef4e0e54055 (patch)
tree74e039398d6f28e83d38dd24876b8c8e59e1e952 /net.c
parent8a28c83cb14a891ec46d0465225e089dc62213db (diff)
almost working http server!
Diffstat (limited to 'net.c')
-rw-r--r--net.c139
1 files changed, 0 insertions, 139 deletions
diff --git a/net.c b/net.c
deleted file mode 100644
index 824ebad..0000000
--- a/net.c
+++ /dev/null
@@ -1,139 +0,0 @@
-#include <sys/socket.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <arpa/inet.h>
-#include <pthread.h>
-#include <string.h>
-
-#include "src/i_str.h"
-
-#define max_con 10
-#define BUFFER_SIZE 2048
-
-size_t recv_full_buffer(int client_fd, char** _buffer, int* header_eof){
- char* buffer = malloc(BUFFER_SIZE * sizeof * buffer);
- char* header;
- size_t len = 0;
- *header_eof = -1;
- int n;
-
- for(;;){
- n = recv(client_fd, buffer + len, BUFFER_SIZE, 0);
- if(*header_eof == -1 && (header = strstr(buffer, "\r\n\r\n")) != NULL){
- *header_eof = header - buffer;
- }
- if(n != BUFFER_SIZE) break;
- len += BUFFER_SIZE;
- buffer = realloc(buffer, len + BUFFER_SIZE);
- }
- buffer[n] = 0;
-
- *_buffer = buffer;
- return len + BUFFER_SIZE;
-}
-
-int parse_header(char* buffer, int header_eof, str*** _table, int* _len){
- if(header_eof == -1) return -1;
- char add[] = {0,0};
- int lines = 3;
- for(int i = 0; i != header_eof; i++) lines += buffer[i] == '\n';
- str** table = malloc(sizeof ** table * lines * 2);
- table[0] = str_init("Request");// table[1] = str_init("Post|Get");
- table[2] = str_init("Path");// table[3] = str_init("/");
- table[4] = str_init("Version");// table[5] = str_init("HTTP/1.1");
- str* current = str_init("");
- int ins = 1;
- for(int i = 0; i != header_eof; i++){
- add[0] = buffer[i];
- if(buffer[i] == '\n') break;
- if(buffer[i] == ' '){
- table[ins] = str_init(current->c);
- ins += 2;
- str_clear(current);
- } else str_push(current, add);
- }
- table[ins] = str_init(current->c);
-
- int tlen = 6;
-
- int key = 1;
- for(int i = (strstr(buffer,"\n") - buffer) + 1; i != header_eof; i++){
- if(key && buffer[i]==':' || !key && buffer[i]=='\n') {
- table[tlen] = str_init(current->c);
- str_clear(current);
- tlen++;
- i+=key;
- key = !key;
- continue;
- }
- add[0] = buffer[i];
- str_push(current, add);
- }
- table[tlen] = str_init(current->c);
- tlen++;
- str_free(current);
- *_len = tlen / 2;
- *_table = table;
- return 0;
-}
-
-void* handle_client(void *arg){
- int client_fd = *((int*)arg);
- char* buffer;
- int header_eof;
- size_t bytes_received = recv_full_buffer(client_fd, &buffer, &header_eof);
- //printf("%lu %i %s\n",bytes_received, header_eof, buffer);
- if(bytes_received > 0){
- str** table;
- int len = 0;
- if(parse_header(buffer, header_eof, &table, &len) != -1){
-
- printf("%i\n",len);
- for(int i = 0; i != len * 2; i+=2){
- printf("%s :: %s\n",table[i]->c, table[i+1]->c);
- }
- }
- }
- free(buffer);
- return NULL;
-}
-
-int main(){
- int server_fd;
- struct sockaddr_in server_addr;
-
- if((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
- printf("error\n");
- abort();
- }
-
- server_addr.sin_family = AF_INET;
- server_addr.sin_addr.s_addr = INADDR_ANY;
- server_addr.sin_port = htons(3042);
-
- if(bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0){
- printf("failed to bind\n");
- abort();
- }
-
- if(listen(server_fd, max_con) < 0){
- printf("failed to listen\n");
- abort();
- }
-
- for(;;){
- struct sockaddr_in client_addr;
- socklen_t client_addr_len = sizeof(client_addr);
- int* client_fd = malloc(sizeof(int));
-
- if((*client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &client_addr_len)) < 0){
- printf("failed to accept\n");
- abort();
- }
-
- pthread_t thread_id;
- pthread_create(&thread_id, NULL, handle_client, (void*)client_fd);
- pthread_detach(thread_id);
- }
-
-}