aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/zenhttp/clients/httpclientcpr.cpp15
-rw-r--r--src/zenhttp/httpclient.cpp7
-rw-r--r--src/zenhttp/include/zenhttp/httpclient.h3
3 files changed, 25 insertions, 0 deletions
diff --git a/src/zenhttp/clients/httpclientcpr.cpp b/src/zenhttp/clients/httpclientcpr.cpp
index 6bc63db09..90dcfacbb 100644
--- a/src/zenhttp/clients/httpclientcpr.cpp
+++ b/src/zenhttp/clients/httpclientcpr.cpp
@@ -23,6 +23,21 @@ CreateCprHttpClient(std::string_view BaseUri, const HttpClientSettings& Connecti
static std::atomic<uint32_t> HttpClientRequestIdCounter{0};
+bool
+HttpClient::ErrorContext::IsConnectionError() const
+{
+ switch (static_cast<cpr::ErrorCode>(ErrorCode))
+ {
+ case cpr::ErrorCode::CONNECTION_FAILURE:
+ case cpr::ErrorCode::OPERATION_TIMEDOUT:
+ case cpr::ErrorCode::HOST_RESOLUTION_FAILURE:
+ case cpr::ErrorCode::PROXY_RESOLUTION_FAILURE:
+ return true;
+ default:
+ return false;
+ }
+}
+
// If we want to support different HTTP client implementations then we'll need to make this more abstract
HttpClientError::ResponseClass
diff --git a/src/zenhttp/httpclient.cpp b/src/zenhttp/httpclient.cpp
index 998eb27ea..1cfddb366 100644
--- a/src/zenhttp/httpclient.cpp
+++ b/src/zenhttp/httpclient.cpp
@@ -400,6 +400,13 @@ MeasureLatency(HttpClient& Client, std::string_view Url)
else
{
ErrorMessage = MeasureResponse.ErrorMessage(fmt::format("Unable to measure latency using {}", Url));
+
+ // Connection-level failures (timeout, refused, DNS) mean the endpoint is unreachable.
+ // Bail out immediately — retrying will just burn the connect timeout each time.
+ if (MeasureResponse.Error && MeasureResponse.Error->IsConnectionError())
+ {
+ break;
+ }
}
}
diff --git a/src/zenhttp/include/zenhttp/httpclient.h b/src/zenhttp/include/zenhttp/httpclient.h
index 41a7ce621..f00bbec63 100644
--- a/src/zenhttp/include/zenhttp/httpclient.h
+++ b/src/zenhttp/include/zenhttp/httpclient.h
@@ -125,6 +125,9 @@ public:
{
int ErrorCode;
std::string ErrorMessage;
+
+ /** True when the error is a transport-level connection failure (connect timeout, refused, DNS) */
+ bool IsConnectionError() const;
};
struct KeyValueMap