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