RESTinio

tls.hpp
Go to the documentation of this file.
1/*
2 restinio
3*/
4
9#pragma once
10
11#include <restinio/traits.hpp>
12#include <restinio/impl/tls_socket.hpp>
13
14 namespace restinio
15{
16
17 namespace connection_state
18{
19
30 class tls_accessor_t
31{
32 tls_socket_t & m_tls_socket;
33
34 public:
35 tls_accessor_t( tls_socket_t & tls_socket ) : m_tls_socket{tls_socket} {}
36
88 RESTINIO_NODISCARD
89 auto native_handle() const noexcept
90 {
91 return m_tls_socket.asio_ssl_stream().native_handle();
92 }
93};
94
95//
96// The implementation of TLS-related part of notice_t.
97//
98
99 template< typename Lambda >
100 void
101 accepted_t::try_inspect_tls( Lambda && lambda ) const
102{
103 if( m_tls_socket )
104 lambda( tls_accessor_t{*m_tls_socket} );
105}
106
107 template< typename Lambda >
108 decltype(auto)
109 accepted_t::inspect_tls_or_throw( Lambda && lambda ) const
110{
111 if( !m_tls_socket )
112 throw exception_t{ "an attempt to call inspect_tls for "
113 "non-TLS-connection" };
114
115 return lambda( tls_accessor_t{*m_tls_socket} );
116}
117
118 template< typename Lambda, typename T >
119T
120 accepted_t::inspect_tls_or_default( Lambda && lambda, T && default_value ) const
121{
122 if( m_tls_socket )
123 return lambda( tls_accessor_t{*m_tls_socket} );
124
125 return default_value;
126}
127
128} /* namespace connection_state */
129
130//
131// tls_traits_t
132//
133
134 template <
135 typename Timer_Factory,
136 typename Logger,
137 typename Request_Handler = default_request_handler_t,
138 typename Strand = asio_ns::strand< default_asio_executor > >
139 using tls_traits_t = traits_t< Timer_Factory, Logger, Request_Handler, Strand, tls_socket_t >;
140
141//
142// single_thread_traits_t
143//
144
145 template <
146 typename Timer_Factory,
147 typename Logger,
148 typename Request_Handler = default_request_handler_t >
149 using single_thread_tls_traits_t =
150 tls_traits_t< Timer_Factory, Logger, Request_Handler, noop_strand_t >;
151
152 using default_tls_traits_t = tls_traits_t< asio_timer_manager_t, null_logger_t >;
153
154//
155// prepare_connection_and_start_read()
156//
157
160 template < typename Connection, typename Start_Read_CB, typename Failed_CB >
161 void
162 prepare_connection_and_start_read(
163 tls_socket_t & socket,
164 Connection & con,
165 Start_Read_CB start_read_cb,
166 Failed_CB failed_cb )
167{
168 socket.async_handshake(
169 asio_ns::ssl::stream_base::server,
170 [ start_read_cb = std::move( start_read_cb ),
171 failed_cb = std::move( failed_cb ),
172 con = con.shared_from_this() ]( const asio_ns::error_code & ec ){
173 if( !ec )
174 start_read_cb();
175 else
176 failed_cb( ec );
177 } );
178}
179
180//
181// socket_type_dependent_settings_t
182//
183
185
188 template < typename Settings >
189 class socket_type_dependent_settings_t< Settings, tls_socket_t >
190{
191 protected:
192 ~socket_type_dependent_settings_t() = default;
193
194 public:
195 socket_type_dependent_settings_t() = default;
196 socket_type_dependent_settings_t(
197 socket_type_dependent_settings_t && ) = default;
198
200 Settings &
201 tls_context(
202 asio_ns::ssl::context context ) &
203 {
204 m_tls_context = std::make_shared< asio_ns::ssl::context >(
205 std::move( context ) );
206 return upcast_reference();
207 }
208
210 Settings &&
211 tls_context(
212 asio_ns::ssl::context context ) &&
213 {
214 return std::move( this->tls_context( std::move( context ) ) );
215 }
216
218
246 Settings &
247 tls_context(
248 std::shared_ptr< asio_ns::ssl::context > shared_context ) &
249 {
250 m_tls_context = std::move( shared_context );
251 return upcast_reference();
252 }
253
255
287 Settings &&
288 tls_context(
289 std::shared_ptr< asio_ns::ssl::context > shared_context ) &&
290 {
291 return std::move( this->tls_context( std::move(shared_context) ) );
292 }
293
294 //FIXME: should be removed in v.0.7.
300 [[deprecated]]
301 asio_ns::ssl::context
302 tls_context()
303 {
304 asio_ns::ssl::context result{ std::move( *m_tls_context ) };
305 m_tls_context.reset();
306
307 return result;
308 }
309
311
317 std::shared_ptr< asio_ns::ssl::context >
318 giveaway_tls_context()
319 {
320 return std::move(m_tls_context);
321 }
322
323 private:
324 Settings &
325 upcast_reference()
326 {
327 return static_cast< Settings & >( *this );
328 }
329
330 std::shared_ptr< asio_ns::ssl::context > m_tls_context{
331 std::make_shared< asio_ns::ssl::context >(
332 asio_ns::ssl::context::sslv23 )
333 };
334};
335
336 namespace impl
337{
338
339// An overload for the case of non-TLS-connection.
340 inline tls_socket_t *
341 make_tls_socket_pointer_for_state_listener(
342 tls_socket_t & socket ) noexcept
343{
344 return &socket;
345}
346
347//
348// socket_supplier_t
349//
350
352 template <>
353 class socket_supplier_t< tls_socket_t >
354{
355 protected:
356 template < typename Settings >
357 socket_supplier_t(
358 Settings & settings,
359 asio_ns::io_context & io_context )
360 : m_tls_context{ settings.giveaway_tls_context() }
361 , m_io_context{ io_context }
362 {
363 m_sockets.reserve( settings.concurrent_accepts_count() );
364
365 while( m_sockets.size() < settings.concurrent_accepts_count() )
366 {
367 m_sockets.emplace_back( m_io_context, m_tls_context );
368 }
369 }
370
371 virtual ~socket_supplier_t() = default;
372
373 tls_socket_t &
374 socket(
376 std::size_t idx )
377 {
378 return m_sockets.at( idx );
379 }
380
381 auto
382 move_socket(
384 std::size_t idx )
385 {
386 tls_socket_t res{ m_io_context, m_tls_context };
387 std::swap( res, m_sockets.at( idx ) );
388 return res;
389 }
390
393 auto
394 concurrent_accept_sockets_count() const
395 {
396 return m_sockets.size();
397 }
398
399 private:
400 std::shared_ptr< asio_ns::ssl::context > m_tls_context;
401 asio_ns::io_context & m_io_context;
402 std::vector< tls_socket_t > m_sockets;
403};
404
405} /* namespace impl */
406
407} /* namespace restinio */
restinio::connection_state::accepted_t::inspect_tls_or_throw
decltype(auto) inspect_tls_or_throw(Lambda &&lambda) const
Calls the specified lambda-function if the accepted connection is a TLS-connection.
Definition: tls.hpp:109
restinio::connection_state::accepted_t::inspect_tls_or_default
T inspect_tls_or_default(Lambda &&lambda, T &&default_value) const
Calls the specified lambda-function if the accepted connection is a TLS-connection.
Definition: tls.hpp:120
restinio::connection_state::accepted_t::m_tls_socket
tls_socket_t * m_tls_socket
An optional pointer to TLS-related connection.
Definition: connection_state_listener.hpp:45
restinio::connection_state::accepted_t::try_inspect_tls
void try_inspect_tls(Lambda &&lambda) const
Calls the specified lambda-function if the accepted connection is a TLS-connection.
Definition: tls.hpp:101
restinio::connection_state::tls_accessor_t
Accessor to TLS-specific information related to a connection.
Definition: tls.hpp:31
restinio::connection_state::tls_accessor_t::native_handle
RESTINIO_NODISCARD auto native_handle() const noexcept
Get the access to native handle behind Asio's ssl_stream.
Definition: tls.hpp:89
restinio::connection_state::tls_accessor_t::tls_accessor_t
tls_accessor_t(tls_socket_t &tls_socket)
Definition: tls.hpp:35
restinio::connection_state::tls_accessor_t::m_tls_socket
tls_socket_t & m_tls_socket
Definition: tls.hpp:32
restinio::exception_t
Exception class for all exceptions thrown by RESTinio.
Definition: exception.hpp:26
restinio::impl::socket_supplier_t< tls_socket_t >::m_io_context
asio_ns::io_context & m_io_context
Definition: tls.hpp:401
restinio::impl::socket_supplier_t< tls_socket_t >::socket
tls_socket_t & socket(std::size_t idx)
Definition: tls.hpp:374
restinio::impl::socket_supplier_t< tls_socket_t >::~socket_supplier_t
virtual ~socket_supplier_t()=default
restinio::impl::socket_supplier_t< tls_socket_t >::concurrent_accept_sockets_count
auto concurrent_accept_sockets_count() const
The number of sockets that can be used for cuncurrent accept operations.
Definition: tls.hpp:394
restinio::impl::socket_supplier_t< tls_socket_t >::m_tls_context
std::shared_ptr< asio_ns::ssl::context > m_tls_context
Definition: tls.hpp:400
restinio::impl::socket_supplier_t< tls_socket_t >::m_sockets
std::vector< tls_socket_t > m_sockets
Definition: tls.hpp:402
restinio::impl::socket_supplier_t< tls_socket_t >::move_socket
auto move_socket(std::size_t idx)
Definition: tls.hpp:382
restinio::impl::socket_supplier_t< tls_socket_t >::socket_supplier_t
socket_supplier_t(Settings &settings, asio_ns::io_context &io_context)
Definition: tls.hpp:357
restinio::impl::socket_supplier_t
Definition: acceptor.hpp:42
restinio::impl::socket_supplier_t::m_sockets
std::vector< Socket > m_sockets
A temporary socket for receiving new connections.
Definition: acceptor.hpp:96
restinio::impl::socket_supplier_t::m_io_context
asio_ns::io_context & m_io_context
io_context for sockets to run on.
Definition: acceptor.hpp:92
restinio::impl::tls_socket_t
Socket adapter for asio::ssl::stream< asio::ip::tcp::socket >.
Definition: tls_socket.hpp:37
restinio::impl::tls_socket_t::async_handshake
auto async_handshake(Args &&... args)
Definition: tls_socket.hpp:162
restinio::impl::tls_socket_t::asio_ssl_stream
socket_t & asio_ssl_stream()
Get an access to underlying Asio's socket.
Definition: tls_socket.hpp:87
restinio::socket_type_dependent_settings_t< Settings, tls_socket_t >::tls_context
Settings & tls_context(std::shared_ptr< asio_ns::ssl::context > shared_context) &
Setup a shared TLS-context for server's settings.
Definition: tls.hpp:247
restinio::socket_type_dependent_settings_t< Settings, tls_socket_t >::socket_type_dependent_settings_t
socket_type_dependent_settings_t()=default
restinio::socket_type_dependent_settings_t< Settings, tls_socket_t >::tls_context
Settings && tls_context(std::shared_ptr< asio_ns::ssl::context > shared_context) &&
Setup a shared TLS-context for server's settings.
Definition: tls.hpp:288
restinio::socket_type_dependent_settings_t< Settings, tls_socket_t >::upcast_reference
Settings & upcast_reference()
Definition: tls.hpp:325
restinio::socket_type_dependent_settings_t< Settings, tls_socket_t >::tls_context
asio_ns::ssl::context tls_context()
Definition: tls.hpp:302
restinio::socket_type_dependent_settings_t< Settings, tls_socket_t >::tls_context
Settings && tls_context(asio_ns::ssl::context context) &&
Setup an exclusive TLS-context for server's settings.
Definition: tls.hpp:211
restinio::socket_type_dependent_settings_t< Settings, tls_socket_t >::~socket_type_dependent_settings_t
~socket_type_dependent_settings_t()=default
restinio::socket_type_dependent_settings_t< Settings, tls_socket_t >::socket_type_dependent_settings_t
socket_type_dependent_settings_t(socket_type_dependent_settings_t &&)=default
restinio::socket_type_dependent_settings_t< Settings, tls_socket_t >::tls_context
Settings & tls_context(asio_ns::ssl::context context) &
Setup an exclusive TLS-context for server's settings.
Definition: tls.hpp:201
restinio::socket_type_dependent_settings_t< Settings, tls_socket_t >::giveaway_tls_context
std::shared_ptr< asio_ns::ssl::context > giveaway_tls_context()
Get away the TLS-context from settings.
Definition: tls.hpp:318
restinio::socket_type_dependent_settings_t
Extra settings needed for working with socket.
Definition: settings.hpp:155
RESTINIO_NODISCARD
#define RESTINIO_NODISCARD
Definition: compiler_features.hpp:33
nonstd::optional_lite::std11::move
T & move(T &t)
Definition: optional.hpp:465
nonstd::optional_lite::swap
void swap(optional< T > &x, optional< T > &y)
Definition: optional.hpp:1705
restinio::impl::make_tls_socket_pointer_for_state_listener
tls_socket_t * make_tls_socket_pointer_for_state_listener(asio_ns::ip::tcp::socket &) noexcept
Definition: connection.hpp:277
restinio
Definition: asio_include.hpp:21
restinio::tls_socket_t
impl::tls_socket_t tls_socket_t
A public alias for the actual implementation of TLS-socket.
Definition: tls_fwd.hpp:30
restinio::default_request_handler_t
std::function< request_handling_status_t(request_handle_t) > default_request_handler_t
Definition: request_handler.hpp:470
restinio::prepare_connection_and_start_read
void prepare_connection_and_start_read(tls_socket_t &socket, Connection &con, Start_Read_CB start_read_cb, Failed_CB failed_cb)
Customizes connection init routine with an additional step: perform handshake and only then start rea...
Definition: tls.hpp:162
restinio::traits_t
Definition: traits.hpp:147
tls_socket.hpp
traits.hpp
const
#define const
Definition: zconf.h:230