4using namespace std::placeholders;
15#include <absl/hash/hash.h>
16#include <absl/container/flat_hash_map.h>
36 asio::ip::tcp::socket &,
38 std::vector<RouteArg>,
40 std::chrono::steady_clock::time_point &)>;
60 virtual ~Base() =
default;
63 template<
typename... Args>
64 struct Wrapper :
public Base
66 Wrapper(std::function<asio::awaitable<http::Response>(Args...)> func)
67 : function(std::move(func))
70 std::function<asio::awaitable<http::Response>(Args...)> function;
75 template<
typename... Args>
78 _base(std::make_unique<Wrapper<Args...>>(std::move(func)))
83 _streaming(std::move(func))
90 template<
typename... Args>
91 asio::awaitable<http::Response>
operator()(Args && ... args)
const
93 Wrapper<Args...>* wrapper_ptr =
dynamic_cast<Wrapper<Args...
>*>(_base.get());
97 co_return co_await wrapper_ptr->function(std::forward<Args>(args)...);
101 throw std::runtime_error(
"Invalid arguments to function object call!");
106 asio::ip::tcp::socket & sock,
108 std::vector<RouteArg> route_args,
110 std::chrono::steady_clock::time_point & deadline)
const
114 throw std::runtime_error(
"RouteHandlerFunc::invokeStreaming called on non-streaming handler");
116 co_await _streaming(sock, request, std::move(route_args), std::move(query_args), deadline);
121 std::unique_ptr<Base> _base;
143 const std::string & module_path,
144 const std::vector<std::string> & request_path_info_segments,
145 const absl::flat_hash_map<std::string, std::string> request_query_segments)
const;
148 absl::flat_hash_map<RouteKey, RouteHandlerFunc> _routes;
A class representing a route handler function.
Definition route.hpp:48
asio::awaitable< http::Response > operator()(Args &&... args) const
Definition route.hpp:91
Kind
Definition route.hpp:51
RouteHandlerFunc(std::function< asio::awaitable< http::Response >(Args...)> func)
Definition route.hpp:76
RouteHandlerFunc(StreamingHandlerDefinition func)
Definition route.hpp:81
Kind kind() const
Definition route.hpp:88
asio::awaitable< void > invokeStreaming(asio::ip::tcp::socket &sock, const http::Request &request, std::vector< RouteArg > route_args, QueryArgsList query_args, std::chrono::steady_clock::time_point &deadline) const
Definition route.hpp:105
RouteHandlerFunc(RouteHandlerFunc &&other)=default
A class representing a route key, which is a combination of a HTTP method and a URL.
Definition route_key.hpp:20
A class representing a router for handling HTTP requests.
Definition route.hpp:131
std::tuple< bool, std::vector< RouteArg >, QueryArgsList > doesRouteMatch(const RouteKey &route, const http::Method &request_method, const std::string &module_path, const std::vector< std::string > &request_path_info_segments, const absl::flat_hash_map< std::string, std::string > request_query_segments) const
Definition route.cpp:5
void addRoute(RouteKey route, RouteHandlerFunc handler)
Definition route.cpp:153
std::tuple< const RouteHandlerFunc *, std::vector< RouteArg >, QueryArgsList > findRoute(const http::Request &request) const
Definition route.cpp:122
Method
Enum to represent the request method.
Definition http_method.hpp:31
std::function< asio::awaitable< void >(asio::ip::tcp::socket &, const dcn::http::Request &, std::vector< RouteArg >, QueryArgsList, std::chrono::steady_clock::time_point &)> StreamingHandlerDefinition
Streaming handler signature.
Definition route.hpp:40
absl::flat_hash_map< std::string, RouteArg > QueryArgsList
Definition route.hpp:25