32 template <
typename Object >
36 return std::unique_ptr< Object >{};
39 template <
typename Object >
43 return std::make_unique< Object >();
47 template <
typename Object >
51 return std::shared_ptr< Object >{};
54 template <
typename Object >
58 return std::make_shared< Object >();
68 template <
typename Object>
72 typename std::is_default_constructible< Object >::type tag;
73 return details::create_default_unique_object_instance< Object >( tag );
90 template <
typename Object>
94 typename std::is_default_constructible< Object >::type tag;
95 return details::create_default_shared_object_instance< Object >( tag );
112 template <
typename Object >
115 std::unique_ptr< Object > mb_created_one,
118 if( !mb_created_one )
119 mb_created_one = create_default_unique_object_instance< Object >();
121 if( !mb_created_one )
124 return mb_created_one;
132 template <
typename Object >
135 std::shared_ptr< Object > mb_created_one,
138 if( !mb_created_one )
139 mb_created_one = create_default_shared_object_instance< Object >();
141 if( !mb_created_one )
144 return mb_created_one;
153 template <
typename Settings,
typename Socket >
188 : m_acceptor{ acceptor }
193 template<
typename Option >
197 m_acceptor.set_option( option );
200 template<
typename Option >
202 set_option(
const Option & option, asio_ns::error_code & ec )
204 m_acceptor.set_option( option, ec );
207 template<
typename Option >
211 m_acceptor.get_option( option );
214 template<
typename Option >
218 m_acceptor.get_option( option, ec );
232 return std::make_unique< acceptor_options_setter_t >(
234 options.
set_option( asio_ns::ip::tcp::acceptor::reuse_address(
true ) );
253 asio_ns::basic_socket< asio_ns::ip::tcp > & socket )
259 template<
typename Option >
263 m_socket.set_option( option );
266 template<
typename Option >
268 set_option(
const Option & option, asio_ns::error_code & ec )
270 m_socket.set_option( option, ec );
273 template<
typename Option >
277 m_socket.get_option( option );
280 template<
typename Option >
284 m_socket.get_option( option, ec );
290 asio_ns::basic_socket< asio_ns::ip::tcp > &
m_socket;
299 return std::make_unique< socket_options_setter_t >( [](
auto & ){} );
322 template<
typename Listener >
327 static constexpr
bool has_actual_connection_state_listener =
true;
336 if( !m_connection_state_listener )
337 throw exception_t{
"connection state listener is not specified" };
352 static constexpr
bool has_actual_connection_state_listener =
false;
373 template<
typename Ip_Blocker >
377 noexcept( std::declval<Ip_Blocker>().inspect(
378 std::declval<ip_blocker::incoming_info_t>() ) ),
379 "Ip_Blocker::inspect() method should be noexcept" );
384 decltype(std::declval<Ip_Blocker>().inspect(
385 std::declval<ip_blocker::incoming_info_t>())) >::value,
386 "Ip_Blocker::inspect() should return "
387 "restinio::ip_blocker::inspection_result_t" );
391 static constexpr
bool has_actual_ip_blocker =
true;
401 throw exception_t{
"IP-blocker is not specified" };
416 static constexpr
bool has_actual_ip_blocker =
false;
435 void(asio_ns::ip::tcp::acceptor &) >;
463 asio_ns::ip::address >;
480 template<
typename Count_Limiter >
483 static constexpr
bool has_actual_max_parallel_connections =
true;
490 std::size_t m_max_parallel_connections{
491 std::numeric_limits<std::size_t>::max()
497 return m_max_parallel_connections;
503 m_max_parallel_connections = v;
522 static constexpr
bool has_actual_max_parallel_connections =
false;
527 return std::numeric_limits<std::size_t>::max();
548 template<
typename Derived,
typename Traits>
552 typename Traits::connection_state_listener_t >
555 typename connection_count_limit_types<Traits>::limiter_t >
558 Derived,
typename Traits::stream_socket_t>;
565 typename Traits::connection_state_listener_t
566 >::has_actual_connection_state_listener;
569 typename Traits::ip_blocker_t
570 >::has_actual_ip_blocker;
572 using max_parallel_connections_holder_base_t::has_actual_max_parallel_connections;
576 std::uint16_t port = 8080,
577 asio_ns::ip::tcp protocol = asio_ns::ip::tcp::v4() )
580 , m_protocol{ protocol }
589 return reference_to_derived();
609 return reference_to_derived();
646 return reference_to_derived();
691 return reference_to_derived();
712 return std::move( this->address( addr ) );
733 return reference_to_derived();
739 return std::move( this->buffer_size( s ) );
745 return m_buffer_size;
759 m_read_next_http_message_timelimit =
std::move( d );
760 return reference_to_derived();
769 std::chrono::steady_clock::duration
772 return m_read_next_http_message_timelimit;
781 m_write_http_response_timelimit =
std::move( d );
782 return reference_to_derived();
791 std::chrono::steady_clock::duration
794 return m_write_http_response_timelimit;
803 m_handle_request_timeout =
std::move( d );
804 return reference_to_derived();
813 std::chrono::steady_clock::duration
816 return m_handle_request_timeout;
825 m_max_pipelined_requests = mpr;
826 return reference_to_derived();
832 return std::move( this->max_pipelined_requests( mpr ) );
838 return m_max_pipelined_requests;
850 m_request_handler =
std::move( handler );
851 return reference_to_derived();
854 template<
typename... Params >
858 return set_unique_instance(
860 std::forward< Params >( params )... );
864 template<
typename... Params >
868 return std::move( this->request_handler( std::forward< Params >( params )... ) );
871 std::unique_ptr< request_handler_t >
876 "request handler must be set" );
886 template<
typename... Params >
890 return set_unique_instance(
892 std::forward< Params >( params )... );
895 template<
typename... Params >
899 return std::move( this->timer_manager( std::forward< Params >( params )... ) );
902 std::unique_ptr< timer_factory_t >
907 "timer manager is not set" );
915 template<
typename... Params >
919 return set_unique_instance(
921 std::forward< Params >( params )... );
924 template<
typename... Params >
928 return std::move( this->logger( std::forward< Params >( params )... ) );
931 std::unique_ptr< logger_t >
936 "logger must be set" );
946 throw exception_t{
"acceptor options setter cannot be empty" };
948 return set_unique_instance(
949 m_acceptor_options_setter,
959 std::unique_ptr< acceptor_options_setter_t >
964 "acceptor options setter must be set" );
974 throw exception_t{
"socket options setter cannot be empty" };
976 return set_unique_instance(
977 m_socket_options_setter,
987 std::unique_ptr< socket_options_setter_t >
992 "socket options setter must be set" );
1005 if( 0 == n || 1024 < n )
1008 "invalid value for number of cuncurrent connects: {}",
1011 m_concurrent_accepts_count = n;
1012 return reference_to_derived();
1018 return std::move( this->concurrent_accepts_count( n ) );
1024 return m_concurrent_accepts_count;
1041 m_separate_accept_and_create_connect = do_separate;
1042 return reference_to_derived();
1048 return std::move( this->separate_accept_and_create_connect( do_separate ) );
1054 return m_separate_accept_and_create_connect;
1060 template<
typename Func >
1065 return reference_to_derived();
1068 template<
typename Func >
1072 return std::move(this->cleanup_func( std::forward<Func>(func) ));
1121 std::shared_ptr< typename Traits::connection_state_listener_t > listener ) &
1124 has_actual_connection_state_listener,
1125 "connection_state_listener(listener) can't be used "
1126 "for the default connection_state::noop_listener_t" );
1128 this->m_connection_state_listener =
std::move(listener);
1129 return reference_to_derived();
1165 std::shared_ptr< typename Traits::connection_state_listener_t > listener ) &&
1167 return std::move(this->connection_state_listener(
1179 const std::shared_ptr< typename Traits::connection_state_listener_t > &
1183 has_actual_connection_state_listener,
1184 "connection_state_listener() can't be used "
1185 "for the default connection_state::noop_listener_t" );
1187 return this->m_connection_state_listener;
1202 this->check_valid_connection_state_listener_pointer();
1238 std::shared_ptr< typename Traits::ip_blocker_t > blocker ) &
1242 "ip_blocker(blocker) can't be used "
1243 "for the default ip_blocker::noop_ip_blocker_t" );
1245 this->m_ip_blocker =
std::move(blocker);
1246 return reference_to_derived();
1283 std::shared_ptr< typename Traits::ip_blocker_t > blocker ) &&
1296 const std::shared_ptr< typename Traits::ip_blocker_t > &
1301 "ip_blocker() can't be used "
1302 "for the default ip_blocker::noop_ip_blocker_t" );
1304 return this->m_ip_blocker;
1318 this->check_valid_ip_blocker_pointer();
1349 throw exception_t{
"acceptor_post_bind_hook cannot be empty" };
1351 m_acceptor_post_bind_hook =
std::move(hook);
1352 return reference_to_derived();
1394 return std::move(m_acceptor_post_bind_hook);
1414 return m_incoming_http_msg_limits;
1443 m_incoming_http_msg_limits = limits;
1444 return reference_to_derived();
1473 return std::move(this->incoming_http_msg_limits(limits));
1505 "max_parallel_connections(value) can't be used "
1506 "for the noop_connection_count_limiter_t" );
1508 this->set_max_parallel_connections( value );
1509 return reference_to_derived();
1538 return std::move(this->max_parallel_connections( value ));
1541 using max_parallel_connections_holder_base_t::max_parallel_connections;
1547 return static_cast<Derived &
>(*this);
1550 template<
typename Target,
typename... Params >
1555 std::make_unique< Target >(
1556 std::forward< Params >( params )... );
1558 return reference_to_derived();
1561 template<
typename Target,
typename... Params >
1566 std::make_shared< Target >(
1567 std::forward< Params >( params )... );
1569 return reference_to_derived();
1584 std::size_t m_buffer_size{ 4 * 1024 };
1588 std::chrono::steady_clock::duration
1589 m_read_next_http_message_timelimit{ std::chrono::seconds( 60 ) };
1591 std::chrono::steady_clock::duration
1592 m_write_http_response_timelimit{ std::chrono::seconds( 5 ) };
1594 std::chrono::steady_clock::duration
1595 m_handle_request_timeout{ std::chrono::seconds( 10 ) };
1599 std::size_t m_max_pipelined_requests{ 1 };
1620 [](asio_ns::ip::tcp::acceptor &) {}
1626 std::size_t m_concurrent_accepts_count{ 1 };
1629 bool m_separate_accept_and_create_connect{
false };
1647 template<
typename Traits = default_traits_t>
1657 template <
typename Traits,
typename Configurator >
1663 configurator( result );