From 4a306746f9c8de6c5f2ad8100da315df7256a488 Mon Sep 17 00:00:00 2001 From: lucielle Date: Fri, 17 Apr 2026 20:32:46 -0500 Subject: [PATCH] add request url parsing / handling --- server/Makefile | 6 +++--- server/array.c | 30 ++++++++++++++++++++++++++++++ server/include/array.h | 15 +++++++++++++++ server/server.c | 17 +++++++++++++---- 4 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 server/array.c create mode 100644 server/include/array.h diff --git a/server/Makefile b/server/Makefile index 28eb4fa..420c680 100644 --- a/server/Makefile +++ b/server/Makefile @@ -1,14 +1,14 @@ CC = gcc INCLUDE := include -CFLAGS = -Wall -I$(INCLUDE) +CFLAGS = -Wall -I$(INCLUDE) -g BUILD_DIR := build all: server -server: $(BUILD_DIR)/server.o $(BUILD_DIR)/mongoose.o - $(CC) $(CFLAGS) -o $(BUILD_DIR)/server $(BUILD_DIR)/server.o $(BUILD_DIR)/mongoose.o +server: $(BUILD_DIR)/server.o $(BUILD_DIR)/mongoose.o $(BUILD_DIR)/array.o + $(CC) $(CFLAGS) -o $(BUILD_DIR)/server $(BUILD_DIR)/server.o $(BUILD_DIR)/mongoose.o $(BUILD_DIR)/array.o $(BUILD_DIR)/%.o: %.c | $(BUILD_DIR) $(CC) $(CFLAGS) -c $< -o $@ diff --git a/server/array.c b/server/array.c new file mode 100644 index 0000000..93293e3 --- /dev/null +++ b/server/array.c @@ -0,0 +1,30 @@ +#include "include/array.h" +#include "include/mongoose.h" + +void array_mg_str_append(array_mg_str* arr, struct mg_str item) { + if (arr->count >= arr->capacity) { + if (arr->capacity == 0) arr->capacity = 8; + else arr->capacity *= 2; + + arr->items = realloc(arr->items, arr->capacity * sizeof(*arr->items)); + } + arr->items[arr->count++] = item; +} + +void split_mg_str(struct mg_str* string, const char token, array_mg_str* return_array) { + int start_index = 0; + + for (int i = 0; i < string->len; i++) { + if (string->buf[i] == token || string->len == i + 1) { + if (i != start_index) { + int slice_len = i - start_index; + if (string->len == i + 1 && string->buf[i] != token) slice_len++; + + struct mg_str tmp_mg_str = mg_str_n(string->buf + start_index, slice_len); + + array_mg_str_append(return_array, tmp_mg_str); + } + start_index = i + 1; + } + } +} \ No newline at end of file diff --git a/server/include/array.h b/server/include/array.h new file mode 100644 index 0000000..dfb325b --- /dev/null +++ b/server/include/array.h @@ -0,0 +1,15 @@ +#ifndef HMAIL_ARRAY_H +#define HMAIL_ARRAY_H + +#include "mongoose.h" + +typedef struct { + struct mg_str* items; + size_t count; + size_t capacity; +} array_mg_str; + +void array_mg_str_append(array_mg_str* arr, struct mg_str item); +void split_mg_str(struct mg_str* string, const char token, array_mg_str* return_array); + +#endif \ No newline at end of file diff --git a/server/server.c b/server/server.c index 3b752cf..af3ca05 100644 --- a/server/server.c +++ b/server/server.c @@ -1,12 +1,21 @@ #include "include/mongoose.h" +#include "include/array.h" + +static void api_handler(struct mg_connection *c, int ev, struct mg_http_message *hm) { + mg_http_reply(c, 200, "", "%s : %.*s", "api route response", hm->uri.len, hm->uri.buf); +} static void ev_handler(struct mg_connection *c, int ev, void *ev_data) { if (ev == MG_EV_HTTP_MSG) { struct mg_http_message *hm = (struct mg_http_message *)ev_data; - printf("URL: %.*s\n", (int)hm->uri.len, hm->uri.buf); - if (mg_match(hm->uri, mg_str("/api/test"), NULL)) { - mg_http_reply(c, 200, "", "%s", "test"); - return; + + array_mg_str path_array = {0}; + split_mg_str(&hm->uri, '/', &path_array); + if (path_array.count > 0) { + if (mg_match(path_array.items[0], mg_str("api"), NULL)) { + api_handler(c, ev, hm); + return; + } } mg_http_reply(c, 200, "", "%s", "Hello world"); }