parent
705a8875ba
commit
a47ef015af
6 changed files with 164 additions and 0 deletions
@ -0,0 +1,42 @@ |
|||||||
|
#include "http_parser.h" |
||||||
|
|
||||||
|
HttpRequest http_parser(std::string req) |
||||||
|
{ |
||||||
|
std::string url = "", method = "", body = ""; |
||||||
|
std::unordered_map<std::string, std::string> params; |
||||||
|
|
||||||
|
auto lines = string_split(req, "\n"); |
||||||
|
|
||||||
|
auto first_line = string_split(lines->at(0), " "); |
||||||
|
method = string_to_upper(first_line->at(0)); |
||||||
|
url = first_line->at(1); |
||||||
|
body = lines->at(lines->size() - 1); |
||||||
|
|
||||||
|
lines->erase(lines->begin()); |
||||||
|
lines->pop_back(); |
||||||
|
|
||||||
|
for (auto line : *lines) |
||||||
|
{ |
||||||
|
auto param = string_split(line, ":", 1); |
||||||
|
if (param->size() == 2) |
||||||
|
{ |
||||||
|
params.insert({ param->at(0), string_trim(param->at(1))}); |
||||||
|
} |
||||||
|
} |
||||||
|
return HttpRequest { |
||||||
|
http_resolve_methode(method), |
||||||
|
url, |
||||||
|
params, |
||||||
|
body |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
HttpMethod http_resolve_methode(std::string method) |
||||||
|
{ |
||||||
|
if (method.compare("GET")) return HttpMethod::GET; |
||||||
|
else if (method.compare("POST")) return HttpMethod::POST; |
||||||
|
else if (method.compare("PUT")) return HttpMethod::PUT; |
||||||
|
else if (method.compare("DELETE")) return HttpMethod::DELETE; |
||||||
|
else return HttpMethod::NONE; |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
#include <unordered_map> |
||||||
|
|
||||||
|
#include <commun.h> |
||||||
|
|
||||||
|
#include "http_tools.h" |
||||||
|
|
||||||
|
enum class HttpMethod |
||||||
|
{ |
||||||
|
NONE = 0, |
||||||
|
GET = 1, |
||||||
|
POST = 2, |
||||||
|
PUT = 3, |
||||||
|
DELETE = 4, |
||||||
|
}; |
||||||
|
|
||||||
|
class HttpRequest
|
||||||
|
{ |
||||||
|
public: |
||||||
|
HttpMethod method; |
||||||
|
std::string url; |
||||||
|
std::unordered_map<std::string, std::string> params; |
||||||
|
std::string body; |
||||||
|
}; |
||||||
|
|
||||||
|
HttpRequest http_parser(std::string req); |
||||||
|
HttpMethod http_resolve_methode(std::string method); |
@ -0,0 +1,48 @@ |
|||||||
|
#include "http_server.h" |
||||||
|
|
||||||
|
void http_server()
|
||||||
|
{ |
||||||
|
IpAddress ip("127.0.0.1"); |
||||||
|
Socket sock(ip, PORT, IpProtocol::TCP); |
||||||
|
bool running = sock.init() && sock.start(5); |
||||||
|
char input = 'N'; |
||||||
|
|
||||||
|
do |
||||||
|
{ |
||||||
|
Connection conn = sock.ack(); |
||||||
|
if (conn >= 0)
|
||||||
|
{ |
||||||
|
std::string http_request(http_handler(sock, conn)); |
||||||
|
|
||||||
|
if (http_request == "") continue; |
||||||
|
HttpRequest req = http_parser(http_request); |
||||||
|
log("Http request"); |
||||||
|
log("Method " << (int)req.method) |
||||||
|
log("URL " << req.url) |
||||||
|
log("Body " << req.body) |
||||||
|
} |
||||||
|
log("Close?") |
||||||
|
input(input); |
||||||
|
} while (input != 'y'); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
std::string http_handler(Socket& sock, Connection conn)
|
||||||
|
{ |
||||||
|
Packet req; |
||||||
|
bool reading = true; |
||||||
|
while(reading) |
||||||
|
{ |
||||||
|
std::vector<char> raw_data; |
||||||
|
raw_data = sock.recv(conn, 4); |
||||||
|
reading = req.append_data(raw_data); |
||||||
|
} |
||||||
|
|
||||||
|
close(conn); |
||||||
|
|
||||||
|
int req_size = req.size(); |
||||||
|
std::unique_ptr<char[]> req_test = req.pull<char>(req_size); |
||||||
|
|
||||||
|
if (req_size) return std::string(req_test.release(), req_size); |
||||||
|
return ""; |
||||||
|
} |
@ -0,0 +1,7 @@ |
|||||||
|
#include <commun.h> |
||||||
|
|
||||||
|
#include "http_parser.h" |
||||||
|
|
||||||
|
using namespace Bk::Net; |
||||||
|
void http_server(); |
||||||
|
std::string http_handler(Socket& sock, Connection conn); |
@ -0,0 +1,34 @@ |
|||||||
|
#include "http_tools.h" |
||||||
|
|
||||||
|
std::string string_to_upper(std::string& str) |
||||||
|
{ |
||||||
|
for (int i = 0; i < str.length(); i++) |
||||||
|
{ |
||||||
|
str[i] = std::toupper(str[i]); |
||||||
|
} |
||||||
|
return str; |
||||||
|
} |
||||||
|
|
||||||
|
std::unique_ptr<std::vector<std::string>> string_split(std::string s, std::string delimiter, int cpt) |
||||||
|
{ |
||||||
|
std::unique_ptr<std::vector<std::string>> splits(new std::vector<std::string>(0)); |
||||||
|
size_t pos = 0; |
||||||
|
while (((pos = s.find(delimiter)) != std::string::npos) && cpt-- != 0) { |
||||||
|
splits->push_back(s.substr(0, pos)); |
||||||
|
s.erase(0, pos + delimiter.length()); |
||||||
|
} |
||||||
|
splits->push_back(s); |
||||||
|
return splits; |
||||||
|
} |
||||||
|
|
||||||
|
std::string string_trim(const std::string& str, const std::string& whitespace) |
||||||
|
{ |
||||||
|
const auto strBegin = str.find_first_not_of(whitespace); |
||||||
|
if (strBegin == std::string::npos) |
||||||
|
return ""; // no content
|
||||||
|
|
||||||
|
const auto strEnd = str.find_last_not_of(whitespace); |
||||||
|
const auto strRange = strEnd - strBegin + 1; |
||||||
|
|
||||||
|
return str.substr(strBegin, strRange); |
||||||
|
} |
@ -0,0 +1,7 @@ |
|||||||
|
#include <cstring> |
||||||
|
|
||||||
|
#include <commun.h> |
||||||
|
|
||||||
|
std::string string_to_upper(std::string& str); |
||||||
|
std::unique_ptr<std::vector<std::string>> string_split(std::string s, std::string delimiter, int cpt = -1); |
||||||
|
std::string string_trim(const std::string& str, const std::string& whitespace = " "); |
Loading…
Reference in New Issue