Orbit Framework
An ultra-modern, asynchronous, cross-platform C++ Web Framework.
Loading...
Searching...
No Matches
Router.hpp
Go to the documentation of this file.
1#pragma once
7#include <functional>
8#include <unordered_map>
9#include <unordered_set>
10#include <vector>
11#include <string>
12#include <memory>
13
14namespace routing {
15
16using RouteHandler = std::function<void(http::HttpRequest&, std::shared_ptr<http::ResponseWriter>)>;
17using Middleware = std::function<bool(http::HttpRequest&, std::shared_ptr<http::ResponseWriter>)>;
18using WsHandler = std::function<void(http::websocket::WebSocketConnection&)>;
19using ErrorHandler = std::function<void(const std::exception&, http::HttpRequest&, std::shared_ptr<http::ResponseWriter>)>;
20
26
30class Router {
31public:
37 Router(const std::string& prefix = "", Router* parent = nullptr)
38 : prefix_(prefix), parent_(parent) {}
39
44 public:
45 RouteBuilder(Router& router, http::HttpMethod method, const std::string& path, std::vector<Middleware> mws = {})
46 : router_(router), method_(method), path_(path), mws_(std::move(mws)) {}
47
48 RouteBuilder& summary(const std::string& s) { meta_.summary = s; return *this; }
49 RouteBuilder& description(const std::string& s) { meta_.description = s; return *this; }
50 RouteBuilder& tag(const std::string& t) { meta_.tags.push_back(t); return *this; }
51 RouteBuilder& req_body(const std::string& schema_name) { meta_.request_body_schema = schema_name; return *this; }
52 RouteBuilder& res_body(int status, const std::string& schema_name) { meta_.response_schemas[status] = schema_name; return *this; }
53
54 void handler(RouteHandler h);
55 private:
56 Router& router_;
57 http::HttpMethod method_;
58 std::string path_;
59 std::vector<Middleware> mws_;
61 };
62
75 RouteBuilder route(const std::string& path, http::HttpMethod method = http::HttpMethod::GET) {
76 return RouteBuilder(*this, method, path);
77 }
78
79 // Route Grouping
85 void group(const std::string& prefix, std::function<void(Router&)> callback);
86
87 // Register a handler for a specific HTTP method and path
88 void add_route(http::HttpMethod method, const std::string& path, RouteHandler handler);
89 void add_route(http::HttpMethod method, const std::string& path, std::vector<Middleware> mws, RouteHandler handler);
90 void add_route_with_meta(http::HttpMethod method, const std::string& path, std::vector<Middleware> mws, const openapi::RouteMetadata& meta, RouteHandler handler);
91
92 // Fluent routing API
93 Router& get(const std::string& path, RouteHandler handler);
94 Router& get(const std::string& path, std::vector<Middleware> mws, RouteHandler handler);
95
96 Router& post(const std::string& path, RouteHandler handler);
97 Router& post(const std::string& path, std::vector<Middleware> mws, RouteHandler handler);
98
99 Router& put(const std::string& path, RouteHandler handler);
100 Router& put(const std::string& path, std::vector<Middleware> mws, RouteHandler handler);
101
102 Router& patch(const std::string& path, RouteHandler handler);
103 Router& patch(const std::string& path, std::vector<Middleware> mws, RouteHandler handler);
104
105 Router& del(const std::string& path, RouteHandler handler);
106 Router& del(const std::string& path, std::vector<Middleware> mws, RouteHandler handler);
107
108 Router& options(const std::string& path, RouteHandler handler);
109 Router& options(const std::string& path, std::vector<Middleware> mws, RouteHandler handler);
110
111 void ws(const std::string& path, WsHandler handler);
112 void use(Middleware m);
113
114 // Register global error handler
115 void on_error(ErrorHandler handler);
116
117 // Route an incoming request to the correct handler
118 void route(http::HttpRequest& request, std::shared_ptr<http::ResponseWriter> response_writer) const;
119
120 bool has_ws_route(const std::string& path) const;
121 WsHandler get_ws_route(const std::string& path) const;
122
123 // Check if a given path is registered as a streaming route
124 bool is_stream_route(http::HttpMethod method, const std::string& path) const;
125 void add_stream_route(http::HttpMethod method, const std::string& path, RouteHandler handler);
126
127private:
128
129 std::string make_route_key(http::HttpMethod method, std::string_view path) const;
130 std::vector<std::string> split_path(std::string_view path) const;
131
132 std::string prefix_;
133 Router* parent_{nullptr};
134 std::vector<Middleware> local_middlewares_;
135 ErrorHandler error_handler_;
136
137 std::unordered_map<std::string, RouteHandler> routes_;
138 std::unordered_map<std::string, WsHandler> ws_routes_;
139 std::vector<DynamicRoute> dynamic_routes_;
140 std::vector<Middleware> middlewares_;
141
142 std::unordered_set<std::string> stream_routes_;
143 std::vector<DynamicRoute> dynamic_stream_routes_;
144};
145
146} // namespace routing
Represents an active WebSocket connection.
Definition WebSocketConnection.hpp:56
A builder class for fluent route configuration.
Definition Router.hpp:43
RouteBuilder & description(const std::string &s)
Definition Router.hpp:49
void handler(RouteHandler h)
Definition Router.cpp:314
RouteBuilder & res_body(int status, const std::string &schema_name)
Definition Router.hpp:52
RouteBuilder(Router &router, http::HttpMethod method, const std::string &path, std::vector< Middleware > mws={})
Definition Router.hpp:45
RouteBuilder & summary(const std::string &s)
Definition Router.hpp:48
RouteBuilder & req_body(const std::string &schema_name)
Definition Router.hpp:51
RouteBuilder & tag(const std::string &t)
Definition Router.hpp:50
Manages routing of HTTP requests to their appropriate handlers.
Definition Router.hpp:30
bool has_ws_route(const std::string &path) const
Definition Router.cpp:36
void ws(const std::string &path, WsHandler handler)
Definition Router.cpp:214
void use(Middleware m)
Definition Router.cpp:223
Router & get(const std::string &path, RouteHandler handler)
Definition Router.cpp:102
void add_route(http::HttpMethod method, const std::string &path, RouteHandler handler)
Definition Router.cpp:98
Router & patch(const std::string &path, RouteHandler handler)
Definition Router.cpp:132
void on_error(ErrorHandler handler)
Definition Router.cpp:231
bool is_stream_route(http::HttpMethod method, const std::string &path) const
Definition Router.cpp:184
Router & del(const std::string &path, RouteHandler handler)
Definition Router.cpp:142
WsHandler get_ws_route(const std::string &path) const
Definition Router.cpp:40
RouteBuilder route(const std::string &path, http::HttpMethod method=http::HttpMethod::GET)
Initiates a route builder for a specific path and method.
Definition Router.hpp:75
Router & options(const std::string &path, RouteHandler handler)
Definition Router.cpp:152
Router & put(const std::string &path, RouteHandler handler)
Definition Router.cpp:122
Router(const std::string &prefix="", Router *parent=nullptr)
Constructs a new Router.
Definition Router.hpp:37
void add_route_with_meta(http::HttpMethod method, const std::string &path, std::vector< Middleware > mws, const openapi::RouteMetadata &meta, RouteHandler handler)
Definition Router.cpp:58
void add_stream_route(http::HttpMethod method, const std::string &path, RouteHandler handler)
Definition Router.cpp:162
void group(const std::string &prefix, std::function< void(Router &)> callback)
Creates a route group with a specific prefix.
Definition Router.cpp:48
Router & post(const std::string &path, RouteHandler handler)
Definition Router.cpp:112
HttpMethod
Represents standard HTTP methods.
Definition HttpRequest.hpp:17
Definition HandlerWrapper.hpp:12
std::function< bool(http::HttpRequest &, std::shared_ptr< http::ResponseWriter >)> Middleware
Definition Router.hpp:17
std::function< void(const std::exception &, http::HttpRequest &, std::shared_ptr< http::ResponseWriter >)> ErrorHandler
Definition Router.hpp:19
std::function< void(http::HttpRequest &, std::shared_ptr< http::ResponseWriter >)> RouteHandler
Definition Router.hpp:16
std::function< void(http::websocket::WebSocketConnection &)> WsHandler
Definition Router.hpp:18
Definition json.hpp:5363
Represents an incoming HTTP request.
Definition HttpRequest.hpp:22
Definition OpenApi.hpp:10
std::string summary
Definition OpenApi.hpp:11
std::vector< std::string > tags
Definition OpenApi.hpp:13
std::string request_body_schema
Definition OpenApi.hpp:14
std::string description
Definition OpenApi.hpp:12
std::unordered_map< int, std::string > response_schemas
Definition OpenApi.hpp:15
Definition Router.hpp:21
RouteHandler handler
Definition Router.hpp:24
http::HttpMethod method
Definition Router.hpp:22
std::vector< std::string > path_segments
Definition Router.hpp:23