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