diff --git a/core/http_server.cpp b/core/http_server.cpp index 34eb796..29760cf 100644 --- a/core/http_server.cpp +++ b/core/http_server.cpp @@ -1,23 +1,27 @@ #include "http_server.h" -#include "request.h" #include "application.h" +#include "request.h" #define LOG_VERBOSE 0 void HTTPServer::http_callback_handler(Request *request) { - Application::handle_request(request); + Application::handle_request(request); } void HTTPServer::httpEnterCallbackDefault(const HTTPParser &httpParser, const HttpSession::Ptr &session) { + std::unique_lock lock(_request_map_mutex, std::defer_lock); + Request *request = RequestPool::get_request(); HttpSession *s = session.get(); + lock.lock(); _request_map[s] = request; + lock.unlock(); - request->http_parser = std::make_shared(httpParser); - request->session = session; + request->http_parser = std::make_shared(httpParser); + request->session = session; request->setup_url_stack(); @@ -25,7 +29,7 @@ void HTTPServer::httpEnterCallbackDefault(const HTTPParser &httpParser, const Ht std::cout << "method:" << http_method_str(static_cast(httpParser.method())) << std::endl; #endif - http_callback_handler(request); + http_callback_handler(request); } void HTTPServer::wsEnterCallbackDefault(const HttpSession::Ptr &httpSession, WebSocketFormat::WebSocketFrameType opcode, const std::string &payload) { @@ -43,17 +47,22 @@ void HTTPServer::wsEnterCallbackDefault(const HttpSession::Ptr &httpSession, Web void HTTPServer::closedCallbackDefault(const HttpSession::Ptr &session) { HttpSession *s = session.get(); + std::unique_lock lock(_request_map_mutex, std::defer_lock); + + lock.lock(); Request *r = _request_map[s]; if (r == nullptr) { - printf("Error HTTPServer::closedCallbackDefault: r == nullptr!"); - _request_map.erase(s); + lock.unlock(); + printf("Error HTTPServer::closedCallbackDefault: r == nullptr!\n"); + return; } - r->connection_closed = true; - _request_map.erase(s); + lock.unlock(); + + r->connection_closed = true; } void HTTPServer::configure() { @@ -80,6 +89,7 @@ void HTTPServer::initialize() { listenBuilder->configureSocketOptions({ [](TcpSocket &socket) { socket.setNodelay(); + socket.setNonblock(); }, }); @@ -121,4 +131,5 @@ HTTPServer::~HTTPServer() { delete listenBuilder; } -std::map HTTPServer::_request_map; \ No newline at end of file +std::map HTTPServer::_request_map; +std::mutex HTTPServer::_request_map_mutex; diff --git a/core/http_server.h b/core/http_server.h index ceb6e3e..fa155ab 100644 --- a/core/http_server.h +++ b/core/http_server.h @@ -3,8 +3,9 @@ #include #include -#include #include +#include +#include #include #include @@ -24,24 +25,25 @@ public: int port; int threads; std::shared_ptr service; - wrapper::HttpListenerBuilder *listenBuilder; + wrapper::HttpListenerBuilder *listenBuilder; - static void http_callback_handler(Request *response); + static void http_callback_handler(Request *response); static void httpEnterCallbackDefault(const HTTPParser &httpParser, const HttpSession::Ptr &session); static void wsEnterCallbackDefault(const HttpSession::Ptr &httpSession, WebSocketFormat::WebSocketFrameType opcode, const std::string &payload); static void closedCallbackDefault(const HttpSession::Ptr &session); - virtual void configure(); + virtual void configure(); virtual void initialize(); void main_loop(); - HTTPServer(); - virtual ~HTTPServer(); + HTTPServer(); + virtual ~HTTPServer(); protected: - static std::map _request_map; + static std::map _request_map; + static std::mutex _request_map_mutex; }; #endif \ No newline at end of file