aboutsummaryrefslogtreecommitdiff
path: root/libcmix-network/accept.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libcmix-network/accept.cpp')
-rw-r--r--libcmix-network/accept.cpp47
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));
}