From f8193830123cae2c8b167dc0457d090e5f4e0277 Mon Sep 17 00:00:00 2001 From: Relintai Date: Mon, 27 Jun 2022 14:16:23 +0200 Subject: [PATCH] Smaller cleanups and improvements. --- modules/web/http/web_server.cpp | 48 ++++++++++++++++++++++--- modules/web/http/web_server.h | 16 +++++++++ modules/web/http/web_server_request.cpp | 26 +++++++++----- modules/web/http/web_server_request.h | 4 +++ 4 files changed, 82 insertions(+), 12 deletions(-) diff --git a/modules/web/http/web_server.cpp b/modules/web/http/web_server.cpp index efbab22a0..0abff1e50 100644 --- a/modules/web/http/web_server.cpp +++ b/modules/web/http/web_server.cpp @@ -3,6 +3,8 @@ #include "web_node.h" #include "web_server_request.h" +#include "http_session_manager.h" + NodePath WebServer::get_web_root_path() const { return _web_root_path; } @@ -27,10 +29,24 @@ void WebServer::set_web_root_bind(Node *root) { _web_root = web_root; } +HTTPSessionManager *WebServer::get_session_manager() { + return _session_manager; +} +void WebServer::set_session_manager(HTTPSessionManager *sess_man) { + _session_manager = sess_man; +} + +Node *WebServer::get_session_manager_bind() { + return _session_manager; +} +void WebServer::set_session_manager_bind(Node *sess_man) { + _session_manager = Object::cast_to(sess_man); +} + void WebServer::server_handle_request(Ref request) { ERR_FAIL_COND(!_web_root); - request->set_server(this); + request->server = this; request->web_root = _web_root; _rw_lock.read_lock(); @@ -38,6 +54,19 @@ void WebServer::server_handle_request(Ref request) { _rw_lock.read_unlock(); } +void WebServer::start() { + call("_start"); +} +void WebServer::stop() { + call("_stop"); +} + +void WebServer::_start() { + //look up root node, and sessionmanager, if not set. +} +void WebServer::_stop() { +} + WebServer::WebServer() { _web_root = nullptr; @@ -52,10 +81,21 @@ void WebServer::_bind_methods() { ClassDB::bind_method(D_METHOD("set_web_root_path", "val"), &WebServer::set_web_root_path); ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "web_root_path"), "set_web_root_path", "get_web_root_path"); - ClassDB::bind_method(D_METHOD("get_web_root_bind"), &WebServer::get_web_root_bind); - ClassDB::bind_method(D_METHOD("set_web_root_bind", "val"), &WebServer::set_web_root_bind); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "web_root", PROPERTY_HINT_RESOURCE_TYPE, "Node"), "set_web_root_bind", "get_web_root_bind"); + ClassDB::bind_method(D_METHOD("get_web_root"), &WebServer::get_web_root_bind); + ClassDB::bind_method(D_METHOD("set_web_root", "val"), &WebServer::set_web_root_bind); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "web_root", PROPERTY_HINT_RESOURCE_TYPE, "WebRoot"), "set_web_root", "get_web_root"); + + ClassDB::bind_method(D_METHOD("get_session_manager"), &WebServer::get_session_manager_bind); + ClassDB::bind_method(D_METHOD("set_session_manager", "val"), &WebServer::set_session_manager_bind); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "session_manager", PROPERTY_HINT_RESOURCE_TYPE, "HTTPSessionManager"), "set_session_manager", "get_session_manager"); ClassDB::bind_method(D_METHOD("server_handle_request", "request"), &WebServer::server_handle_request); ClassDB::bind_method(D_METHOD("request_write_lock"), &WebServer::request_write_lock); + + BIND_VMETHOD(MethodInfo("_start")); + BIND_VMETHOD(MethodInfo("_stop")); + ClassDB::bind_method(D_METHOD("start"), &WebServer::start); + ClassDB::bind_method(D_METHOD("stop"), &WebServer::stop); + ClassDB::bind_method(D_METHOD("_start"), &WebServer::_start); + ClassDB::bind_method(D_METHOD("_stop"), &WebServer::_stop); } diff --git a/modules/web/http/web_server.h b/modules/web/http/web_server.h index 82c3bb959..b3bba41ef 100644 --- a/modules/web/http/web_server.h +++ b/modules/web/http/web_server.h @@ -6,6 +6,8 @@ class WebServerRequest; class WebNode; +class WebRoot; +class HTTPSessionManager; class WebServer : public Node { GDCLASS(WebServer, Node); @@ -20,10 +22,22 @@ public: Node *get_web_root_bind(); void set_web_root_bind(Node *root); + HTTPSessionManager *get_session_manager(); + void set_session_manager(HTTPSessionManager *sess_man); + + Node *get_session_manager_bind(); + void set_session_manager_bind(Node *sess_man); + void server_handle_request(Ref request); void request_write_lock(); + void start(); + void stop(); + + virtual void _start(); + virtual void _stop(); + WebServer(); ~WebServer(); @@ -33,6 +47,8 @@ protected: NodePath _web_root_path; WebNode *_web_root; + HTTPSessionManager *_session_manager; + bool _write_lock_requested; RWLock _rw_lock; }; diff --git a/modules/web/http/web_server_request.cpp b/modules/web/http/web_server_request.cpp index 89d3b7bc5..bce64c14a 100644 --- a/modules/web/http/web_server_request.cpp +++ b/modules/web/http/web_server_request.cpp @@ -6,8 +6,8 @@ #include "http_session.h" -#include "session_manager.h" -#include "web_root.h" +#include "http_session_manager.h" +#include "web_node.h" #include "web_permission.h" @@ -79,7 +79,11 @@ Ref WebServerRequest::get_or_create_session() { return session; } - session = SessionManager::get_singleton()->create_session(); + HTTPSessionManager *sm = server->get_session_manager(); + + ERR_FAIL_COND_V(!sm, session); + + session = sm->create_session(); return session; } @@ -119,7 +123,11 @@ void WebServerRequest::set_csrf_token(const String &value) { if (session.is_valid()) { session->add("csrf_token", value); - SessionManager::get_singleton()->save_session(session); + HTTPSessionManager *sm = server->get_session_manager(); + + ERR_FAIL_COND(!sm); + + sm->save_session(session); } } @@ -275,15 +283,15 @@ String WebServerRequest::get_path(const bool beginning_slash, const bool end_sla return path; } -String WebServerRequest::path_full() const { +String WebServerRequest::get_path_full() const { return _full_path; } -String WebServerRequest::path_segment(const uint32_t i) const { +String WebServerRequest::get_path_segment(const uint32_t i) const { return _path_stack[i]; } -String WebServerRequest::current_path_segment() const { +String WebServerRequest::get_current_path_segment() const { if (_path_stack_pointer >= _path_stack.size()) { // for convenience static const String e_str = ""; @@ -293,7 +301,7 @@ String WebServerRequest::current_path_segment() const { return _path_stack[_path_stack_pointer]; } -String WebServerRequest::next_path_segment() const { +String WebServerRequest::get_next_path_segment() const { int pst = _path_stack_pointer + 1; if (pst >= _path_stack.size()) { @@ -427,6 +435,8 @@ WebServerRequest::WebServerRequest() { //compiled_body.clear(); //data.clear(); + server = nullptr; + web_root = nullptr; } WebServerRequest::~WebServerRequest() { diff --git a/modules/web/http/web_server_request.h b/modules/web/http/web_server_request.h index eba96433d..213a7aff1 100644 --- a/modules/web/http/web_server_request.h +++ b/modules/web/http/web_server_request.h @@ -14,6 +14,7 @@ class WebServer; class WebServerCookie; class HTTPSession; class WebPermission; +class WebNode; class WebServerRequest : public Reference { GDCLASS(WebServerRequest, Reference); @@ -108,11 +109,14 @@ public: WebServer *get_server(); Node *get_server_bind(); + WebNode *get_web_root(); + Node *get_web_root_bind(); WebServerRequest(); ~WebServerRequest(); WebServer *server; + WebNode *web_root; String head; String body;