diff --git a/lib/asio_client_session_tls_impl.cc b/lib/asio_client_session_tls_impl.cc index 377886c..407e1f7 100644 --- a/lib/asio_client_session_tls_impl.cc +++ b/lib/asio_client_session_tls_impl.cc @@ -44,6 +44,26 @@ session_tls_impl::session_tls_impl( } } +session_tls_impl::session_tls_impl( + boost::asio::io_service &io_service, boost::asio::ssl::context &tls_ctx, + const boost::asio::ip::tcp::endpoint &local_endpoint, + const std::string &host, const std::string &service, + const boost::posix_time::time_duration &connect_timeout) + : session_impl(io_service, connect_timeout), socket_(io_service, tls_ctx) { + // this local_endpoint binding is needed + socket_.open(local_endpoint.protocol()); + boost::asio::socket_base::reuse_address option(true); + socket_.set_option(option); + socket_.bind(local_endpoint); + // this callback setting is no effect is + // ssl::context::set_verify_mode(boost::asio::ssl::verify_peer) is + // not used, which is what we want. + socket_.set_verify_callback(boost::asio::ssl::rfc2818_verification(host)); + auto ssl = socket_.native_handle(); + if (!util::numeric_host(host.c_str())) { + SSL_set_tlsext_host_name(ssl, host.c_str()); + } +} session_tls_impl::~session_tls_impl() {} void session_tls_impl::start_connect(tcp::resolver::iterator endpoint_it) { diff --git a/lib/asio_client_session_tls_impl.h b/lib/asio_client_session_tls_impl.h index 645c60f..f11b513 100644 --- a/lib/asio_client_session_tls_impl.h +++ b/lib/asio_client_session_tls_impl.h @@ -43,6 +43,11 @@ class session_tls_impl : public session_impl { boost::asio::ssl::context &tls_ctx, const std::string &host, const std::string &service, const boost::posix_time::time_duration &connect_timeout); + session_tls_impl(boost::asio::io_service &io_service, + boost::asio::ssl::context &tls_ctx, + const boost::asio::ip::tcp::endpoint &local_endpoint, + const std::string &host,const std::string &service, + const boost::posix_time::time_duration &connect_timeout); virtual ~session_tls_impl(); virtual void start_connect(tcp::resolver::iterator endpoint_it);