Added main HTTP methods and fixed issues with request/responce parsing

multi_plaform
anulax1225 ago%!(EXTRA string=1 year)
parent 6573911d49
commit 3917fd3554
  1. 42
      bakanet/src/bakanet/http/http_packet.cpp
  2. 27
      bakanet/src/bakanet/http/http_server.cpp
  3. 6
      bakanet/src/bakanet/http/http_server.h

@ -10,23 +10,28 @@ namespace Bk::Net {
HttpRequest::HttpRequest(std::string data)
{
auto lines = Tools::string_split(data, "\n");
auto first_line = std::string(lines->at(0));
auto req_data = Tools::string_split(first_line, " ");
auto req_data = Tools::string_split(lines->at(0), " ");
if(req_data->size() > 0) method = req_data->at(0);
if(req_data->size() > 1) url = req_data->at(1);
if(req_data->size() > 2) version = req_data->at(2);
body = std::string(lines->at(lines->size() - 1));
lines->erase(lines->begin());
//lines->erase(lines->end());
for (auto line : *lines)
for (auto line = lines->begin(); line != lines->end(); line++)
{
auto param = Tools::string_split(line, ":", 1);
if (param->size() >= 2)
if (*line != "\r")
{
Tools::string_trim(param->at(1));
params.insert({param->at(0), param->at(1)});
auto param = Tools::string_split(*line, ":", 1);
if (param->size() >= 2)
{
Tools::string_trim(param->at(1));
params.insert({param->at(0), param->at(1)});
}
}
else
{
for (auto body_line = ++line; body_line != lines->end(); body_line++)
body += *body_line + "\n";
break;
}
}
}
@ -35,20 +40,7 @@ namespace Bk::Net {
{
std::string request = "";
request += method + " " + url + " " + version + "\r\n";
std::string param_order[] =
{
"Host",
"User-Agent",
"Accept",
"Accept-Language",
"Accept-Encoding",
"Connection",
"Upgrade-Insecure-Requests",
"Sec-Fetch-Dest",
"Sec-Fetch-Mode",
"Sec-Fetch-Site"
};
if (params.size()) for ( const auto& param : param_order) if (params[param].length()) request += param + ": " + params[param] + "\r\n";
if (params.size()) for ( const auto& param : params) request += param.first + ": " + param.second + "\r\n";
request += "\r\n";
if (body.length()) request += body;
return request;

@ -29,6 +29,33 @@ namespace Bk::Net {
else radix.add_nodes(splits->data(), splits->size(), HttpMethodArray({{ "GET", req_handler }}));
}
void HttpServer::post(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["POST"] = req_handler;
else radix.add_nodes(splits->data(), splits->size(), HttpMethodArray({{ "POST", req_handler }}));
}
void HttpServer::del(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["DELETE"] = req_handler;
else radix.add_nodes(splits->data(), splits->size(), HttpMethodArray({{ "DELETE", req_handler }}));
}
void HttpServer::put(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["PUT"] = req_handler;
else radix.add_nodes(splits->data(), splits->size(), HttpMethodArray({{ "PUT", req_handler }}));
}
HttpRequest HttpServer::recv_request(Socket& conn)
{
Type::DataStream req;

@ -18,10 +18,14 @@ namespace Bk::Net {
~HttpServer() = default;
void start();
void get(std::string url, RequestHandler req_handler);
RadixTree radix;
void post(std::string url, RequestHandler req_handler);
void del(std::string url, RequestHandler req_handler);
void put(std::string url, RequestHandler req_handler);
private:
std::unique_ptr<Socket> socket;
ThreadPool threads;
RadixTree radix;
HttpRequest recv_request(Socket& conn);
void send_reponse(Socket& conn, HttpReponse res);

Loading…
Cancel
Save