@@ -152,24 +152,17 @@ Connection::is_open()
152152 return socket_->is_open ();
153153}
154154
155- bool
156- Connection::is_v6 ()
157- {
158- return endpoint_.address ().is_v6 ();
159- }
160-
161155bool
162156Connection::is_ssl ()
163157{
164158 return ssl_ctx_ ? true : false ;
165159}
166160
167161void
168- Connection::set_endpoint (const asio::ip::tcp::endpoint& endpoint, const asio::ssl::verify_mode verify_mode)
162+ Connection::set_ssl_verification (const asio::ip::tcp::endpoint& endpoint, const asio::ssl::verify_mode verify_mode)
169163{
170- endpoint_ = endpoint;
171164 if (ssl_ctx_ and verify_mode != asio::ssl::verify_none){
172- auto hostname = endpoint_ .address ().to_string ();
165+ auto hostname = endpoint .address ().to_string ();
173166 ssl_socket_->asio_ssl_stream ().set_verify_mode (verify_mode);
174167 ssl_socket_->asio_ssl_stream ().set_verify_callback (
175168 [this , hostname](bool preverified, asio::ssl::verify_context& ctx) -> bool {
@@ -187,6 +180,17 @@ Connection::set_endpoint(const asio::ip::tcp::endpoint& endpoint, const asio::ss
187180 }
188181}
189182
183+ void
184+ Connection::set_ssl_verification (SSLVerifyCb verify_cb, const asio::ssl::verify_mode verify_mode)
185+ {
186+ if (ssl_ctx_ and verify_mode != asio::ssl::verify_none){
187+ ssl_socket_->asio_ssl_stream ().set_verify_mode (verify_mode);
188+ ssl_socket_->asio_ssl_stream ().set_verify_callback (verify_cb);
189+ if (logger_)
190+ logger_->d (" [http:client] [connection:%i] ssl verify callback set" , id_);
191+ }
192+ }
193+
190194asio::streambuf&
191195Connection::input ()
192196{
@@ -606,6 +610,13 @@ Request::add_on_body_callback(OnDataCb cb)
606610 cbs_->on_body = std::move (cb);
607611}
608612
613+ void
614+ Request::add_on_ssl_verify_callback (SSLVerifyCb cb)
615+ {
616+ std::lock_guard<std::mutex> lock (cbs_mutex_);
617+ cbs_->ssl_verify = std::move (cb);
618+ }
619+
609620void
610621Request::add_on_state_change_callback (OnStateChangeCb cb)
611622{
@@ -748,9 +759,11 @@ Request::connect(std::vector<asio::ip::tcp::endpoint>&& endpoints, HandlerCb cb)
748759 logger_->d (" [http:client] [request:%i] connect success" , id_);
749760
750761 if (get_url ().protocol == " https" ){
751- if (certificate_)
752- conn_->set_endpoint (endpoint, asio::ssl::verify_peer
753- | asio::ssl::verify_fail_if_no_peer_cert);
762+ auto verify_mode = asio::ssl::verify_peer | asio::ssl::verify_fail_if_no_peer_cert;
763+ if (cbs_->ssl_verify )
764+ conn_->set_ssl_verification (cbs_->ssl_verify , verify_mode);
765+ else if (certificate_)
766+ conn_->set_ssl_verification (endpoint, verify_mode);
754767
755768 if (conn_ and conn_->is_open () and conn_->is_ssl ()){
756769 conn_->async_handshake ([this , cb](const asio::error_code& ec){
@@ -768,8 +781,6 @@ Request::connect(std::vector<asio::ip::tcp::endpoint>&& endpoints, HandlerCb cb)
768781 cb (asio::error::operation_aborted);
769782 return ;
770783 }
771- else
772- conn_->set_endpoint (endpoint, asio::ssl::verify_none);
773784 }
774785 if (cb)
775786 cb (ec);
0 commit comments