Implement setup_proxy_connection method for SSLClient and refactor proxy handling in open_stream

This commit is contained in:
yhirose committed 2026-03-14 19:26:31 -04:00
1 parent f6ed5fc60f
commit b1bb2b7ecc
1 file changed
+46 -36
+46 -36
View File
@@ -2191,6 +2191,10 @@ protected:
virtual bool create_and_connect_socket(Socket &socket, Error &error); virtual bool create_and_connect_socket(Socket &socket, Error &error);
virtual bool ensure_socket_connection(Socket &socket, Error &error); virtual bool ensure_socket_connection(Socket &socket, Error &error);
virtual bool setup_proxy_connection(
Socket &socket,
std::chrono::time_point<std::chrono::steady_clock> start_time,
Response &res, bool &success, Error &error);
// All of: // All of:
// shutdown_ssl // shutdown_ssl
@@ -2717,6 +2721,10 @@ private:
std::function<bool(Stream &strm)> callback) override; std::function<bool(Stream &strm)> callback) override;
bool is_ssl() const override; bool is_ssl() const override;
bool setup_proxy_connection(
Socket &socket,
std::chrono::time_point<std::chrono::steady_clock> start_time,
Response &res, bool &success, Error &error) override;
bool connect_with_proxy( bool connect_with_proxy(
Socket &sock, Socket &sock,
std::chrono::time_point<std::chrono::steady_clock> start_time, std::chrono::time_point<std::chrono::steady_clock> start_time,
@@ -12140,6 +12148,13 @@ inline bool ClientImpl::ensure_socket_connection(Socket &socket, Error &error) {
return create_and_connect_socket(socket, error); return create_and_connect_socket(socket, error);
} }
inline bool ClientImpl::setup_proxy_connection(
Socket & /*socket*/,
std::chrono::time_point<std::chrono::steady_clock> /*start_time*/,
Response & /*res*/, bool & /*success*/, Error & /*error*/) {
return true;
}
inline void ClientImpl::shutdown_ssl(Socket & /*socket*/, inline void ClientImpl::shutdown_ssl(Socket & /*socket*/,
bool /*shutdown_gracefully*/) { bool /*shutdown_gracefully*/) {
// If there are any requests in flight from threads other than us, then it's // 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; return false;
} }
#ifdef CPPHTTPLIB_SSL_ENABLED {
// TODO: refactoring auto success = true;
if (is_ssl()) { if (!setup_proxy_connection(socket_, req.start_time_, res, success,
auto &scli = static_cast<SSLClient &>(*this); error)) {
if (!proxy_host_.empty() && proxy_port_ != -1) { if (!success) { output_error_log(error, &req); }
auto success = false; return success;
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;
}
} }
} }
#endif
} }
// Mark the current socket as being in use so that it cannot be closed by // 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<Response>(); handle.response = detail::make_unique<Response>();
handle.error = Error::Success; handle.error = Error::Success;
auto start_time = std::chrono::steady_clock::now();
auto query_path = params.empty() ? path : append_query_params(path, params); auto query_path = params.empty() ? path : append_query_params(path, params);
handle.connection_ = detail::make_unique<ClientConnection>(); handle.connection_ = detail::make_unique<ClientConnection>();
@@ -12443,24 +12444,15 @@ ClientImpl::open_stream(const std::string &method, const std::string &path,
return handle; return handle;
} }
#ifdef CPPHTTPLIB_SSL_ENABLED {
if (is_ssl()) { auto success = true;
auto &scli = static_cast<SSLClient &>(*this); auto start_time = std::chrono::steady_clock::now();
if (!proxy_host_.empty() && proxy_port_ != -1) { if (!setup_proxy_connection(socket_, start_time, *handle.response,
auto success = false; success, handle.error)) {
if (!scli.connect_with_proxy(socket_, start_time, *handle.response, if (!success) { handle.response.reset(); }
success, handle.error)) { return handle;
if (!success) { handle.response.reset(); }
return handle;
}
if (!scli.initialize_ssl(socket_, handle.error)) {
handle.response.reset();
return handle;
}
} }
} }
#endif
} }
transfer_socket_ownership_to_handle(handle); 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); return ClientImpl::create_and_connect_socket(socket, error);
} }
inline bool SSLClient::setup_proxy_connection(
Socket &socket,
std::chrono::time_point<std::chrono::steady_clock> 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 // Assumes that socket_mutex_ is locked and that there are no requests in
// flight // flight
inline bool SSLClient::connect_with_proxy( inline bool SSLClient::connect_with_proxy(