aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver/hub/httpproxyhandler.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2026-04-14 10:22:49 +0200
committerGitHub Enterprise <[email protected]>2026-04-14 10:22:49 +0200
commitd5288534079dc52e68c3dd63417743d244266975 (patch)
tree502d4ef590e39d90f9384e6bf45d2b198e42f30d /src/zenserver/hub/httpproxyhandler.cpp
parent5.8.4-pre3 (diff)
downloadarchived-zen-d5288534079dc52e68c3dd63417743d244266975.tar.xz
archived-zen-d5288534079dc52e68c3dd63417743d244266975.zip
Hub proxy returns graceful responses when an instance is unavailable instead of a generic bad gateway error (#956)
Diffstat (limited to 'src/zenserver/hub/httpproxyhandler.cpp')
-rw-r--r--src/zenserver/hub/httpproxyhandler.cpp30
1 files changed, 27 insertions, 3 deletions
diff --git a/src/zenserver/hub/httpproxyhandler.cpp b/src/zenserver/hub/httpproxyhandler.cpp
index 25842623a..235d7388f 100644
--- a/src/zenserver/hub/httpproxyhandler.cpp
+++ b/src/zenserver/hub/httpproxyhandler.cpp
@@ -202,7 +202,7 @@ HttpProxyHandler::HandleProxyRequest(HttpServerRequest& Request, std::string_vie
if (!m_ValidatePort(Port))
{
- Request.WriteResponse(HttpResponseCode::BadGateway, HttpContentType::kText, "target instance not available");
+ Request.WriteResponse(HttpResponseCode::NotFound, HttpContentType::kText, "target instance not available");
return;
}
@@ -271,9 +271,33 @@ HttpProxyHandler::HandleProxyRequest(HttpServerRequest& Request, std::string_vie
if (Response.Error)
{
+ if (!m_ValidatePort(Port))
+ {
+ Request.WriteResponse(HttpResponseCode::NotFound, HttpContentType::kText, "target instance not available");
+ return;
+ }
+
ZEN_WARN("proxy request to port {} failed: {}", Port, Response.Error->ErrorMessage);
- Request.WriteResponse(HttpResponseCode::BadGateway, HttpContentType::kText, "upstream request failed");
- return;
+ switch (Response.Error->ErrorCode)
+ {
+ case HttpClientErrorCode::kConnectionFailure:
+ case HttpClientErrorCode::kHostResolutionFailure:
+ return Request.WriteResponse(HttpResponseCode::NotFound,
+ HttpContentType::kText,
+ fmt::format("instance not reachable: {}", Response.Error->ErrorMessage));
+ case HttpClientErrorCode::kOperationTimedOut:
+ return Request.WriteResponse(HttpResponseCode::GatewayTimeout,
+ HttpContentType::kText,
+ fmt::format("upstream request timed out: {}", Response.Error->ErrorMessage));
+ case HttpClientErrorCode::kRequestCancelled:
+ return Request.WriteResponse(HttpResponseCode::ServiceUnavailable,
+ HttpContentType::kText,
+ fmt::format("upstream request cancelled: {}", Response.Error->ErrorMessage));
+ default:
+ return Request.WriteResponse(HttpResponseCode::BadGateway,
+ HttpContentType::kText,
+ fmt::format("upstream request failed: {}", Response.Error->ErrorMessage));
+ }
}
HttpContentType ContentType = Response.ResponsePayload.GetContentType();