diff --git a/httplib.h b/httplib.h index 107b0988..9bd653bd 100644 --- a/httplib.h +++ b/httplib.h @@ -10725,14 +10725,11 @@ inline bool process_client_socket_ssl( tls::session_t session, socket_t sock, time_t read_timeout_sec, time_t read_timeout_usec, time_t write_timeout_sec, time_t write_timeout_usec, time_t max_timeout_msec, - std::chrono::time_point start_time, T callback, - tls::TlsError *tls_error = nullptr) { + std::chrono::time_point start_time, T callback) { SSLSocketStream strm(sock, session, read_timeout_sec, read_timeout_usec, write_timeout_sec, write_timeout_usec, max_timeout_msec, start_time); - auto ret = callback(strm); - if (tls_error) { *tls_error = strm.tls_error(); } - return ret; + return callback(strm); } inline std::pair make_digest_authentication_header( @@ -15224,14 +15221,6 @@ inline bool ClientImpl::read_response_line(Stream &strm, const Request &req, inline bool ClientImpl::send(Request &req, Response &res, Error &error) { std::lock_guard request_mutex_guard(request_mutex_); -#ifdef CPPHTTPLIB_SSL_ENABLED - // Don't let an earlier request's TLS error show up in this one's Result. A - // client that failed to set up its TLS context keeps reporting why. - if (is_valid()) { - last_ssl_error_ = 0; - last_backend_error_ = 0; - } -#endif auto ret = send_(req, res, error); if (error == Error::SSLPeerCouldBeClosed_) { assert(!ret); @@ -15243,6 +15232,15 @@ inline bool ClientImpl::send(Request &req, Response &res, Error &error) { } inline bool ClientImpl::send_(Request &req, Response &res, Error &error) { +#ifdef CPPHTTPLIB_SSL_ENABLED + // Don't let an earlier attempt's TLS error show up in this one's Result. A + // client that failed to set up its TLS context keeps reporting why. + if (is_valid()) { + last_ssl_error_ = 0; + last_backend_error_ = 0; + } +#endif + { std::lock_guard guard(socket_mutex_); @@ -15341,6 +15339,10 @@ inline Result ClientImpl::send(const Request &req) { inline Result ClientImpl::send_(Request &&req) { auto res = detail::make_unique(); auto error = Error::Success; +#ifdef CPPHTTPLIB_SSL_ENABLED + // Hold the request lock until the Result has read this request's TLS error + std::lock_guard request_mutex_guard(request_mutex_); +#endif auto ret = send(req, *res, error); #ifdef CPPHTTPLIB_SSL_ENABLED return Result{ret ? std::move(res) : nullptr, error, std::move(req.headers), @@ -16413,6 +16415,10 @@ inline Result ClientImpl::send_with_content_provider_and_receiver( auto error = Error::Success; +#ifdef CPPHTTPLIB_SSL_ENABLED + // Hold the request lock until the Result has read this request's TLS error + std::lock_guard request_mutex_guard(request_mutex_); +#endif auto res = send_with_content_provider_and_receiver( req, body, content_length, std::move(content_provider), std::move(content_provider_without_length), content_type, @@ -18578,20 +18584,21 @@ inline bool SSLClient::process_socket( std::chrono::time_point start_time, std::function callback) { assert(socket.ssl); - tls::TlsError tls_error; - auto ret = detail::process_client_socket_ssl( + return detail::process_client_socket_ssl( socket.ssl, socket.sock, read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, write_timeout_usec_, max_timeout_msec_, start_time, - std::move(callback), &tls_error); - - // A request that failed after the handshake reports Error::Read or - // Error::Write; keep the TLS error behind it, such as a fatal alert from - // the server, for Result::ssl_error() and ssl_backend_error() - if (!ret && tls_error.code != tls::ErrorCode::Success) { - last_ssl_error_ = static_cast(tls_error.code); - last_backend_error_ = tls_error.backend_code; - } - return ret; + [&](detail::SSLSocketStream &strm) { + auto ret = callback(strm); + // A request that failed after the handshake reports Error::Read or + // Error::Write; keep the TLS error behind it, such as a fatal alert + // from the server, for Result::ssl_error() and ssl_backend_error() + const auto &tls_error = strm.tls_error(); + if (!ret && tls_error.code != tls::ErrorCode::Success) { + last_ssl_error_ = static_cast(tls_error.code); + last_backend_error_ = tls_error.backend_code; + } + return ret; + }); } inline bool SSLClient::is_ssl() const { return true; }