diff options
Diffstat (limited to 'include/socket_adaptors.h')
-rw-r--r-- | include/socket_adaptors.h | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/include/socket_adaptors.h b/include/socket_adaptors.h new file mode 100644 index 0000000..201360c --- /dev/null +++ b/include/socket_adaptors.h @@ -0,0 +1,98 @@ +#pragma once +#include <boost/asio.hpp> +#include "settings.h" +namespace crow +{ + using namespace boost; + using tcp = asio::ip::tcp; + + struct SocketAdaptor + { + using context = void; + SocketAdaptor(boost::asio::io_service& io_service, context*) + : socket_(io_service) + { + } + + tcp::socket& raw_socket() + { + return socket_; + } + + tcp::socket& socket() + { + return socket_; + } + + tcp::endpoint remote_endpoint() + { + return socket_.remote_endpoint(); + } + + bool is_open() + { + return socket_.is_open(); + } + + void close() + { + socket_.close(); + } + + template <typename F> + void start(F f) + { + f(boost::system::error_code()); + } + + tcp::socket socket_; + }; + +#ifdef CROW_ENABLE_SSL + struct SSLAdaptor + { + using context = boost::asio::ssl::context; + SSLAdaptor(boost::asio::io_service& io_service, context* ctx) + : ssl_socket_(io_service, *ctx) + { + } + + boost::asio::ssl::stream<tcp::socket>& socket() + { + return ssl_socket_; + } + + tcp::socket::lowest_layer_type& + raw_socket() + { + return ssl_socket_.lowest_layer(); + } + + tcp::endpoint remote_endpoint() + { + return raw_socket().remote_endpoint(); + } + + bool is_open() + { + return raw_socket().is_open(); + } + + void close() + { + raw_socket().close(); + } + + template <typename F> + void start(F f) + { + ssl_socket_.async_handshake(boost::asio::ssl::stream_base::server, + [f](const boost::system::error_code& ec) { + f(ec); + }); + } + + boost::asio::ssl::stream<tcp::socket> ssl_socket_; + }; +#endif +} |