mirror of
https://github.com/Relintai/rcpp_framework.git
synced 2025-05-19 06:08:22 +02:00
Added a mutex for writing/reading _request_map in HTTPServer.
This commit is contained in:
parent
67e740e35b
commit
23d085794c
@ -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<std::mutex> 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>(httpParser);
|
||||
request->session = session;
|
||||
request->http_parser = std::make_shared<HTTPParser>(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<http_method>(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<std::mutex> 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<HttpSession*, Request*> HTTPServer::_request_map;
|
||||
std::map<HttpSession *, Request *> HTTPServer::_request_map;
|
||||
std::mutex HTTPServer::_request_map_mutex;
|
||||
|
@ -3,8 +3,9 @@
|
||||
|
||||
#include <condition_variable>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <mutex>
|
||||
#include <string>
|
||||
|
||||
#include <brynet/base/AppStatus.hpp>
|
||||
#include <brynet/net/http/HttpFormat.hpp>
|
||||
@ -24,24 +25,25 @@ public:
|
||||
int port;
|
||||
int threads;
|
||||
std::shared_ptr<TcpService> 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<HttpSession*, Request*> _request_map;
|
||||
static std::map<HttpSession *, Request *> _request_map;
|
||||
static std::mutex _request_map_mutex;
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user