diff options
Diffstat (limited to 'libcmix-network/accept.cpp')
| -rw-r--r-- | libcmix-network/accept.cpp | 47 |
1 files changed, 33 insertions, 14 deletions
diff --git a/libcmix-network/accept.cpp b/libcmix-network/accept.cpp index 3fa4314..1ec26fe 100644 --- a/libcmix-network/accept.cpp +++ b/libcmix-network/accept.cpp @@ -7,42 +7,61 @@ using namespace boost::asio::ip; using namespace boost::asio; -void accept_connection(tcp::acceptor& acceptor, std::shared_ptr<tcp::socket> socket, boost::system::error_code ec, std::function<void (tcp::socket&&)> f) +void accept_connection(tcp::acceptor& acceptor, tcp::socket* socket, boost::system::error_code ec, AcceptHandler f) { if(!bool(ec)) { - f(std::move(*socket)); + f(std::unique_ptr<tcp::socket>(socket)); accept_loop(acceptor, f); } else { - std::stringstream ss; - ss << ec; - throw std::runtime_error(ss.str()); + if(ec != boost::system::errc::operation_canceled) { + std::stringstream ss; + ss << ec.message(); + delete socket; + throw std::runtime_error(ss.str()); + } else { + delete socket; + } } } -void accept_loop(tcp::acceptor& acceptor, std::function<void (tcp::socket&&)> f) +void accept_loop(tcp::acceptor& acceptor, AcceptHandler f) { - std::shared_ptr<tcp::socket> new_socket = std::make_shared<tcp::socket>(acceptor.get_io_service()); + tcp::socket* new_socket = new tcp::socket(acceptor.get_io_service()); acceptor.async_accept(*new_socket, boost::bind(accept_connection, boost::ref(acceptor), new_socket, placeholders::error, f)); } -void accept_connection(tcp::acceptor& acceptor, std::shared_ptr<ssl::context> ctx, std::shared_ptr<ssl::stream<tcp::socket>> socket, boost::system::error_code ec, std::function<void (ssl::stream<tcp::socket>&&)> f) +void accept_connection(tcp::acceptor& acceptor, std::shared_ptr<ssl::context> ctx, ssl::stream<tcp::socket>* socket, boost::system::error_code ec, SSLAcceptHandler f) { if(!bool(ec)) { - f(std::move(*socket)); + socket->async_handshake(boost::asio::ssl::stream_base::server, [&acceptor, ctx, socket, f](boost::system::error_code const& ec) { + if(!bool(ec)) { + f(std::unique_ptr<ssl::stream<tcp::socket>>(socket), ctx); + } else { + std::stringstream ss; + ss << ec.message(); + delete socket; + throw std::runtime_error(ss.str()); + } + }); accept_loop(acceptor, ctx, f); } else { - std::stringstream ss; - ss << ec; - throw std::runtime_error(ss.str()); + if(ec != boost::system::errc::operation_canceled) { + std::stringstream ss; + ss << ec; + delete socket; + throw std::runtime_error(ss.str()); + } else { + delete socket; + } } } -void accept_loop(tcp::acceptor& acceptor, std::shared_ptr<ssl::context> ctx, std::function<void(ssl::stream<tcp::socket>&& socket)> f) { +void accept_loop(tcp::acceptor& acceptor, std::shared_ptr<ssl::context> ctx, SSLAcceptHandler f) { - std::shared_ptr<ssl::stream<tcp::socket>> new_socket = std::make_shared<ssl::stream<tcp::socket>>(acceptor.get_io_service(), *ctx); + ssl::stream<tcp::socket>* new_socket = new ssl::stream<tcp::socket>(acceptor.get_io_service(), *ctx); acceptor.async_accept(new_socket->lowest_layer(), boost::bind(accept_connection, boost::ref(acceptor), ctx, new_socket, placeholders::error, f)); } |
