aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/beaker_globals.c2
-rw-r--r--src/beaker_globals.h2
-rw-r--r--src/server.c57
3 files changed, 59 insertions, 2 deletions
diff --git a/src/beaker_globals.c b/src/beaker_globals.c
index 1f81a5e..3488338 100644
--- a/src/beaker_globals.c
+++ b/src/beaker_globals.c
@@ -12,6 +12,8 @@ __thread int cookies_to_set_count = 0;
__thread char current_request_buffer[BUFFER_SIZE];
+__thread RequestInfo current_request_info = {0};
+
Locale *locales = NULL;
int locale_count = 0;
diff --git a/src/beaker_globals.h b/src/beaker_globals.h
index 7418808..34b29d9 100644
--- a/src/beaker_globals.h
+++ b/src/beaker_globals.h
@@ -16,6 +16,8 @@ extern __thread int cookies_to_set_count;
extern __thread char current_request_buffer[BUFFER_SIZE];
+extern __thread RequestInfo current_request_info;
+
extern Locale *locales;
extern int locale_count;
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(&current_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';
+}