From 916d3497b9316ec6b64646d456d3c03141b1fe21 Mon Sep 17 00:00:00 2001 From: frosty Date: Sat, 15 Aug 2026 18:26:10 -0400 Subject: fix: isolate cookie state between requests --- src/beaker_globals.h | 2 ++ src/http.c | 11 +++++++---- src/server.c | 2 ++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/beaker_globals.h b/src/beaker_globals.h index 96d4dcf..e01704c 100644 --- a/src/beaker_globals.h +++ b/src/beaker_globals.h @@ -49,6 +49,8 @@ void beaker_log_request(const char *remote_addr, const char *method, const char *path, int status, size_t response_size, double duration_ms); +void beaker_clear_response_cookies(void); + BeakerRequestReadResult beaker_read_request_headers(int socket, char *buffer, size_t buffer_size, size_t *bytes_read); diff --git a/src/http.c b/src/http.c index 1312d4d..bfd6f9b 100644 --- a/src/http.c +++ b/src/http.c @@ -58,6 +58,11 @@ static void build_cookie_headers(char *cookie_headers_buffer, } } +void beaker_clear_response_cookies(void) { + memset(cookies_to_set, 0, sizeof(cookies_to_set)); + cookies_to_set_count = 0; +} + void send_status(const char *status_line) { if (current_client_socket == -1) { beaker_log("ERROR", @@ -97,6 +102,7 @@ void send_response(const char *html) { char cookie_headers[BUFFER_SIZE]; build_cookie_headers(cookie_headers, sizeof(cookie_headers)); + beaker_clear_response_cookies(); snprintf(http_response_header, sizeof(http_response_header), "HTTP/1.1 200 OK\r\n" @@ -119,8 +125,6 @@ void send_response(const char *html) { "send_response: Failed to send HTML body.\n"); return; } - - cookies_to_set_count = 0; } void send_redirect(const char *location) { @@ -137,6 +141,7 @@ void send_redirect(const char *location) { char cookie_headers[BUFFER_SIZE]; build_cookie_headers(cookie_headers, sizeof(cookie_headers)); + beaker_clear_response_cookies(); snprintf(http_response_header, sizeof(http_response_header), "HTTP/1.1 302 Found\r\n" @@ -152,8 +157,6 @@ void send_redirect(const char *location) { "send_redirect: Failed to send redirect header.\n"); return; } - - cookies_to_set_count = 0; } void set_cookie(const char *name, const char *value, const char *expires, diff --git a/src/server.c b/src/server.c index 5ac20a0..7d5eb8f 100644 --- a/src/server.c +++ b/src/server.c @@ -200,6 +200,7 @@ static void finish_client_connection(int socket, char *requested_path, beaker_log_request(current_request_info.remote_addr, method, path, current_response_status, current_response_size, duration_ms); + beaker_clear_response_cookies(); free(requested_path); close(socket); current_client_socket = -1; @@ -214,6 +215,7 @@ void handle_client_connection(int new_socket) { struct timespec started_at; clock_gettime(CLOCK_MONOTONIC, &started_at); + beaker_clear_response_cookies(); current_response_status = 0; current_response_size = 0; beaker_reset_write_deadline(); -- cgit v1.3