mirror of
https://github.com/Relintai/rcpp_framework.git
synced 2025-04-20 01:43:12 +02:00
Merged WebRouterNode into WebNode. Also added a way to turn it off in case it's needed. It's too useful to not have it on all nodes.
This commit is contained in:
parent
10af49898f
commit
7bd1b372ea
@ -64,6 +64,25 @@ void WebNode::set_settings(Settings *settings) {
|
||||
// todo send event to children when it's implemented?
|
||||
}
|
||||
|
||||
bool WebNode::get_routing_enabled() {
|
||||
return _routing_enabled;
|
||||
}
|
||||
void WebNode::set_routing_enabled(const bool value) {
|
||||
if (_routing_enabled == value) {
|
||||
return;
|
||||
}
|
||||
|
||||
_routing_enabled = value;
|
||||
|
||||
if (!_routing_enabled) {
|
||||
clear_handlers();
|
||||
} else {
|
||||
if (is_in_tree()) {
|
||||
build_handler_map();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DATABASES_ENABLED
|
||||
|
||||
Database *WebNode::get_database() {
|
||||
@ -99,7 +118,9 @@ void WebNode::set_database(Database *db) {
|
||||
#endif
|
||||
|
||||
void WebNode::handle_request_main(Request *request) {
|
||||
_handle_request_main(request);
|
||||
if (!try_route_request_to_children(request)) {
|
||||
_handle_request_main(request);
|
||||
}
|
||||
}
|
||||
|
||||
void WebNode::_handle_request_main(Request *request) {
|
||||
@ -161,6 +182,86 @@ void WebNode::_migrate(const bool clear, const bool seed_db) {
|
||||
}
|
||||
}
|
||||
|
||||
bool WebNode::try_route_request_to_children(Request *request) {
|
||||
WebNode *handler = nullptr;
|
||||
|
||||
// if (path == "/") {
|
||||
if (request->get_path_segment_count() == 0) {
|
||||
// quick shortcut
|
||||
handler = _index_node;
|
||||
} else {
|
||||
const String &main_route = request->get_current_path_segment();
|
||||
|
||||
handler = _node_route_map[main_route];
|
||||
|
||||
request->push_path();
|
||||
}
|
||||
|
||||
if (!handler) {
|
||||
return false;
|
||||
}
|
||||
|
||||
handler->handle_request_main(request);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
WebNode *WebNode::get_request_handler_child(Request *request) {
|
||||
WebNode *handler = nullptr;
|
||||
|
||||
// if (path == "/") {
|
||||
if (request->get_path_segment_count() == 0) {
|
||||
// quick shortcut
|
||||
handler = _index_node;
|
||||
} else {
|
||||
const String &main_route = request->get_current_path_segment();
|
||||
handler = _node_route_map[main_route];
|
||||
|
||||
request->push_path();
|
||||
}
|
||||
|
||||
return handler;
|
||||
}
|
||||
|
||||
void WebNode::build_handler_map() {
|
||||
_index_node = nullptr;
|
||||
_node_route_map.clear();
|
||||
|
||||
for (int i = 0; i < get_child_count(); ++i) {
|
||||
WebNode *c = Object::cast_to<WebNode>(get_child(i));
|
||||
|
||||
if (!c) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String uri_segment = c->get_uri_segment();
|
||||
|
||||
if (uri_segment == "") {
|
||||
// ignore
|
||||
continue;
|
||||
} else if (uri_segment == "/") {
|
||||
if (_index_node) {
|
||||
RLOG_ERR("You have multiple root nodes!");
|
||||
continue;
|
||||
}
|
||||
|
||||
_index_node = c;
|
||||
} else {
|
||||
if (_node_route_map[uri_segment]) {
|
||||
RLOG_ERR("You have multiple of the same uri! URI:" + uri_segment);
|
||||
continue;
|
||||
}
|
||||
|
||||
_node_route_map[uri_segment] = c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WebNode::clear_handlers() {
|
||||
_index_node = nullptr;
|
||||
_node_route_map.clear();
|
||||
}
|
||||
|
||||
WebServer *WebNode::get_server() {
|
||||
// todo this shoult probably be cached
|
||||
return Object::cast_to<WebServer>(get_tree());
|
||||
@ -180,6 +281,28 @@ WebNode *WebNode::get_parent_webnode() {
|
||||
return Object::cast_to<WebNode>(get_parent());
|
||||
}
|
||||
|
||||
void WebNode::_notification(const int what) {
|
||||
switch (what) {
|
||||
case NOTIFICATION_ENTER_TREE:
|
||||
if (_routing_enabled) {
|
||||
build_handler_map();
|
||||
}
|
||||
break;
|
||||
case NOTIFICATION_CHILD_ADDED:
|
||||
if (_routing_enabled && is_in_tree()) {
|
||||
build_handler_map();
|
||||
}
|
||||
break;
|
||||
case NOTIFICATION_CHILD_REMOVED:
|
||||
if (_routing_enabled && is_in_tree()) {
|
||||
build_handler_map();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
WebNode::WebNode() :
|
||||
Node() {
|
||||
// should look this up in parents when parented (and node parenting is implemented)
|
||||
@ -191,6 +314,9 @@ WebNode::WebNode() :
|
||||
// same for this
|
||||
_settings = nullptr;
|
||||
|
||||
_routing_enabled = true;
|
||||
_index_node = nullptr;
|
||||
|
||||
create_validators();
|
||||
}
|
||||
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include "core/nodes/node.h"
|
||||
#include "core/reference.h"
|
||||
#include "core/variant.h"
|
||||
#include <map>
|
||||
|
||||
class Request;
|
||||
class Settings;
|
||||
@ -28,6 +29,9 @@ public:
|
||||
Settings *get_settings();
|
||||
void set_settings(Settings *settings);
|
||||
|
||||
bool get_routing_enabled();
|
||||
void set_routing_enabled(const bool value);
|
||||
|
||||
#ifdef DATABASES_ENABLED
|
||||
Database *get_database();
|
||||
Ref<TableBuilder> get_table_builder();
|
||||
@ -51,10 +55,17 @@ public:
|
||||
virtual void migrate(const bool clear, const bool seed);
|
||||
virtual void _migrate(const bool clear, const bool seed);
|
||||
|
||||
bool try_route_request_to_children(Request *request);
|
||||
WebNode *get_request_handler_child(Request *request);
|
||||
void build_handler_map();
|
||||
void clear_handlers();
|
||||
|
||||
WebServer *get_server();
|
||||
WebNode *get_root();
|
||||
WebNode *get_parent_webnode();
|
||||
|
||||
void _notification(const int what);
|
||||
|
||||
WebNode();
|
||||
~WebNode();
|
||||
|
||||
@ -66,6 +77,10 @@ protected:
|
||||
#ifdef DATABASES_ENABLED
|
||||
Database *_database;
|
||||
#endif
|
||||
|
||||
bool _routing_enabled;
|
||||
WebNode *_index_node;
|
||||
std::map<String, WebNode *> _node_route_map;
|
||||
};
|
||||
|
||||
#endif
|
@ -78,7 +78,7 @@ void WebRoot::handle_request_main(Request *request) {
|
||||
}
|
||||
|
||||
// normal routing
|
||||
WebRouterNode::handle_request_main(request);
|
||||
WebNode::handle_request_main(request);
|
||||
}
|
||||
|
||||
void WebRoot::handle_error_send_request(Request *request, const int error_code) {
|
||||
@ -157,7 +157,7 @@ void WebRoot::update() {
|
||||
}
|
||||
|
||||
WebRoot::WebRoot() :
|
||||
WebRouterNode() {
|
||||
WebNode() {
|
||||
}
|
||||
|
||||
WebRoot::~WebRoot() {
|
||||
|
@ -7,7 +7,7 @@
|
||||
#include <map>
|
||||
#include "core/string.h"
|
||||
|
||||
#include "web_router_node.h"
|
||||
#include "web_node.h"
|
||||
|
||||
#include "middleware.h"
|
||||
|
||||
@ -15,8 +15,8 @@ class Request;
|
||||
|
||||
// TODO FileCache -> set up, for this webroot, don't use singleton
|
||||
|
||||
class WebRoot : public WebRouterNode {
|
||||
RCPP_OBJECT(WebRoot, WebRouterNode);
|
||||
class WebRoot : public WebNode {
|
||||
RCPP_OBJECT(WebRoot, WebNode);
|
||||
|
||||
public:
|
||||
static String default_error_404_body;
|
||||
|
@ -1,112 +0,0 @@
|
||||
|
||||
#include "web_router_node.h"
|
||||
|
||||
#include "request.h"
|
||||
|
||||
void WebRouterNode::handle_request_main(Request *request) {
|
||||
if (!try_route_request_to_children(request)) {
|
||||
_handle_request_main(request);
|
||||
}
|
||||
}
|
||||
|
||||
bool WebRouterNode::try_route_request_to_children(Request *request) {
|
||||
WebNode *handler = nullptr;
|
||||
|
||||
// if (path == "/") {
|
||||
if (request->get_path_segment_count() == 0) {
|
||||
// quick shortcut
|
||||
handler = _index_node;
|
||||
} else {
|
||||
const String &main_route = request->get_current_path_segment();
|
||||
|
||||
handler = _node_route_map[main_route];
|
||||
|
||||
request->push_path();
|
||||
}
|
||||
|
||||
if (!handler) {
|
||||
return false;
|
||||
}
|
||||
|
||||
handler->handle_request_main(request);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
WebNode *WebRouterNode::get_request_handler_child(Request *request) {
|
||||
WebNode *handler = nullptr;
|
||||
|
||||
// if (path == "/") {
|
||||
if (request->get_path_segment_count() == 0) {
|
||||
// quick shortcut
|
||||
handler = _index_node;
|
||||
} else {
|
||||
const String &main_route = request->get_current_path_segment();
|
||||
handler = _node_route_map[main_route];
|
||||
|
||||
request->push_path();
|
||||
}
|
||||
|
||||
return handler;
|
||||
}
|
||||
|
||||
void WebRouterNode::build_handler_map() {
|
||||
_index_node = nullptr;
|
||||
_node_route_map.clear();
|
||||
|
||||
for (int i = 0; i < get_child_count(); ++i) {
|
||||
WebNode *c = Object::cast_to<WebNode>(get_child(i));
|
||||
|
||||
if (!c) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String uri_segment = c->get_uri_segment();
|
||||
|
||||
if (uri_segment == "") {
|
||||
// ignore
|
||||
continue;
|
||||
} else if (uri_segment == "/") {
|
||||
if (_index_node) {
|
||||
RLOG_ERR("You have multiple root nodes!");
|
||||
continue;
|
||||
}
|
||||
|
||||
_index_node = c;
|
||||
} else {
|
||||
if (_node_route_map[uri_segment]) {
|
||||
RLOG_ERR("You have multiple of the same uri! URI:" + uri_segment);
|
||||
continue;
|
||||
}
|
||||
|
||||
_node_route_map[uri_segment] = c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WebRouterNode::_notification(const int what) {
|
||||
switch (what) {
|
||||
case NOTIFICATION_ENTER_TREE:
|
||||
build_handler_map();
|
||||
break;
|
||||
case NOTIFICATION_CHILD_ADDED:
|
||||
if (is_in_tree()) {
|
||||
build_handler_map();
|
||||
}
|
||||
break;
|
||||
case NOTIFICATION_CHILD_REMOVED:
|
||||
if (is_in_tree()) {
|
||||
build_handler_map();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
WebRouterNode::WebRouterNode() :
|
||||
WebNode() {
|
||||
}
|
||||
|
||||
WebRouterNode::~WebRouterNode() {
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
#ifndef WEB_ROUTER_NODE_H
|
||||
#define WEB_ROUTER_NODE_H
|
||||
|
||||
#include "web_node.h"
|
||||
|
||||
#include <map>
|
||||
#include "core/string.h"
|
||||
|
||||
class WebRouterNode : public WebNode {
|
||||
RCPP_OBJECT(WebRouterNode, WebNode);
|
||||
|
||||
public:
|
||||
void handle_request_main(Request *request);
|
||||
bool try_route_request_to_children(Request *request);
|
||||
WebNode *get_request_handler_child(Request *request);
|
||||
|
||||
void build_handler_map();
|
||||
|
||||
void _notification(const int what);
|
||||
|
||||
WebRouterNode();
|
||||
~WebRouterNode();
|
||||
|
||||
protected:
|
||||
WebNode *_index_node;
|
||||
std::map<String, WebNode *> _node_route_map;
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user