Modified http server to use Trie structure

multi_plaform
anulax1225 ago%!(EXTRA string=1 year)
parent 772d91f90d
commit 21443fb5d3
  1. 23
      bakanet/src/bakanet/http/http_server.cpp
  2. 8
      bakanet/src/bakanet/http/http_server.h
  3. 0
      bakanet/src/bakanet/http/radix_tree.cpp
  4. 0
      bakanet/src/bakanet/http/radix_tree.h

@ -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<char> 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<char>(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"));
}
}

@ -10,16 +10,18 @@
namespace Bk::Net {
class HttpServer
{
using ThreadPool = std::vector<std::thread>;
using RequestHandler = std::function<HttpReponse(HttpRequest& req)>;
using HttpMethodArray = std::unordered_map<std::string, RequestHandler>;
using RadixTree = DataType::Trie<std::string, HttpMethodArray>;
using ThreadPool = std::vector<std::thread>;
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> socket;
std::unordered_map<std::string, RequestHandler> req_mapper;
ThreadPool threads;
HttpRequest recv_request(Socket& conn);

Loading…
Cancel
Save