From 576f65d846fb2f3f4f438fc5403de90510f458a2 Mon Sep 17 00:00:00 2001 From: Sean McBride Date: Wed, 27 Apr 2022 09:44:34 -0400 Subject: [PATCH] refactor: http_router and session --- .vscode/settings.json | 1 - runtime/include/http_router.h | 54 ++++++++++++++---------------- runtime/include/http_session.h | 2 +- runtime/include/module.h | 3 -- runtime/src/http_parser_settings.c | 19 ++--------- 5 files changed, 29 insertions(+), 50 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 49b45ad..33c8c64 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -113,7 +113,6 @@ "vec.h": "c", "module_database.h": "c", "perf_window_t.h": "c", - "typeinfo": "c", "module_config.h": "c", "tenant.h": "c", "route_config.h": "c", diff --git a/runtime/include/http_router.h b/runtime/include/http_router.h index f54f9cd..72e0438 100644 --- a/runtime/include/http_router.h +++ b/runtime/include/http_router.h @@ -5,11 +5,11 @@ #include "admissions_info.h" #include "http.h" -#include "route_config.h" #include "module_database.h" +#include "route_config.h" #include "tcp_server.h" -#define HTTP_ROUTER_CAPACITY 32 +#define HTTP_ROUTER_ROUTES_CAPACITY 32 /* Assumption: entrypoint is always _start. This should be enhanced later */ struct route { @@ -23,16 +23,15 @@ struct route { struct admissions_info admissions_info; }; - struct http_router { - struct route routes[HTTP_ROUTER_CAPACITY]; - size_t route_length; + struct route routes[HTTP_ROUTER_ROUTES_CAPACITY]; + size_t routes_length; }; static inline void http_router_init(struct http_router *router) { - router->route_length = 0; + router->routes_length = 0; } static inline int @@ -43,38 +42,37 @@ http_router_add_route(struct http_router *router, struct route_config *config, s assert(module != NULL); assert(config->route != NULL); assert(config->http_resp_content_type != NULL); + assert(router->routes_length <= HTTP_ROUTER_ROUTES_CAPACITY); - if (router->route_length < HTTP_ROUTER_CAPACITY) { - router->routes[router->route_length] = (struct route){ - .route = config->route, - .module = module, - .relative_deadline_us = config->relative_deadline_us, - .relative_deadline = (uint64_t)config->relative_deadline_us * runtime_processor_speed_MHz, - .response_size = config->http_resp_size, - .response_content_type = config->http_resp_content_type - }; + if (unlikely(router->routes_length == HTTP_ROUTER_ROUTES_CAPACITY)) { return -1; } - /* Move strings from config */ - config->route = NULL; - config->http_resp_content_type = NULL; + router->routes[router->routes_length] = (struct route){ + .route = config->route, + .module = module, + .relative_deadline_us = config->relative_deadline_us, + .relative_deadline = (uint64_t)config->relative_deadline_us * runtime_processor_speed_MHz, + .response_size = config->http_resp_size, + .response_content_type = config->http_resp_content_type + }; - /* Admissions Control */ - uint64_t expected_execution = (uint64_t)config->expected_execution_us * runtime_processor_speed_MHz; - admissions_info_initialize(&router->routes[router->route_length].admissions_info, - config->admissions_percentile, expected_execution, - router->routes[router->route_length].relative_deadline); + /* Move strings from config */ + config->route = NULL; + config->http_resp_content_type = NULL; - router->route_length++; - return 0; - } + /* Admissions Control */ + uint64_t expected_execution = (uint64_t)config->expected_execution_us * runtime_processor_speed_MHz; + admissions_info_initialize(&router->routes[router->routes_length].admissions_info, + config->admissions_percentile, expected_execution, + router->routes[router->routes_length].relative_deadline); - return -1; + router->routes_length++; + return 0; } static inline struct route * http_router_match_route(struct http_router *router, char *route) { - for (int i = 0; i < router->route_length; i++) { + for (int i = 0; i < router->routes_length; i++) { if (strncmp(route, router->routes[i].route, strlen(router->routes[i].route)) == 0) { return &router->routes[i]; } diff --git a/runtime/include/http_session.h b/runtime/include/http_session.h index e116799..1f20743 100644 --- a/runtime/include/http_session.h +++ b/runtime/include/http_session.h @@ -25,7 +25,7 @@ struct http_session { /* HTTP State */ struct sockaddr client_address; /* client requesting connection! */ int socket; - http_parser http_parser; + struct http_parser http_parser; struct http_request http_request; struct vec_u8 request; struct vec_u8 response; diff --git a/runtime/include/module.h b/runtime/include/module.h index 53c4c3f..86952eb 100644 --- a/runtime/include/module.h +++ b/runtime/include/module.h @@ -18,9 +18,6 @@ #include "wasm_memory.h" #include "wasm_table.h" -#define MODULE_MAX_PATH_LENGTH 256 -#define MODULE_MAX_ROUTE_LENGTH 256 - #define MODULE_DATABASE_CAPACITY 128 extern thread_local int worker_thread_idx; diff --git a/runtime/src/http_parser_settings.c b/runtime/src/http_parser_settings.c index 2836873..ebe91bd 100644 --- a/runtime/src/http_parser_settings.c +++ b/runtime/src/http_parser_settings.c @@ -191,23 +191,8 @@ http_parser_settings_on_header_end(http_parser *parser) debuglog("parser: %p\n", parser); #endif - http_request->header_end = true; - - /* Search header for content length */ - for (int i = 0; i < http_request->header_count; i++) { - if (strncasecmp(http_request->headers[i].key, "content-length", strlen("content-length")) == 0) { - intmax_t temp = strtoimax(http_request->headers[i].value, NULL, 10); - - if (temp < 0 || temp > INT_MAX) { - /* TODO: Improve error handling to not crash runtime */ - fprintf(stderr, "Unable to parse int for key %.*s\n", - http_request->headers[i].key_length, http_request->headers[i].key); - assert(0); - } else { - http_request->body_length = (int)temp; - } - } - } + http_request->header_end = true; + http_request->body_length = parser->content_length; return 0; }