diff options
| author | frosty <gabriel@bwaaa.monster> | 2026-05-03 11:39:20 -0400 |
|---|---|---|
| committer | frosty <gabriel@bwaaa.monster> | 2026-05-03 11:39:20 -0400 |
| commit | 43c9d257848c4bffdfd159bf94d5a5bcf5b6c63f (patch) | |
| tree | ed19a8966512bc142165f824b721a0fc14483cd2 /src/server.c | |
| parent | 75f4147fc8340eb22e22eabab869126da7697d44 (diff) | |
| download | beaker-43c9d257848c4bffdfd159bf94d5a5bcf5b6c63f.tar.gz | |
feat: added beaker_get_header, beaker_get_remote_addrindev
Diffstat (limited to 'src/server.c')
| -rw-r--r-- | src/server.c | 57 |
1 files changed, 55 insertions, 2 deletions
diff --git a/src/server.c b/src/server.c index 9c89f11..828bf26 100644 --- a/src/server.c +++ b/src/server.c @@ -212,6 +212,8 @@ void handle_client_connection(int new_socket) { strncpy(current_request_buffer, buffer, BUFFER_SIZE - 1); current_request_buffer[BUFFER_SIZE - 1] = '\0'; + memset(¤t_request_info, 0, sizeof(RequestInfo)); + char request_line[MAX_PATH_LEN + 64]; char *first_line_end = strstr(buffer, "\r\n"); @@ -243,9 +245,16 @@ void handle_client_connection(int new_socket) { close(new_socket); return; } - printf("Accessing: %s\n", requested_path); +printf("Accessing: %s\n", requested_path); + + struct sockaddr_in client_addr; + socklen_t client_len = sizeof(client_addr); + if (getpeername(new_socket, (struct sockaddr *)&client_addr, &client_len) == 0) { + strncpy(current_request_info.remote_addr, inet_ntoa(client_addr.sin_addr), + sizeof(current_request_info.remote_addr) - 1); + } - bool handled = false; + bool handled = false; if (strncmp(requested_path, "/static/", strlen("/static/")) == 0) { @@ -378,3 +387,47 @@ void beaker_run_with_threads(const char *ip, int port, int num_workers) { work_queue_destroy(&g_work_queue); close(server_fd); } + +const char *beaker_get_remote_addr(void) { + return current_request_info.remote_addr; +} + +static __thread char g_header_value[MAX_VALUE_LEN]; + +const char *beaker_get_header(const char *name) { + if (name == NULL) return ""; + + size_t name_len = strlen(name); + if (name_len == 0) return ""; + + if (strstr(name, "\r\n") != NULL) return ""; + + char *buffer = current_request_buffer; + char *search_end = strstr(buffer, "\r\n\r\n"); + if (search_end == NULL) search_end = buffer + strlen(buffer); + while (buffer < search_end) { + if (strncasecmp(buffer, name, name_len) == 0 && buffer[name_len] == ':') { + char *value_start = buffer + name_len + 1; + while (*value_start == ' ') value_start++; + + char *value_end = strstr(value_start, "\r\n"); + if (value_end == NULL) value_end = search_end; + size_t value_len = value_end - value_start; + if (value_len > sizeof(g_header_value)) { + value_len = sizeof(g_header_value) - 1; + } + strncpy(g_header_value, value_start, value_len); + g_header_value[value_len] = '\0'; + return g_header_value; + } + buffer++; + } + + return ""; +} + +void beaker_set_request_buffer(const char *buffer) { + if (buffer == NULL) return; + strncpy(current_request_buffer, buffer, BUFFER_SIZE - 1); + current_request_buffer[BUFFER_SIZE - 1] = '\0'; +} |
