2
3
6
7
11#include <restinio/asio_include.hpp>
13#include <restinio/exception.hpp>
14#include <restinio/request_handler.hpp>
15#include <restinio/traits.hpp>
17#include <restinio/incoming_http_msg_limits.hpp>
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 >
114 std::unique_ptr< Object > mb_created_one,
115 string_view_t fail_description )
117 if( !mb_created_one )
118 mb_created_one = create_default_unique_object_instance< Object >();
120 if( !mb_created_one )
123 return mb_created_one;
131template <
typename Object >
134 std::shared_ptr< Object > mb_created_one,
135 string_view_t fail_description )
137 if( !mb_created_one )
138 mb_created_one = create_default_shared_object_instance< Object >();
140 if( !mb_created_one )
143 return mb_created_one;
152template <
typename Settings,
typename Socket >
179
180
181
182
192 template<
typename Option >
199 template<
typename Option >
201 set_option(
const Option & option, asio_ns::error_code & ec )
206 template<
typename Option >
213 template<
typename Option >
233 options.set_option( asio_ns::ip::tcp::acceptor::reuse_address(
true ) );
243
244
245
246
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 );
305
306
313
314
315
316
317
318
319
320
321template<
typename Listener >
330
331
336 throw exception_t{ "connection state listener is not specified" };
341
342
343
344
345
346
347
364
365
366
367
368
369
370
371
372template<
typename Ip_Blocker >
376 noexcept( std::declval<Ip_Blocker>().inspect(
378 "Ip_Blocker::inspect() method should be noexcept" );
385 "Ip_Blocker::inspect() should return "
386 "restinio::ip_blocker::inspection_result_t" );
394
395
405
406
407
408
409
410
411
428
429
430
431
432
434 void(asio_ns::ip::tcp::acceptor &) >;
443
444
445
446
447
454
455
456
457
458
462 asio_ns::ip::address >;
468
469
470
471
472
473
474
475
476
477
478
479template<
typename Count_Limiter >
485
486
487
488
490 std::numeric_limits<std::size_t>::max()
507
508
509
510
511
512
513
514
515
516
526 return std::numeric_limits<std::size_t>::max();
538
539
540
541
542
543
544
545
546
547template<
typename Derived,
typename Traits>
564 typename Traits::connection_state_listener_t
565 >::has_actual_connection_state_listener;
568 typename Traits::ip_blocker_t
569 >::has_actual_ip_blocker;
575 std::uint16_t port = 8080,
576 asio_ns::ip::tcp protocol = asio_ns::ip::tcp::v4() )
594 return std::move(
this->port( p ) );
614 return std::move(
this->protocol( p ) );
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
644 m_address = std::move(addr);
649
650
651
652
653
654
655
656
657
658
659
660
664 return std::move(
this->address( std::move( addr ) ) );
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
694
695
696
697
698
699
700
701
702
703
704
705
706
707
711 return std::move(
this->address( addr ) );
724
725
726
738 return std::move(
this->buffer_size( s ) );
752
753
758 m_read_next_http_message_timelimit = std::move( d );
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 );
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 );
809 return std::move(
this->handle_request_timeout( std::move( d ) ) );
812 std::chrono::steady_clock::duration
815 return m_handle_request_timeout;
831 return std::move(
this->max_pipelined_requests( mpr ) );
849 m_request_handler = std::move( handler );
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 )... ) );
873 return ensure_created(
874 std::move( m_request_handler ),
875 "request handler must be set" );
883
884
887
888
889
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916 template<
typename... Params >
920 return set_unique_instance(
922 std::forward< Params >( params )... );
926
927
928
929
930
931
932 template<
typename... Params >
936 return std::move(
this->timer_manager( std::forward< Params >( params )... ) );
942 return ensure_created(
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 )... ) );
971 return ensure_created(
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 ) ) );
999 return ensure_created(
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 ) ) );
1027 return ensure_created(
1028 std::move( m_socket_options_setter ),
1029 "socket options setter must be set" );
1035
1036
1037
1042 if( 0 == n || 1024 < n )
1046 "invalid value for number of cuncurrent connects: {}" ),
1056 return std::move(
this->concurrent_accepts_count( n ) );
1068
1069
1070
1071
1072
1073
1074
1086 return std::move(
this->separate_accept_and_create_connect( do_separate ) );
1098 template<
typename Func >
1102 m_cleanup_functor = std::move(func);
1106 template<
typename Func >
1110 return std::move(
this->cleanup_func( std::forward<Func>(func) ));
1114
1115
1116
1117
1118
1123 return std::move(m_cleanup_functor);
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
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);
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1203 std::shared_ptr<
typename Traits::connection_state_listener_t > listener ) &&
1205 return std::move(
this->connection_state_listener(
1206 std::move(listener)));
1210
1211
1212
1213
1214
1215
1216
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;
1229
1230
1231
1232
1233
1234
1235
1236
1240 this->check_valid_connection_state_listener_pointer();
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1276 std::shared_ptr<
typename Traits::ip_blocker_t > 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);
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1321 std::shared_ptr<
typename Traits::ip_blocker_t > blocker ) &&
1323 return std::move(
this->ip_blocker(std::move(blocker)));
1327
1328
1329
1330
1331
1332
1333
1334 const std::shared_ptr<
typename Traits::
ip_blocker_t > &
1339 "ip_blocker() can't be used "
1340 "for the default ip_blocker::noop_ip_blocker_t" );
1342 return this->m_ip_blocker;
1346
1347
1348
1349
1350
1351
1352
1356 this->check_valid_ip_blocker_pointer();
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1387 throw exception_t{ "acceptor_post_bind_hook cannot be empty" };
1389 m_acceptor_post_bind_hook = std::move(hook);
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1415 return std::move(
this->acceptor_post_bind_hook( std::move(hook) ));
1419
1420
1421
1422
1423
1424
1425
1426
1427
1432 return std::move(m_acceptor_post_bind_hook);
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1511 return std::move(
this->incoming_http_msg_limits(limits));
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1543 "max_parallel_connections(value) can't be used "
1544 "for the noop_connection_count_limiter_t" );
1546 this->set_max_parallel_connections( value );
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1576 return std::move(
this->max_parallel_connections( value ));
1582
1583
1584
1586
1587
1588
1591
1592
1593
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1673 return std::move(
this->extra_data_factory( std::move(factory) ));
1677
1678
1679
1684 return ensure_created(
1686 "extra_data_factory is not set" );
1689
1690
1696 return static_cast<Derived &>(*
this);
1699 template<
typename Target,
typename... Params >
1704 std::make_unique< Target >(
1705 std::forward< Params >( params )... );
1710 template<
typename Target,
typename... Params >
1715 std::make_shared< Target >(
1716 std::forward< Params >( params )... );
1726
1727
1728
1737 std::chrono::steady_clock::duration
1740 std::chrono::steady_clock::duration
1743 std::chrono::steady_clock::duration
1764
1765
1766
1767
1784
1785
1786
1787
1791
1792
1793
1794
1803template<
typename Traits = default_traits_t>
1804class server_settings_t final
1808 server_settings_t<Traits>, Traits>;
1813template <
typename Traits,
typename Configurator >
1817 server_settings_t< Traits > result;
1819 configurator( result );
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 m_buffer_size
Size of buffer for io operations.
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) &&
acceptor_post_bind_hook_t m_acceptor_post_bind_hook
A hook to be called just after a successful call to bind for acceptor.
std::chrono::steady_clock::duration m_handle_request_timeout
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()
std::chrono::steady_clock::duration m_write_http_response_timelimit
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) &
socket_type_dependent_settings_t< Derived, typename Traits::stream_socket_t > base_type_t
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.
std::size_t m_max_pipelined_requests
Max pipelined requests to receive on single connection.
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
details::max_parallel_connections_holder_t< typename connection_count_limit_types< Traits >::limiter_t > max_parallel_connections_holder_base_t
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::size_t m_concurrent_accepts_count
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.
bool m_separate_accept_and_create_connect
Do separate an accept operation and connection instantiation.
acceptor_post_bind_hook_t giveaway_acceptor_post_bind_hook()
A getter for post-bind callback.
std::chrono::steady_clock::duration m_read_next_http_message_timelimit
Operations timeouts.
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
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.
exception_t(const char *err)
A type of holder of limits related to an incoming HTTP message.
An information about new incoming connection to be passed to IP-blocker object.
basic_server_settings_t< server_settings_t< Traits >, Traits > base_type_t
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 & operator=(socket_type_dependent_settings_t &&) noexcept=delete
socket_type_dependent_settings_t() noexcept=default
socket_type_dependent_settings_t(socket_type_dependent_settings_t &&) noexcept=default
socket_type_dependent_settings_t(const socket_type_dependent_settings_t &) noexcept=default
~socket_type_dependent_settings_t() noexcept=default
socket_type_dependent_settings_t & operator=(const socket_type_dependent_settings_t &) noexcept=default
#define RESTINIO_FMT_FORMAT_STRING(s)
auto create_default_unique_object_instance(std::false_type)
Default instantiation for a specific type.
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.
auto create_default_shared_object_instance(std::false_type)
Default instantiation for a specific type.
auto ensure_created(std::unique_ptr< Object > mb_created_one, string_view_t fail_description)
Ensure that object was created.
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
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 ensure_created(std::shared_ptr< Object > mb_created_one, string_view_t fail_description)
Ensure that object was created.
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.
A kind of metafunction that deduces actual types related to connection count limiter in the dependecy...
The default no-op state listener.
A special class for case when no-op state listener is used.
static constexpr bool has_actual_connection_state_listener
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
static constexpr bool has_actual_connection_state_listener
void check_valid_connection_state_listener_pointer() const
Checks that pointer to state listener is not null.
A specialization of max_parallel_connections_holder for the case when connection count isn't limited.
static constexpr bool has_actual_max_parallel_connections
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
static constexpr bool has_actual_max_parallel_connections
std::size_t m_max_parallel_connections
Actual value of the limit.
std::size_t max_parallel_connections() const noexcept
A special indicator for the case when IP address for a server is not set explicitly.
The default no-op IP-blocker.
A special class for case when no-op IP-blocker is used.
static constexpr bool has_actual_ip_blocker
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
static constexpr bool has_actual_ip_blocker