#pragma once #include #ifdef CROW_ENABLE_SSL #include #endif #include "crow/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) { } boost::asio::io_service& get_io_service() { return socket_.get_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 void start(F f) { f(boost::system::error_code()); } tcp::socket socket_; }; #ifdef CROW_ENABLE_SSL struct SSLAdaptor { using context = boost::asio::ssl::context; using ssl_socket_t = boost::asio::ssl::stream; SSLAdaptor(boost::asio::io_service& io_service, context* ctx) : ssl_socket_(new ssl_socket_t(io_service, *ctx)) { } boost::asio::ssl::stream& 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(); } boost::asio::io_service& get_io_service() { return raw_socket().get_io_service(); } template void start(F f) { ssl_socket_->async_handshake(boost::asio::ssl::stream_base::server, [f](const boost::system::error_code& ec) { f(ec); }); } std::unique_ptr> ssl_socket_; }; #endif }