diff options
| author | Dan Engelbrecht <[email protected]> | 2026-04-14 10:22:49 +0200 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2026-04-14 10:22:49 +0200 |
| commit | d5288534079dc52e68c3dd63417743d244266975 (patch) | |
| tree | 502d4ef590e39d90f9384e6bf45d2b198e42f30d /src/zenserver/hub/httpproxyhandler.cpp | |
| parent | 5.8.4-pre3 (diff) | |
| download | archived-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.cpp | 30 |
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(); |