#include "accept.hpp" #include #include using namespace boost::asio::ip; using namespace boost::asio; void accept_connection(tcp::acceptor& acceptor, tcp::socket* socket, boost::system::error_code ec, AcceptHandler f) { if(!bool(ec)) { f(std::unique_ptr(socket)); accept_loop(acceptor, f); } else { 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, AcceptHandler f) { 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 ctx, ssl::stream* socket, boost::system::error_code ec, SSLAcceptHandler f) { if(!bool(ec)) { socket->async_handshake(boost::asio::ssl::stream_base::server, [ctx, socket, f](boost::system::error_code const& ec2) { if(!bool(ec2)) { f(std::unique_ptr>(socket), ctx); } else { std::stringstream ss; ss << ec2.message(); delete socket; throw std::runtime_error(ss.str()); } }); accept_loop(acceptor, ctx, f); } else { 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 ctx, SSLAcceptHandler f) { ssl::stream* new_socket = new ssl::stream(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)); }