11 #include <restinio/request_handler.hpp> 12 #include <restinio/optional.hpp> 14 #include <restinio/path2regex/path2regex.hpp> 16 #include <restinio/router/std_regex_engine.hpp> 18 #include <restinio/utils/from_string.hpp> 19 #include <restinio/utils/percent_encoding.hpp> 54 class route_params_t
final 57 using named_parameters_container_t =
58 std::vector< std::pair< string_view_t, string_view_t > >;
59 using indexed_parameters_container_t =
60 std::vector< string_view_t >;
67 std::unique_ptr<
char[] > request_target,
68 std::shared_ptr< std::string > key_names_buffer,
70 named_parameters_container_t named_parameters,
71 indexed_parameters_container_t indexed_parameters )
73 m_request_target = std::move( request_target );
74 m_key_names_buffer = std::move( key_names_buffer );
75 m_match = std::move( match );
76 m_named_parameters = std::move( named_parameters );
77 m_indexed_parameters = std::move( indexed_parameters );
84 route_params_t &
operator = ( route_params_t && ) =
default;
87 route_params_t &
operator = (
const route_params_t & ) =
delete;
96 return find_named_parameter_with_check( key ).second;
101 has( string_view_t key )
const noexcept 103 return m_named_parameters.end() != find_named_parameter( key );
111 const auto it = find_named_parameter( key );
113 return m_named_parameters.end() != it ?
114 optional_t< string_view_t >{ it->second } :
115 optional_t< string_view_t >{ nullopt };
122 if( i >= m_indexed_parameters.size() )
123 throw exception_t{ fmt::format(
"invalid parameter index: {}", i ) };
125 return m_indexed_parameters.at( i );
140 m_named_parameters.begin(),
141 m_named_parameters.end(),
143 return key == p.first;
150 auto it = find_named_parameter( key );
152 if( m_named_parameters.end() == it )
155 "invalid parameter name: {}",
156 std::string{ key.data(), key.size() } ) };
202 std::unique_ptr<
char[] > request_target,
203 std::shared_ptr< std::string > key_names_buffer,
204 string_view_t match_,
205 route_params_t::named_parameters_container_t named_parameters,
206 route_params_t::indexed_parameters_container_t indexed_parameters )
209 std::move( request_target ),
210 std::move( key_names_buffer ),
212 std::move( named_parameters ),
213 std::move( indexed_parameters ) );
221 return rp.m_named_parameters;
227 return rp.m_indexed_parameters;
241 route_params_t::named_parameters_container_t & named_parameters,
242 route_params_t::indexed_parameters_container_t & indexed_parameters )
255 m_named_parameters.emplace_back( key, value );
261 m_indexed_parameters.emplace_back( value );
281 using regex_t =
typename Regex_Engine::compiled_regex_t;
282 using match_results_t =
typename Regex_Engine::match_results_t;
286 http_method_id_t method,
288 std::shared_ptr< std::string > named_params_buffer,
289 param_appender_sequence_t param_appender_sequence )
302 string_view_t target_path,
303 route_params_t & parameters )
const 369 const http_request_header_t & h,
370 route_params_t & parameters )
const 421 http_method_id_t method,
422 matcher_init_data_t matcher_data,
423 express_request_handler_t handler )
442 http_method_id_t method,
443 string_view_t route_path,
444 const path2regex::options_t & options,
445 express_request_handler_t handler )
455 http_method_id_t method,
456 string_view_t route_path,
457 express_request_handler_t handler )
468 match(
const http_request_header_t & h, route_params_t & params )
const 550 http_method_id_t method,
551 string_view_t route_path,
552 express_request_handler_t handler )
563 http_method_id_t method,
564 string_view_t route_path,
565 const path2regex::options_t & options,
566 express_request_handler_t handler )
573 string_view_t route_path,
574 express_request_handler_t handler )
584 string_view_t route_path,
585 const path2regex::options_t & options,
586 express_request_handler_t handler )
597 string_view_t route_path,
598 express_request_handler_t handler )
608 string_view_t route_path,
609 const path2regex::options_t & options,
610 express_request_handler_t handler )
621 string_view_t route_path,
622 express_request_handler_t handler )
632 string_view_t route_path,
633 const path2regex::options_t & options,
634 express_request_handler_t handler )
645 string_view_t route_path,
646 express_request_handler_t handler )
656 string_view_t route_path,
657 const path2regex::options_t & options,
658 express_request_handler_t handler )
669 string_view_t route_path,
670 express_request_handler_t handler )
680 string_view_t route_path,
681 const path2regex::options_t & options,
682 express_request_handler_t handler )
712 template <
typename Value_Type >
714 get(
const router::route_params_t & params, string_view_t key )
720 template <
typename Value_Type >
722 get(
const router::route_params_t & params, std::size_t index )
impl::route_matcher_t< Regex_Engine > m_matcher
void non_matched_request_handler(non_matched_request_handler_t nmrh)
Set handler for requests that don't match any route.
void http_get(string_view_t route_path, express_request_handler_t handler)
route_matcher_t()=default
bool operator()(const http_request_header_t &h, route_params_t ¶meters) const
static const auto & indexed_parameters(const route_params_t &rp) noexcept
express_router_t()=default
express_route_entry_t & operator=(express_route_entry_t &&)=default
route_params_appender_t(route_params_t::named_parameters_container_t &named_parameters, route_params_t::indexed_parameters_container_t &indexed_parameters)
string_view_t operator[](std::size_t i) const
Get indexed parameter.
http_method_id_t m_method
HTTP method to match.
void add_indexed_param(string_view_t value)
route_matcher_t(route_matcher_t &&)=default
Route params private internals accessor.
route_params_t & operator=(route_params_t &&)=default
void http_post(string_view_t route_path, express_request_handler_t handler)
void http_head(string_view_t route_path, express_request_handler_t handler)
void http_delete(string_view_t route_path, const path2regex::options_t &options, express_request_handler_t handler)
express_route_entry_t()=default
void add_named_param(string_view_t key, string_view_t value)
route_matcher_t(http_method_id_t method, regex_t route_regex, std::shared_ptr< std::string > named_params_buffer, param_appender_sequence_t param_appender_sequence)
Creates matcher with a given parameters.
regex_t m_route_regex
Regex of a given route.
auto indexed_parameters_size() const noexcept
void http_put(string_view_t route_path, express_request_handler_t handler)
std::shared_ptr< std::string > m_named_params_buffer
Buffer for named parameters names string views.
void add_handler(http_method_id_t method, string_view_t route_path, const path2regex::options_t &options, express_request_handler_t handler)
auto named_parameters_size() const noexcept
Get number of parameters.
express_request_handler_t m_handler
std::vector< route_entry_t > m_handlers
A list of existing routes.
std::shared_ptr< std::string > m_key_names_buffer
Shared buffer for string_view of named parameterts names.
std::unique_ptr< char[] > m_request_target
A raw request target.
request_handling_status_t handle(request_handle_t rh, route_params_t rp) const
Calls a handler of given request with given params.
static const auto & named_parameters(const route_params_t &rp) noexcept
Get values containers for all parameters (used in unit tests).
named_parameters_container_t::const_reference find_named_parameter_with_check(string_view_t key) const
static void match(route_params_t &rp, std::unique_ptr< char[] > request_target, std::shared_ptr< std::string > key_names_buffer, string_view_t match_, route_params_t::named_parameters_container_t named_parameters, route_params_t::indexed_parameters_container_t indexed_parameters)
Init parameters with a matched route params.
express_router_t(express_router_t &&)=default
indexed_parameters_container_t m_indexed_parameters
Indexed params.
string_view_t m_match
Matched pattern.
void http_post(string_view_t route_path, const path2regex::options_t &options, express_request_handler_t handler)
A matcher for a given path.
route_params_t(route_params_t &&)=default
named_parameters_container_t m_named_parameters
Named params.
bool match(const http_request_header_t &h, route_params_t ¶ms) const
Checks if request header matches entry, and if so, set route params.
express_route_entry_t(http_method_id_t method, string_view_t route_path, const path2regex::options_t &options, express_request_handler_t handler)
A single express route entry.
Value_Type get(const router::route_params_t ¶ms, std::size_t index)
Cast indexed parameter value to a given type.
string_view_t match() const noexcept
Matched route.
route_params_t & operator=(const route_params_t &)=delete
express_route_entry_t(http_method_id_t method, string_view_t route_path, express_request_handler_t handler)
bool match_route(string_view_t target_path, route_params_t ¶meters) const
Try to match a given request target with this route.
route_params_appender_t & operator=(const route_params_appender_t &)=delete
express_route_entry_t(const express_route_entry_t &)=delete
request_handling_status_t try_to_handle(request_handle_t rh) const
Try to match the entry and calls a handler with extracted params.
route_params_t::named_parameters_container_t & m_named_parameters
route_params_appender_t & operator=(route_params_appender_t &&)=delete
route_params_appender_t(const route_params_appender_t &)=delete
express_route_entry_t & operator=(const express_route_entry_t &)=delete
param_appender_sequence_t m_param_appender_sequence
Parameters values.
void http_head(string_view_t route_path, const path2regex::options_t &options, express_request_handler_t handler)
bool has(string_view_t key) const noexcept
Check parameter.
named_parameters_container_t::const_iterator find_named_parameter(string_view_t key) const noexcept
void http_delete(string_view_t route_path, express_request_handler_t handler)
void match(std::unique_ptr< char[] > request_target, std::shared_ptr< std::string > key_names_buffer, string_view_t match, named_parameters_container_t named_parameters, indexed_parameters_container_t indexed_parameters)
void http_get(string_view_t route_path, const path2regex::options_t &options, express_request_handler_t handler)
Helper class for gthering parameters from route.
optional_t< string_view_t > get_param(string_view_t key) const noexcept
Get the value of a parameter if it exists.
void add_handler(http_method_id_t method, string_view_t route_path, express_request_handler_t handler)
Add handlers.
non_matched_request_handler_t m_non_matched_request_handler
Handler that is called for requests that don't match any route.
request_handling_status_t operator()(request_handle_t req) const
route_params_appender_t(route_params_appender_t &&)=delete
void http_put(string_view_t route_path, const path2regex::options_t &options, express_request_handler_t handler)
route_params_t(const route_params_t &)=delete
express_route_entry_t(express_route_entry_t &&)=default
route_params_t::indexed_parameters_container_t & m_indexed_parameters
std::enable_if< std::is_same< Parameter_Container, query_string_params_t >::value||std::is_same< Parameter_Container, router::route_params_t >::value, optional_t< Value_Type > >::type opt_value(const Parameter_Container ¶ms, string_view_t key)
Gets the value of a parameter specified by key wrapped in optional_t<Value_Type> if parameter exists ...