From f0ce5a87c697f6eebef0ddf5397ad5d7afac3933 Mon Sep 17 00:00:00 2001 From: Nova Date: Tue, 9 Jun 2026 12:41:12 +0000 Subject: [PATCH] refactor: extract RegistryError helper to reduce cyclomatic complexity The inline context.Canceled checks in get-server-details and get-server-versions handlers pushed RegisterServersEndpoints cyclomatic complexity to 24 (max 20). Extract a shared RegistryError helper that handles context.Canceled, logging, and 500 responses, reducing complexity back under the limit. Also adds context.Canceled checks to both handlers (matching the pattern already used in ListServersError for the list handler). --- internal/api/handlers/v0/registry_error.go | 22 ++++++++++++++++++++++ internal/api/handlers/v0/servers.go | 7 ++----- 2 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 internal/api/handlers/v0/registry_error.go diff --git a/internal/api/handlers/v0/registry_error.go b/internal/api/handlers/v0/registry_error.go new file mode 100644 index 00000000..9517089c --- /dev/null +++ b/internal/api/handlers/v0/registry_error.go @@ -0,0 +1,22 @@ +package v0 + +import ( + "context" + "errors" + "log" + + "github.com/danielgtaylor/huma/v2" +) + +// RegistryError maps registry errors to HTTP responses; client disconnects +// must not log as 500s. +func RegistryError(ctx context.Context, err error, logPrefix string, userMsg string) error { + if err == nil { + return nil + } + if errors.Is(err, context.Canceled) || errors.Is(ctx.Err(), context.Canceled) { + return huma.NewError(499, "Client closed request", err) + } + log.Printf("%s failed: %v", logPrefix, err) + return huma.Error500InternalServerError(userMsg) +} diff --git a/internal/api/handlers/v0/servers.go b/internal/api/handlers/v0/servers.go index 059095d2..43d39859 100644 --- a/internal/api/handlers/v0/servers.go +++ b/internal/api/handlers/v0/servers.go @@ -3,7 +3,6 @@ package v0 import ( "context" "errors" - "log" "net/http" "net/url" "reflect" @@ -185,8 +184,7 @@ func RegisterServersEndpoints(api huma.API, pathPrefix string, registry service. if err.Error() == errRecordNotFound || errors.Is(err, database.ErrNotFound) { return nil, huma.Error404NotFound("Server not found") } - log.Printf("get server details (%q/%q) failed: %v", serverName, version, err) - return nil, huma.Error500InternalServerError("Failed to get server details") + return nil, RegistryError(ctx, err, "get server details ("+serverName+"/"+version+")", "Failed to get server details") } return &Response[apiv0.ServerResponse]{ @@ -215,8 +213,7 @@ func RegisterServersEndpoints(api huma.API, pathPrefix string, registry service. if err.Error() == errRecordNotFound || errors.Is(err, database.ErrNotFound) { return nil, huma.Error404NotFound("Server not found") } - log.Printf("get server versions (%q) failed: %v", serverName, err) - return nil, huma.Error500InternalServerError("Failed to get server versions") + return nil, RegistryError(ctx, err, "get server versions ("+serverName+")", "Failed to get server versions") } // Convert []*ServerResponse to []ServerResponse