From b1bb2b7eccdfb20d068f2a166795cb94279f86e9 Mon Sep 17 00:00:00 2001 From: yhirose Date: Sat, 14 Mar 2026 19:26:31 -0400 Subject: [PATCH] Implement setup_proxy_connection method for SSLClient and refactor proxy handling in open_stream --- httplib.h | 82 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 46 insertions(+), 36 deletions(-) diff --git a/httplib.h b/httplib.h index d84ca92f..2ed3801d 100644 --- a/httplib.h +++ b/httplib.h @@ -2191,6 +2191,10 @@ protected: virtual bool create_and_connect_socket(Socket &socket, Error &error); virtual bool ensure_socket_connection(Socket &socket, Error &error); + virtual bool setup_proxy_connection( + Socket &socket, + std::chrono::time_point start_time, + Response &res, bool &success, Error &error); // All of: // shutdown_ssl @@ -2717,6 +2721,10 @@ private: std::function callback) override; bool is_ssl() const override; + bool setup_proxy_connection( + Socket &socket, + std::chrono::time_point start_time, + Response &res, bool &success, Error &error) override; bool connect_with_proxy( Socket &sock, std::chrono::time_point start_time, @@ -12140,6 +12148,13 @@ inline bool ClientImpl::ensure_socket_connection(Socket &socket, Error &error) { return create_and_connect_socket(socket, error); } +inline bool ClientImpl::setup_proxy_connection( + Socket & /*socket*/, + std::chrono::time_point /*start_time*/, + Response & /*res*/, bool & /*success*/, Error & /*error*/) { + return true; +} + inline void ClientImpl::shutdown_ssl(Socket & /*socket*/, bool /*shutdown_gracefully*/) { // If there are any requests in flight from threads other than us, then it's @@ -12261,27 +12276,14 @@ inline bool ClientImpl::send_(Request &req, Response &res, Error &error) { return false; } -#ifdef CPPHTTPLIB_SSL_ENABLED - // TODO: refactoring - if (is_ssl()) { - auto &scli = static_cast(*this); - if (!proxy_host_.empty() && proxy_port_ != -1) { - auto success = false; - if (!scli.connect_with_proxy(socket_, req.start_time_, res, success, - error)) { - if (!success) { output_error_log(error, &req); } - return success; - } - } - - if (!proxy_host_.empty() && proxy_port_ != -1) { - if (!scli.initialize_ssl(socket_, error)) { - output_error_log(error, &req); - return false; - } + { + auto success = true; + if (!setup_proxy_connection(socket_, req.start_time_, res, success, + error)) { + if (!success) { output_error_log(error, &req); } + return success; } } -#endif } // Mark the current socket as being in use so that it cannot be closed by @@ -12413,7 +12415,6 @@ ClientImpl::open_stream(const std::string &method, const std::string &path, handle.response = detail::make_unique(); handle.error = Error::Success; - auto start_time = std::chrono::steady_clock::now(); auto query_path = params.empty() ? path : append_query_params(path, params); handle.connection_ = detail::make_unique(); @@ -12443,24 +12444,15 @@ ClientImpl::open_stream(const std::string &method, const std::string &path, return handle; } -#ifdef CPPHTTPLIB_SSL_ENABLED - if (is_ssl()) { - auto &scli = static_cast(*this); - if (!proxy_host_.empty() && proxy_port_ != -1) { - auto success = false; - if (!scli.connect_with_proxy(socket_, start_time, *handle.response, - success, handle.error)) { - if (!success) { handle.response.reset(); } - return handle; - } - - if (!scli.initialize_ssl(socket_, handle.error)) { - handle.response.reset(); - return handle; - } + { + auto success = true; + auto start_time = std::chrono::steady_clock::now(); + if (!setup_proxy_connection(socket_, start_time, *handle.response, + success, handle.error)) { + if (!success) { handle.response.reset(); } + return handle; } } -#endif } transfer_socket_ownership_to_handle(handle); @@ -15437,6 +15429,24 @@ inline bool SSLClient::create_and_connect_socket(Socket &socket, Error &error) { return ClientImpl::create_and_connect_socket(socket, error); } +inline bool SSLClient::setup_proxy_connection( + Socket &socket, + std::chrono::time_point start_time, + Response &res, bool &success, Error &error) { + if (proxy_host_.empty() || proxy_port_ == -1) { return true; } + + if (!connect_with_proxy(socket, start_time, res, success, error)) { + return false; + } + + if (!initialize_ssl(socket, error)) { + success = false; + return false; + } + + return true; +} + // Assumes that socket_mutex_ is locked and that there are no requests in // flight inline bool SSLClient::connect_with_proxy(