From 21443fb5d35457559582ab611f61ba7025e1da82 Mon Sep 17 00:00:00 2001 From: anulax1225 Date: Thu, 21 Mar 2024 13:11:05 +0100 Subject: [PATCH] Modified http server to use Trie structure --- bakanet/src/bakanet/http/http_server.cpp | 23 +++++++++++++++++++++-- bakanet/src/bakanet/http/http_server.h | 8 +++++--- bakanet/src/bakanet/http/radix_tree.cpp | 0 bakanet/src/bakanet/http/radix_tree.h | 0 4 files changed, 26 insertions(+), 5 deletions(-) delete mode 100644 bakanet/src/bakanet/http/radix_tree.cpp delete mode 100644 bakanet/src/bakanet/http/radix_tree.h diff --git a/bakanet/src/bakanet/http/http_server.cpp b/bakanet/src/bakanet/http/http_server.cpp index ec52128..fa80fcc 100755 --- a/bakanet/src/bakanet/http/http_server.cpp +++ b/bakanet/src/bakanet/http/http_server.cpp @@ -5,6 +5,7 @@ namespace Bk::Net { Bk::Log::init("BAKANET"); BK_CORE_INFO("NEW SERVER"); socket = Socket::create(ip, port, IpProtocol::TCP); + radix = RadixTree(); } void HttpServer::start() @@ -19,12 +20,25 @@ namespace Bk::Net { }, std::move(conn))); } } + + void HttpServer::get(std::string url, RequestHandler req_handler) + { + RadixTree* tree; + Tools::string_trim(url, " /"); + auto splits = Tools::string_split(url, "/"); + if (tree = radix.get_node(splits->data(), splits->size())) tree->value["GET"] = req_handler; + else radix.add_nodes(splits->data(), splits->size(), HttpMethodArray({{ "GET", req_handler }})); + } HttpRequest HttpServer::recv_request(Socket& conn) { Packet req; std::vector data; - while((data = conn.obtain(1024)).size() >= 1024) req.append_data(data); + do + { + data = conn.obtain(1024); + req.append_data(data); + } while(data.size() >= 1024); int req_size = req.size(); if (req_size) return HttpRequest(std::string(req.pull(req_size).release(), req_size)); return HttpRequest("", "", ""); @@ -40,7 +54,12 @@ namespace Bk::Net { void HttpServer::route_request(Socket& conn, HttpRequest req) { - if(req_mapper[req.url]) send_reponse(conn, req_mapper[req.url](req)); + std::string url = std::string(req.url); + Tools::string_trim(url, " /"); + Tools::string_to_upper(req.method); + auto urls = Tools::string_split(url, "/"); + auto handlers = radix.get_node(urls->data(), urls->size()); + if (handlers && (handlers->value.find(req.method) != handlers->value.end())) { send_reponse(conn, handlers->value[req.method](req)); } else send_reponse(conn, HttpReponse(HTTP_RES_404, "HTTP/1.1")); } } \ No newline at end of file diff --git a/bakanet/src/bakanet/http/http_server.h b/bakanet/src/bakanet/http/http_server.h index d2e041a..6fa20d9 100755 --- a/bakanet/src/bakanet/http/http_server.h +++ b/bakanet/src/bakanet/http/http_server.h @@ -10,16 +10,18 @@ namespace Bk::Net { class HttpServer { - using ThreadPool = std::vector; using RequestHandler = std::function; + using HttpMethodArray = std::unordered_map; + using RadixTree = DataType::Trie; + using ThreadPool = std::vector; public: HttpServer(IpAddress ip, int port); ~HttpServer() = default; void start(); - void get(std::string url, RequestHandler req_handler) { req_mapper.insert({ url, req_handler }); } + void get(std::string url, RequestHandler req_handler); + RadixTree radix; private: std::unique_ptr socket; - std::unordered_map req_mapper; ThreadPool threads; HttpRequest recv_request(Socket& conn); diff --git a/bakanet/src/bakanet/http/radix_tree.cpp b/bakanet/src/bakanet/http/radix_tree.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/bakanet/src/bakanet/http/radix_tree.h b/bakanet/src/bakanet/http/radix_tree.h deleted file mode 100644 index e69de29..0000000