Initial DRequest and on_async_request implementation.

This commit is contained in:
Relintai 2021-07-06 16:57:21 +02:00
parent 3b4a0ae80f
commit 47f9e21a91
3 changed files with 45 additions and 12 deletions

View File

@ -115,8 +115,8 @@ void DRequest::reset() {
footer.clear(); footer.clear();
compiled_body.clear(); compiled_body.clear();
if (response) response.reset();
delete response; request.reset();
//response = new HttpResponse(); //response = new HttpResponse();
} }
@ -204,7 +204,6 @@ void DRequest::update() {
} }
DRequest::DRequest() { DRequest::DRequest() {
response = nullptr;
//This value will need benchmarks, 2 MB seems to be just as fast for me as 4 MB, but 1MB is slower //This value will need benchmarks, 2 MB seems to be just as fast for me as 4 MB, but 1MB is slower
//It is a tradeoff on server memory though, as every active download will consume this amount of memory //It is a tradeoff on server memory though, as every active download will consume this amount of memory
@ -215,7 +214,6 @@ DRequest::DRequest() {
} }
DRequest::~DRequest() { DRequest::~DRequest() {
delete response;
} }
void DRequest::_progress_send_file() { void DRequest::_progress_send_file() {

View File

@ -1,9 +1,10 @@
#ifndef DREQUEST_H #ifndef DREQUEST_H
#define REQUEST_H #define DREQUEST_H
#include <mutex> #include <mutex>
#include <vector> #include <vector>
#include "http/HttpRequestImpl.h"
#include "http/HttpResponse.h" #include "http/HttpResponse.h"
#include "handler_instance.h" #include "handler_instance.h"
@ -14,7 +15,10 @@ class DWebApplication;
class DRequest { class DRequest {
public: public:
HttpResponse *response; HttpResponsePtr response;
HttpRequestImplPtr request;
std::function<void(const HttpResponsePtr &)> *callback;
DWebApplication *application; DWebApplication *application;
uint32_t current_middleware_index; uint32_t current_middleware_index;

View File

@ -88,10 +88,21 @@ void DWebApplication::default_404_error_handler(int error_code, DRequest *reques
} }
void DWebApplication::handle_request(DRequest *request) { void DWebApplication::handle_request(DRequest *request) {
request->middleware_stack = &middlewares; //request->middleware_stack = &middlewares;
//note that middlewares handle the routing -> DWebApplication::default_routing_middleware by default //note that middlewares handle the routing -> DWebApplication::default_routing_middleware by default
request->next_stage(); //request->next_stage();
//auto resp = HttpResponse::newHttpResponse();
//resp->setBody("<p>Hello, world!</p>");
//resp->setExpiredTime(0);
//callback(resp);
request->response->setBody("<p>Hello, world!</p>");
request->response->setExpiredTime(0);
request->callback->operator()(request->response);
DRequestPool::return_request(request);
} }
void DWebApplication::send_error(int error_code, DRequest *request) { void DWebApplication::send_error(int error_code, DRequest *request) {
@ -592,8 +603,7 @@ void DWebApplication::on_async_request(const HttpRequestImplPtr &req, std::funct
LOG_INFO << "on_async_request"; LOG_INFO << "on_async_request";
LOG_TRACE << "new request:" << req->peerAddr().toIpPort() << "->" LOG_TRACE << "new request:" << req->peerAddr().toIpPort() << "->" << req->localAddr().toIpPort();
<< req->localAddr().toIpPort();
LOG_TRACE << "Headers " << req->methodString() << " " << req->path(); LOG_TRACE << "Headers " << req->methodString() << " " << req->path();
LOG_TRACE << "http path=" << req->path(); LOG_TRACE << "http path=" << req->path();
@ -606,14 +616,16 @@ void DWebApplication::on_async_request(const HttpRequestImplPtr &req, std::funct
return; return;
} }
find_session_for_request(req);
/* /*
findSessionForRequest(req);
// Route to controller // Route to controller
if (!preRoutingObservers_.empty()) { if (!preRoutingObservers_.empty()) {
for (auto &observer : preRoutingObservers_) { for (auto &observer : preRoutingObservers_) {
observer(req); observer(req);
} }
} }
if (preRoutingAdvices_.empty()) { if (preRoutingAdvices_.empty()) {
httpSimpleCtrlsRouterPtr_->route(req, std::move(callback)); httpSimpleCtrlsRouterPtr_->route(req, std::move(callback));
} else { } else {
@ -631,7 +643,26 @@ void DWebApplication::on_async_request(const HttpRequestImplPtr &req, std::funct
[this, callbackPtr, req]() { [this, callbackPtr, req]() {
httpSimpleCtrlsRouterPtr_->route(req, std::move(*callbackPtr)); httpSimpleCtrlsRouterPtr_->route(req, std::move(*callbackPtr));
}); });
}*/ }
*/
//void HttpSimpleControllersRouter::route(const HttpRequestImplPtr &req,std::function<void(const HttpResponsePtr &)> &&callback)
//auto resp = HttpResponse::newHttpResponse();
//resp->setBody("<p>Hello, world!</p>");
//resp->setExpiredTime(0);
//callback(resp);
DRequest *request = DRequestPool::get_request();
request->application = this;
request->response = HttpResponse::newHttpResponse();
request->request = std::shared_ptr<drogon::HttpRequestImpl>(req);
request->callback = &callback;//std::move(callback);
request->setup_url_stack();
handle_request(request);
} }
void DWebApplication::on_new_websock_request(const HttpRequestImplPtr &req, std::function<void(const HttpResponsePtr &)> &&callback, const WebSocketConnectionImplPtr &wsConnPtr) { void DWebApplication::on_new_websock_request(const HttpRequestImplPtr &req, std::function<void(const HttpResponsePtr &)> &&callback, const WebSocketConnectionImplPtr &wsConnPtr) {