RESTinio
tls.hpp
Go to the documentation of this file.
1 /*
2  restinio
3 */
4 
9 #pragma once
10 
11 #include <restinio/traits.hpp>
13 
14 namespace restinio
15 {
16 
17 namespace connection_state
18 {
19 
31 {
33 
34 public:
35  tls_accessor_t( tls_socket_t & tls_socket ) : m_tls_socket{tls_socket} {}
36 
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 >
119 T
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 > >
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 >
151 
153 
154 //
155 // prepare_connection_and_start_read()
156 //
157 
160 template < typename Connection, typename Start_Read_CB, typename Failed_CB >
161 void
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 >
190 {
191 protected:
193 
194 public:
197  socket_type_dependent_settings_t && ) = default;
198 
200  Settings &
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 &&
212  asio_ns::ssl::context context ) &&
213  {
214  return std::move( this->tls_context( std::move( context ) ) );
215  }
216 
218 
246  Settings &
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 &&
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
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 >
319  {
320  return std::move(m_tls_context);
321  }
322 
323  private:
324  Settings &
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 *
342  tls_socket_t & socket ) noexcept
343 {
344  return &socket;
345 }
346 
347 //
348 // socket_supplier_t
349 //
350 
352 template <>
354 {
355  protected:
356  template < typename Settings >
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 &
376  std::size_t idx )
377  {
378  return m_sockets.at( idx );
379  }
380 
381  auto
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
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::exception_t
Exception class for all exceptions thrown by RESTinio.
Definition: exception.hpp:26
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_NODISCARD
#define RESTINIO_NODISCARD
Definition: compiler_features.hpp:33
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::impl::socket_supplier_t< tls_socket_t >::m_sockets
std::vector< tls_socket_t > m_sockets
Definition: tls.hpp:402
nonstd::optional_lite::std11::move
T & move(T &t)
Definition: optional.hpp:421
tls_socket.hpp
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::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::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::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 >::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::connection_state::tls_accessor_t::m_tls_socket
tls_socket_t & m_tls_socket
Definition: tls.hpp:32
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::impl::socket_supplier_t
Definition: acceptor.hpp:42
restinio::impl::socket_supplier_t< tls_socket_t >::move_socket
auto move_socket(std::size_t idx)
Definition: tls.hpp:382
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::connection_state::tls_accessor_t
Accessor to TLS-specific information related to a connection.
Definition: tls.hpp:31
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::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
Type of object that tells that new connection has been accepted.
Definition: connection_state_listener.hpp:36
restinio::impl::socket_supplier_t< tls_socket_t >::socket
tls_socket_t & socket(std::size_t idx)
Definition: tls.hpp:374
restinio::traits_t
Definition: traits.hpp:33
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::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(asio_ns::ssl::context context) &
Setup an exclusive TLS-context for server's settings.
Definition: tls.hpp:201
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::impl::tls_socket_t
Socket adapter for asio::ssl::stream< asio::ip::tcp::socket >.
Definition: tls_socket.hpp:37
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_supplier_t
socket_supplier_t(Settings &settings, asio_ns::io_context &io_context)
Definition: tls.hpp:357
restinio::impl::socket_supplier_t::m_sockets
std::vector< Socket > m_sockets
A temporary socket for receiving new connections.
Definition: acceptor.hpp:96
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
Extra settings needed for working with socket.
Definition: settings.hpp:155
restinio::connection_state::tls_accessor_t::tls_accessor_t
tls_accessor_t(tls_socket_t &tls_socket)
Definition: tls.hpp:35
restinio::impl::socket_supplier_t< tls_socket_t >::~socket_supplier_t
virtual ~socket_supplier_t()=default
restinio
Definition: asio_include.hpp:21
restinio::default_request_handler_t
std::function< request_handling_status_t(request_handle_t) > default_request_handler_t
Definition: request_handler.hpp:189
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::socket_type_dependent_settings_t< Settings, tls_socket_t >::~socket_type_dependent_settings_t
~socket_type_dependent_settings_t()=default
nonstd::optional_lite::swap
void swap(optional< T > &x, optional< T > &y)
Definition: optional.hpp:1619
restinio::socket_type_dependent_settings_t< Settings, tls_socket_t >::tls_context
asio_ns::ssl::context tls_context()
Definition: tls.hpp:302
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
traits.hpp
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::impl::tls_socket_t::async_handshake
auto async_handshake(Args &&... args)
Definition: tls_socket.hpp:162
const
#define const
Definition: zconf.h:230