aboutsummaryrefslogtreecommitdiffstats
path: root/include/crow/socket_adaptors.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/crow/socket_adaptors.h')
-rw-r--r--include/crow/socket_adaptors.h112
1 files changed, 112 insertions, 0 deletions
diff --git a/include/crow/socket_adaptors.h b/include/crow/socket_adaptors.h
new file mode 100644
index 0000000..eebd50f
--- /dev/null
+++ b/include/crow/socket_adaptors.h
@@ -0,0 +1,112 @@
+#pragma once
+#include <boost/asio.hpp>
+#ifdef CROW_ENABLE_SSL
+#include <boost/asio/ssl.hpp>
+#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 <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;
+ using ssl_socket_t = boost::asio::ssl::stream<tcp::socket>;
+ SSLAdaptor(boost::asio::io_service& io_service, context* ctx)
+ : ssl_socket_(new ssl_socket_t(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();
+ }
+
+ boost::asio::io_service& get_io_service()
+ {
+ return raw_socket().get_io_service();
+ }
+
+ 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);
+ });
+ }
+
+ std::unique_ptr<boost::asio::ssl::stream<tcp::socket>> ssl_socket_;
+ };
+#endif
+}