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 "http_server.h"
|
||||||
|
|
||||||
#include "request.h"
|
|
||||||
#include "application.h"
|
#include "application.h"
|
||||||
|
#include "request.h"
|
||||||
|
|
||||||
#define LOG_VERBOSE 0
|
#define LOG_VERBOSE 0
|
||||||
|
|
||||||
void HTTPServer::http_callback_handler(Request *request) {
|
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) {
|
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();
|
Request *request = RequestPool::get_request();
|
||||||
|
|
||||||
HttpSession *s = session.get();
|
HttpSession *s = session.get();
|
||||||
|
|
||||||
|
lock.lock();
|
||||||
_request_map[s] = request;
|
_request_map[s] = request;
|
||||||
|
lock.unlock();
|
||||||
|
|
||||||
request->http_parser = std::make_shared<HTTPParser>(httpParser);
|
request->http_parser = std::make_shared<HTTPParser>(httpParser);
|
||||||
request->session = session;
|
request->session = session;
|
||||||
|
|
||||||
request->setup_url_stack();
|
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;
|
std::cout << "method:" << http_method_str(static_cast<http_method>(httpParser.method())) << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
http_callback_handler(request);
|
http_callback_handler(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HTTPServer::wsEnterCallbackDefault(const HttpSession::Ptr &httpSession, WebSocketFormat::WebSocketFrameType opcode, const std::string &payload) {
|
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) {
|
void HTTPServer::closedCallbackDefault(const HttpSession::Ptr &session) {
|
||||||
HttpSession *s = session.get();
|
HttpSession *s = session.get();
|
||||||
|
|
||||||
|
std::unique_lock<std::mutex> lock(_request_map_mutex, std::defer_lock);
|
||||||
|
|
||||||
|
lock.lock();
|
||||||
Request *r = _request_map[s];
|
Request *r = _request_map[s];
|
||||||
|
|
||||||
if (r == nullptr) {
|
if (r == nullptr) {
|
||||||
printf("Error HTTPServer::closedCallbackDefault: r == nullptr!");
|
lock.unlock();
|
||||||
_request_map.erase(s);
|
printf("Error HTTPServer::closedCallbackDefault: r == nullptr!\n");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
r->connection_closed = true;
|
|
||||||
|
|
||||||
_request_map.erase(s);
|
_request_map.erase(s);
|
||||||
|
lock.unlock();
|
||||||
|
|
||||||
|
r->connection_closed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HTTPServer::configure() {
|
void HTTPServer::configure() {
|
||||||
@ -80,6 +89,7 @@ void HTTPServer::initialize() {
|
|||||||
listenBuilder->configureSocketOptions({
|
listenBuilder->configureSocketOptions({
|
||||||
[](TcpSocket &socket) {
|
[](TcpSocket &socket) {
|
||||||
socket.setNodelay();
|
socket.setNodelay();
|
||||||
|
socket.setNonblock();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -121,4 +131,5 @@ HTTPServer::~HTTPServer() {
|
|||||||
delete listenBuilder;
|
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 <condition_variable>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <string>
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <mutex>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include <brynet/base/AppStatus.hpp>
|
#include <brynet/base/AppStatus.hpp>
|
||||||
#include <brynet/net/http/HttpFormat.hpp>
|
#include <brynet/net/http/HttpFormat.hpp>
|
||||||
@ -24,24 +25,25 @@ public:
|
|||||||
int port;
|
int port;
|
||||||
int threads;
|
int threads;
|
||||||
std::shared_ptr<TcpService> service;
|
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 httpEnterCallbackDefault(const HTTPParser &httpParser, const HttpSession::Ptr &session);
|
||||||
static void wsEnterCallbackDefault(const HttpSession::Ptr &httpSession, WebSocketFormat::WebSocketFrameType opcode, const std::string &payload);
|
static void wsEnterCallbackDefault(const HttpSession::Ptr &httpSession, WebSocketFormat::WebSocketFrameType opcode, const std::string &payload);
|
||||||
static void closedCallbackDefault(const HttpSession::Ptr &session);
|
static void closedCallbackDefault(const HttpSession::Ptr &session);
|
||||||
|
|
||||||
virtual void configure();
|
virtual void configure();
|
||||||
virtual void initialize();
|
virtual void initialize();
|
||||||
|
|
||||||
void main_loop();
|
void main_loop();
|
||||||
|
|
||||||
HTTPServer();
|
HTTPServer();
|
||||||
virtual ~HTTPServer();
|
virtual ~HTTPServer();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static std::map<HttpSession*, Request*> _request_map;
|
static std::map<HttpSession *, Request *> _request_map;
|
||||||
|
static std::mutex _request_map_mutex;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
Loading…
Reference in New Issue
Block a user