31template <
typename Object >
35 return std::unique_ptr< Object >{};
38template <
typename Object >
42 return std::make_unique< Object >();
46template <
typename Object >
50 return std::shared_ptr< Object >{};
53template <
typename Object >
57 return std::make_shared< Object >();
67template <
typename Object>
71 typename std::is_default_constructible< Object >::type tag;
72 return details::create_default_unique_object_instance< Object >( tag );
80 return details::create_default_unique_object_instance< default_request_handler_t >(
89template <
typename Object>
93 typename std::is_default_constructible< Object >::type tag;
94 return details::create_default_shared_object_instance< Object >( tag );
102 return details::create_default_shared_object_instance< default_request_handler_t >(
111template <
typename Object >
131template <
typename Object >
152template <
typename Settings,
typename Socket >
192 template<
typename Option >
196 m_acceptor.set_option(
option );
199 template<
typename Option >
203 m_acceptor.set_option(
option,
ec );
206 template<
typename Option >
210 m_acceptor.get_option(
option );
213 template<
typename Option >
217 m_acceptor.get_option(
option,
ec );
231 return std::make_unique< acceptor_options_setter_t >(
233 options.set_option( asio_ns::ip::tcp::acceptor::reuse_address(
true ) );
252 asio_ns::basic_socket< asio_ns::ip::tcp > & socket )
258 template<
typename Option >
262 m_socket.set_option( option );
265 template<
typename Option >
267 set_option(
const Option & option, asio_ns::error_code & ec )
269 m_socket.set_option( option, ec );
272 template<
typename Option >
276 m_socket.get_option( option );
279 template<
typename Option >
283 m_socket.get_option( option, ec );
289 asio_ns::basic_socket< asio_ns::ip::tcp > &
m_socket;
298 return std::make_unique< socket_options_setter_t >( [](
auto & ){} );
321template<
typename Listener >
326 static constexpr bool has_actual_connection_state_listener =
true;
335 if( !m_connection_state_listener )
336 throw exception_t{
"connection state listener is not specified" };
351 static constexpr bool has_actual_connection_state_listener =
false;
372template<
typename Ip_Blocker >
376 noexcept( std::declval<Ip_Blocker>().inspect(
377 std::declval<ip_blocker::incoming_info_t>() ) ),
378 "Ip_Blocker::inspect() method should be noexcept" );
383 decltype(std::declval<Ip_Blocker>().inspect(
384 std::declval<ip_blocker::incoming_info_t>())) >::value,
385 "Ip_Blocker::inspect() should return "
386 "restinio::ip_blocker::inspection_result_t" );
390 static constexpr bool has_actual_ip_blocker =
true;
400 throw exception_t{
"IP-blocker is not specified" };
415 static constexpr bool has_actual_ip_blocker =
false;
434 void(asio_ns::ip::tcp::acceptor &) >;
462 asio_ns::ip::address >;
479template<
typename Count_Limiter >
482 static constexpr bool has_actual_max_parallel_connections =
true;
489 std::size_t m_max_parallel_connections{
490 std::numeric_limits<std::size_t>::max()
496 return m_max_parallel_connections;
502 m_max_parallel_connections = v;
521 static constexpr bool has_actual_max_parallel_connections =
false;
526 return std::numeric_limits<std::size_t>::max();
547template<
typename Derived,
typename Traits>
551 typename Traits::connection_state_listener_t >
554 typename connection_count_limit_types<Traits>::limiter_t >
557 Derived,
typename Traits::stream_socket_t>;
564 typename Traits::connection_state_listener_t
565 >::has_actual_connection_state_listener;
568 typename Traits::ip_blocker_t
569 >::has_actual_ip_blocker;
571 using max_parallel_connections_holder_base_t::has_actual_max_parallel_connections;
575 std::uint16_t port = 8080,
576 asio_ns::ip::tcp protocol = asio_ns::ip::tcp::v4() )
579 , m_protocol{ protocol }
588 return reference_to_derived();
594 return std::move( this->port( p ) );
608 return reference_to_derived();
614 return std::move( this->protocol( p ) );
644 m_address = std::move(addr);
645 return reference_to_derived();
664 return std::move( this->address( std::move( addr ) ) );
690 return reference_to_derived();
711 return std::move( this->address( addr ) );
732 return reference_to_derived();
738 return std::move( this->buffer_size( s ) );
744 return m_buffer_size;
758 m_read_next_http_message_timelimit = std::move( d );
759 return reference_to_derived();
765 return std::move( this->read_next_http_message_timelimit( std::move( d ) ) );
768 std::chrono::steady_clock::duration
771 return m_read_next_http_message_timelimit;
780 m_write_http_response_timelimit = std::move( d );
781 return reference_to_derived();
787 return std::move( this->write_http_response_timelimit( std::move( d ) ) );
790 std::chrono::steady_clock::duration
793 return m_write_http_response_timelimit;
802 m_handle_request_timeout = std::move( d );
803 return reference_to_derived();
809 return std::move( this->handle_request_timeout( std::move( d ) ) );
812 std::chrono::steady_clock::duration
815 return m_handle_request_timeout;
824 m_max_pipelined_requests = mpr;
825 return reference_to_derived();
831 return std::move( this->max_pipelined_requests( mpr ) );
837 return m_max_pipelined_requests;
849 m_request_handler = std::move( handler );
850 return reference_to_derived();
853 template<
typename... Params >
857 return set_unique_instance(
859 std::forward< Params >( params )... );
863 template<
typename... Params >
867 return std::move( this->request_handler( std::forward< Params >( params )... ) );
870 std::unique_ptr< request_handler_t >
874 std::move( m_request_handler ),
875 "request handler must be set" );
916 template<
typename... Params >
920 return set_unique_instance(
922 std::forward< Params >( params )... );
932 template<
typename... Params >
936 return std::move( this->timer_manager( std::forward< Params >( params )... ) );
939 std::unique_ptr< timer_factory_t >
943 std::move( m_timer_factory ),
944 "timer manager is not set" );
952 template<
typename... Params >
956 return set_unique_instance(
958 std::forward< Params >( params )... );
961 template<
typename... Params >
965 return std::move( this->logger( std::forward< Params >( params )... ) );
968 std::unique_ptr< logger_t >
972 std::move( m_logger ),
973 "logger must be set" );
983 throw exception_t{
"acceptor options setter cannot be empty" };
985 return set_unique_instance(
986 m_acceptor_options_setter,
993 return std::move( this->acceptor_options_setter( std::move( aos ) ) );
996 std::unique_ptr< acceptor_options_setter_t >
1000 std::move( m_acceptor_options_setter ),
1001 "acceptor options setter must be set" );
1011 throw exception_t{
"socket options setter cannot be empty" };
1013 return set_unique_instance(
1014 m_socket_options_setter,
1021 return std::move( this->socket_options_setter( std::move( sos ) ) );
1024 std::unique_ptr< socket_options_setter_t >
1028 std::move( m_socket_options_setter ),
1029 "socket options setter must be set" );
1042 if( 0 == n || 1024 < n )
1046 "invalid value for number of cuncurrent connects: {}" ),
1049 m_concurrent_accepts_count = n;
1050 return reference_to_derived();
1056 return std::move( this->concurrent_accepts_count( n ) );
1062 return m_concurrent_accepts_count;
1079 m_separate_accept_and_create_connect = do_separate;
1080 return reference_to_derived();
1086 return std::move( this->separate_accept_and_create_connect( do_separate ) );
1092 return m_separate_accept_and_create_connect;
1098 template<
typename Func >
1102 m_cleanup_functor = std::move(func);
1103 return reference_to_derived();
1106 template<
typename Func >
1110 return std::move(this->cleanup_func( std::forward<Func>(func) ));
1123 return std::move(m_cleanup_functor);
1159 std::shared_ptr< typename Traits::connection_state_listener_t > listener ) &
1162 has_actual_connection_state_listener,
1163 "connection_state_listener(listener) can't be used "
1164 "for the default connection_state::noop_listener_t" );
1166 this->m_connection_state_listener = std::move(listener);
1167 return reference_to_derived();
1203 std::shared_ptr< typename Traits::connection_state_listener_t > listener ) &&
1205 return std::move(this->connection_state_listener(
1206 std::move(listener)));
1217 const std::shared_ptr< typename Traits::connection_state_listener_t > &
1221 has_actual_connection_state_listener,
1222 "connection_state_listener() can't be used "
1223 "for the default connection_state::noop_listener_t" );
1225 return this->m_connection_state_listener;
1240 this->check_valid_connection_state_listener_pointer();
1276 std::shared_ptr< typename Traits::ip_blocker_t > blocker ) &
1279 basic_server_settings_t::has_actual_ip_blocker,
1280 "ip_blocker(blocker) can't be used "
1281 "for the default ip_blocker::noop_ip_blocker_t" );
1283 this->m_ip_blocker = std::move(blocker);
1284 return reference_to_derived();
1321 std::shared_ptr< typename Traits::ip_blocker_t > blocker ) &&
1323 return std::move(this->ip_blocker(std::move(blocker)));
1334 const std::shared_ptr< typename Traits::ip_blocker_t > &
1338 basic_server_settings_t::has_actual_ip_blocker,
1339 "ip_blocker() can't be used "
1340 "for the default ip_blocker::noop_ip_blocker_t" );
1342 return this->m_ip_blocker;
1356 this->check_valid_ip_blocker_pointer();
1387 throw exception_t{
"acceptor_post_bind_hook cannot be empty" };
1389 m_acceptor_post_bind_hook = std::move(hook);
1390 return reference_to_derived();
1415 return std::move(this->acceptor_post_bind_hook( std::move(hook) ));
1432 return std::move(m_acceptor_post_bind_hook);
1452 return m_incoming_http_msg_limits;
1481 m_incoming_http_msg_limits = limits;
1482 return reference_to_derived();
1511 return std::move(this->incoming_http_msg_limits(limits));
1542 basic_server_settings_t::has_actual_max_parallel_connections,
1543 "max_parallel_connections(value) can't be used "
1544 "for the noop_connection_count_limiter_t" );
1546 this->set_max_parallel_connections( value );
1547 return reference_to_derived();
1576 return std::move(this->max_parallel_connections( value ));
1579 using max_parallel_connections_holder_base_t::max_parallel_connections;
1633 this->m_extra_data_factory = std::move(factory);
1634 return reference_to_derived();
1673 return std::move(this->extra_data_factory( std::move(factory) ));
1681 extra_data_factory_handle_t
1685 std::move(this->m_extra_data_factory),
1686 "extra_data_factory is not set" );
1696 return static_cast<Derived &
>(*this);
1699 template<
typename Target,
typename... Params >
1704 std::make_unique< Target >(
1705 std::forward< Params >( params )... );
1707 return reference_to_derived();
1710 template<
typename Target,
typename... Params >
1715 std::make_shared< Target >(
1716 std::forward< Params >( params )... );
1718 return reference_to_derived();
1733 std::size_t m_buffer_size{ 4 * 1024 };
1737 std::chrono::steady_clock::duration
1738 m_read_next_http_message_timelimit{ std::chrono::seconds( 60 ) };
1740 std::chrono::steady_clock::duration
1741 m_write_http_response_timelimit{ std::chrono::seconds( 5 ) };
1743 std::chrono::steady_clock::duration
1744 m_handle_request_timeout{ std::chrono::seconds( 10 ) };
1748 std::size_t m_max_pipelined_requests{ 1 };
1769 [](asio_ns::ip::tcp::acceptor &) {}
1775 std::size_t m_concurrent_accepts_count{ 1 };
1778 bool m_separate_accept_and_create_connect{
false };
1803template<
typename Traits = default_traits_t>
1813template <
typename Traits,
typename Configurator >
An adapter for setting acceptor options before running server.
void set_option(const Option &option, asio_ns::error_code &ec)
void set_option(const Option &option)
API for setting/getting options.
void get_option(Option &option, asio_ns::error_code &ec)
void get_option(Option &option)
asio_ns::ip::tcp::acceptor & m_acceptor
acceptor_options_t(asio_ns::ip::tcp::acceptor &acceptor)
Basic container for http_server settings.
typename timer_manager_t::factory_t timer_factory_t
Short alias for type of a factory that creates instances of timer_manager.
const std::shared_ptr< typename Traits::ip_blocker_t > & ip_blocker() const noexcept
Get reference to IP-blocker.
std::unique_ptr< request_handler_t > m_request_handler
Request handler.
std::unique_ptr< acceptor_options_setter_t > m_acceptor_options_setter
Acceptor options setter.
std::size_t concurrent_accepts_count() const
std::unique_ptr< socket_options_setter_t > m_socket_options_setter
Socket options setter.
const details::address_variant_t & address() const
typename Traits::logger_t logger_t
Derived & port(std::uint16_t p) &
Server endpoint.
Derived && handle_request_timeout(std::chrono::steady_clock::duration d) &&
Derived & ip_blocker(std::shared_ptr< typename Traits::ip_blocker_t > blocker) &
Setter for IP-blocker.
Derived && concurrent_accepts_count(std::size_t n) &&
Derived & buffer_size(std::size_t s) &
Size of buffer for io operations.
Derived & concurrent_accepts_count(std::size_t n) &
Max number of running concurrent accepts.
Derived && separate_accept_and_create_connect(bool do_separate) &&noexcept
Derived && cleanup_func(Func &&func) &&
Derived & max_parallel_connections(std::size_t value) &noexcept
Setter for connection count limit.
std::unique_ptr< socket_options_setter_t > socket_options_setter()
Derived && extra_data_factory(extra_data_factory_handle_t factory) &&
Setter for extra-data-factory.
Derived & request_handler(Params &&... params) &
Derived && socket_options_setter(socket_options_setter_t sos) &&
void ensure_valid_connection_state_listener()
Internal method for checking presence of state listener object.
std::uint16_t m_port
Server endpoint.
Derived && logger(Params &&... params) &&
std::unique_ptr< logger_t > m_logger
Logger.
Derived && max_parallel_connections(std::size_t value) &&noexcept
Setter for connection count limit.
Derived && timer_manager(Params &&... params) &&
Creates a factory object that will be used for creation of an actual timer_manager instance.
Derived & write_http_response_timelimit(std::chrono::steady_clock::duration d) &
A period of time wait for response to be written to socket.
std::shared_ptr< extra_data_factory_t > extra_data_factory_handle_t
Type of shared-pointer to extra-data-factory.
extra_data_factory_handle_t m_extra_data_factory
User-data-factory for server.
Derived & cleanup_func(Func &&func) &
std::unique_ptr< request_handler_t > request_handler()
Derived && acceptor_options_setter(acceptor_options_setter_t aos) &&
std::uint16_t port() const
Derived && connection_state_listener(std::shared_ptr< typename Traits::connection_state_listener_t > listener) &&
Setter for connection state listener.
Derived & protocol(asio_ns::ip::tcp p) &
Derived & request_handler(std::unique_ptr< request_handler_t > handler) &
basic_server_settings_t(std::uint16_t port=8080, asio_ns::ip::tcp protocol=asio_ns::ip::tcp::v4())
Derived && read_next_http_message_timelimit(std::chrono::steady_clock::duration d) &&
Derived & incoming_http_msg_limits(const incoming_http_msg_limits_t &limits) &noexcept
Setter of optional limits for incoming HTTP messages.
asio_ns::ip::tcp m_protocol
Derived && ip_blocker(std::shared_ptr< typename Traits::ip_blocker_t > blocker) &&
Setter for IP-blocker.
Derived && max_pipelined_requests(std::size_t mpr) &&
extra_data_factory_handle_t giveaway_extra_data_factory() const noexcept
Extractor for extra-data-factory.
incoming_http_msg_limits_t m_incoming_http_msg_limits
Limits for incoming HTTP messages.
std::size_t buffer_size() const
asio_ns::ip::tcp protocol() const
Derived & handle_request_timeout(std::chrono::steady_clock::duration d) &
A period of time that is given for a handler to create response.
Derived & reference_to_derived()
std::unique_ptr< timer_factory_t > m_timer_factory
Timers factory.
Derived & timer_manager(Params &&... params) &
Creates a factory object that will be used for creation of an actual timer_manager instance.
Derived && request_handler(Params &&... params) &&
Derived && address(std::string addr) &&
std::chrono::steady_clock::duration handle_request_timeout() const
Derived & logger(Params &&... params) &
std::unique_ptr< acceptor_options_setter_t > acceptor_options_setter()
Derived & address(asio_ns::ip::address addr) &
void ensure_valid_ip_blocker()
Internal method for checking presence of IP-blocker object.
Derived & acceptor_options_setter(acceptor_options_setter_t aos) &
Derived & extra_data_factory(extra_data_factory_handle_t factory) &
Setter for extra-data-factory.
Derived && write_http_response_timelimit(std::chrono::steady_clock::duration d) &&
std::chrono::steady_clock::duration read_next_http_message_timelimit() const
Derived & max_pipelined_requests(std::size_t mpr) &
Max pipelined requests able to receive on single connection.
Derived & set_unique_instance(std::unique_ptr< Target > &t, Params &&... params)
typename Traits::timer_manager_t timer_manager_t
Short alias for timer_manager type.
acceptor_post_bind_hook_t giveaway_acceptor_post_bind_hook()
A getter for post-bind callback.
typename Traits::extra_data_factory_t extra_data_factory_t
The actual type of extra-data-factory.
Derived & set_shared_instance(std::shared_ptr< Target > &t, Params &&... params)
const std::shared_ptr< typename Traits::connection_state_listener_t > & connection_state_listener() const noexcept
Get reference to connection state listener.
std::size_t max_pipelined_requests() const
Derived && acceptor_post_bind_hook(acceptor_post_bind_hook_t hook) &&
A setter for post-bind callback.
cleanup_functor_t m_cleanup_functor
Optional cleanup functor.
Derived && port(std::uint16_t p) &&
std::unique_ptr< timer_factory_t > timer_factory()
Derived && address(asio_ns::ip::address addr) &&
Derived & socket_options_setter(socket_options_setter_t sos) &
Derived & acceptor_post_bind_hook(acceptor_post_bind_hook_t hook) &
A setter for post-bind callback.
Derived && incoming_http_msg_limits(const incoming_http_msg_limits_t &limits) &&noexcept
Setter of optional limits for incoming HTTP messages.
std::chrono::steady_clock::duration write_http_response_timelimit() const
details::address_variant_t m_address
request_handler_type_from_traits_t< Traits > request_handler_t
Request handler.
Derived && buffer_size(std::size_t s) &&
Derived & separate_accept_and_create_connect(bool do_separate) &noexcept
Do separate an accept operation and connection instantiation.
Derived & read_next_http_message_timelimit(std::chrono::steady_clock::duration d) &
}
const incoming_http_msg_limits_t & incoming_http_msg_limits() const noexcept
Getter of optional limits for incoming HTTP messages.
Derived & address(std::string addr) &
cleanup_functor_t giveaway_cleanup_func()
Derived & connection_state_listener(std::shared_ptr< typename Traits::connection_state_listener_t > listener) &
Setter for connection state listener.
Derived && protocol(asio_ns::ip::tcp p) &&
bool separate_accept_and_create_connect() const noexcept
std::unique_ptr< logger_t > logger()
An implementation of connection count limiter for the case when connection count is not limited.
Exception class for all exceptions thrown by RESTinio.
A type of holder of limits related to an incoming HTTP message.
A fluent style interface for setting http server params.
An adapter for setting acceptor options before running server.
void set_option(const Option &option, asio_ns::error_code &ec)
asio_ns::basic_socket< asio_ns::ip::tcp > & m_socket
A reference on the most base class with interface of setting options.
void get_option(Option &option)
void get_option(Option &option, asio_ns::error_code &ec)
socket_options_t(asio_ns::basic_socket< asio_ns::ip::tcp > &socket)
void set_option(const Option &option)
API for setting/getting options.
Extra settings needed for working with socket.
~socket_type_dependent_settings_t() noexcept=default
#define RESTINIO_FMT_FORMAT_STRING(s)
Stuff related to limits of an incoming HTTP message.
std::variant< no_address_specified_t, std::string, asio_ns::ip::address > address_variant_t
A type of variant for holding IP address for a server in various representations.
inspection_result_t
Enumeration of result of inspecting new incoming connection.
typename details::actual_request_handler_type_detector< typename Traits::request_handler_t, typename Traits::extra_data_factory_t >::request_handler_t request_handler_type_from_traits_t
A metafunction for extraction a request-handler type from server's traits.
auto ensure_created(std::unique_ptr< Object > mb_created_one, string_view_t fail_description)
Ensure that object was created.
auto create_default_unique_object_instance< acceptor_options_setter_t >()
run_on_this_thread_settings_t< Traits > on_this_thread()
A special marker for the case when http_server must be run on the context of the current thread.
std::function< void(socket_options_t &) > socket_options_setter_t
auto create_default_shared_object_instance()
Default instantiation for a specific type.
std::function< void(acceptor_options_t &) > acceptor_options_setter_t
std::string_view string_view_t
auto exec_configurator(Configurator &&configurator)
std::function< void(void) > cleanup_functor_t
Type of holder for user's cleanup function.
auto create_default_shared_object_instance< default_request_handler_t >()
Default instantiation for default_request_handler_t.
auto create_default_unique_object_instance()
Default instantiation for a specific type.
auto create_default_unique_object_instance< default_request_handler_t >()
Default instantiation for default_request_handler_t.
std::function< void(asio_ns::ip::tcp::acceptor &) > acceptor_post_bind_hook_t
A type of callback to be called after a successful invocation of bind() function for the acceptor.
auto create_default_unique_object_instance< socket_options_setter_t >()
typename std::conditional< Traits::use_connection_count_limiter, connection_count_limits::connection_count_limiter_t< typename Traits::strand_t >, connection_count_limits::noop_connection_count_limiter_t >::type limiter_t
void check_valid_connection_state_listener_pointer() const
A special class for holding actual connection state listener.
std::shared_ptr< Listener > m_connection_state_listener
void check_valid_connection_state_listener_pointer() const
Checks that pointer to state listener is not null.
std::size_t max_parallel_connections() const noexcept
A special type for holding the value of maximum allowed count of parallel connections.
void set_max_parallel_connections(std::size_t v) noexcept
std::size_t max_parallel_connections() const noexcept
A special indicator for the case when IP address for a server is not set explicitly.
void check_valid_ip_blocker_pointer() const
A special class for holding actual IP-blocker object.
void check_valid_ip_blocker_pointer() const
Checks that pointer to IP-blocker is not null.
std::shared_ptr< Ip_Blocker > m_ip_blocker