RESTinio
Loading...
Searching...
No Matches
tls.hpp
Go to the documentation of this file.
1/*
2 restinio
3*/
4
9#pragma once
10
11#include <restinio/traits.hpp>
13
14namespace restinio
15{
16
17namespace connection_state
18{
19
94
95//
96// The implementation of TLS-related part of notice_t.
97//
98
99template< typename Lambda >
100void
106
107template< typename Lambda >
108decltype(auto)
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
118template< typename Lambda, typename T >
119T
121{
122 if( m_tls_socket )
124
125 return default_value;
126}
127
128} /* namespace connection_state */
129
130//
131// tls_traits_t
132//
133
134template <
135 typename Timer_Factory,
136 typename Logger,
138 typename Strand = asio_ns::strand< default_asio_executor > >
140
141//
142// single_thread_traits_t
143//
144
145template <
146 typename Timer_Factory,
147 typename Logger,
151
153
154//
155// prepare_connection_and_start_read()
156//
157
160template < typename Connection, typename Start_Read_CB, typename Failed_CB >
161void
163 tls_socket_t & socket,
164 Connection & con,
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
188template < typename Settings >
190{
191protected:
193
194public:
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
295
301 std::shared_ptr< asio_ns::ssl::context >
303 {
304 return std::move(m_tls_context);
305 }
306
307 private:
308 Settings &
310 {
311 return static_cast< Settings & >( *this );
312 }
313
314 std::shared_ptr< asio_ns::ssl::context > m_tls_context{
315 std::make_shared< asio_ns::ssl::context >(
316 asio_ns::ssl::context::sslv23 )
317 };
318};
319
320namespace impl
321{
322
323// An overload for the case of non-TLS-connection.
324inline tls_socket_t *
326 tls_socket_t & socket ) noexcept
327{
328 return &socket;
329}
330
331//
332// socket_supplier_t
333//
334
336template <>
338{
339 protected:
340 template < typename Settings >
343 asio_ns::io_context & io_context )
344 : m_tls_context{ settings.giveaway_tls_context() }
345 , m_io_context{ io_context }
346 {
347 m_sockets.reserve( settings.concurrent_accepts_count() );
348
349 while( m_sockets.size() < settings.concurrent_accepts_count() )
350 {
351 m_sockets.emplace_back( m_io_context, m_tls_context );
352 }
353 }
354
355 virtual ~socket_supplier_t() = default;
356
360 std::size_t idx )
361 {
362 return m_sockets.at( idx );
363 }
364
365 auto
368 std::size_t idx )
369 {
370 tls_socket_t res{ m_io_context, m_tls_context };
371 std::swap( res, m_sockets.at( idx ) );
372 return res;
373 }
374
377 auto
379 {
380 return m_sockets.size();
381 }
382
383 private:
384 std::shared_ptr< asio_ns::ssl::context > m_tls_context;
385 asio_ns::io_context & m_io_context;
386 std::vector< tls_socket_t > m_sockets;
387};
388
389} /* namespace impl */
390
391} /* namespace restinio */
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
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
tls_socket_t * m_tls_socket
An optional pointer to TLS-related connection.
void try_inspect_tls(Lambda &&lambda) const
Calls the specified lambda-function if the accepted connection is a TLS-connection.
Definition tls.hpp:101
Accessor to TLS-specific information related to a connection.
Definition tls.hpp:31
tls_accessor_t(tls_socket_t &tls_socket)
Definition tls.hpp:35
auto native_handle() const noexcept
Get the access to native handle behind Asio's ssl_stream.
Definition tls.hpp:89
Exception class for all exceptions thrown by RESTinio.
Definition exception.hpp:26
tls_socket_t & socket(std::size_t idx)
Definition tls.hpp:358
auto concurrent_accept_sockets_count() const
The number of sockets that can be used for cuncurrent accept operations.
Definition tls.hpp:378
std::shared_ptr< asio_ns::ssl::context > m_tls_context
Definition tls.hpp:384
std::vector< tls_socket_t > m_sockets
Definition tls.hpp:386
socket_supplier_t(Settings &settings, asio_ns::io_context &io_context)
Definition tls.hpp:341
std::vector< Socket > m_sockets
A temporary socket for receiving new connections.
Definition acceptor.hpp:96
asio_ns::io_context & m_io_context
io_context for sockets to run on.
Definition acceptor.hpp:92
Socket adapter for asio::ssl::stream< asio::ip::tcp::socket >.
auto async_handshake(Args &&... args)
socket_t & asio_ssl_stream()
Get an access to underlying Asio's socket.
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
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
Settings && tls_context(asio_ns::ssl::context context) &&
Setup an exclusive TLS-context for server's settings.
Definition tls.hpp:211
socket_type_dependent_settings_t(socket_type_dependent_settings_t &&)=default
Settings & tls_context(asio_ns::ssl::context context) &
Setup an exclusive TLS-context for server's settings.
Definition tls.hpp:201
std::shared_ptr< asio_ns::ssl::context > giveaway_tls_context()
Get away the TLS-context from settings.
Definition tls.hpp:302
Extra settings needed for working with socket.
Definition settings.hpp:154
tls_socket_t * make_tls_socket_pointer_for_state_listener(asio_ns::ip::tcp::socket &) noexcept
std::function< request_handling_status_t(request_handle_t) > default_request_handler_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.
impl::tls_socket_t tls_socket_t
A public alias for the actual implementation of TLS-socket.
Definition tls_fwd.hpp:30
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