package server import ( "errors" "net/http" "music-server/internal/logging" "github.com/labstack/echo/v5" "go.uber.org/zap" ) // httpErrorHandler writes errors from Echo (unknown routes, panics, ...) as an APIError, like Huma does. func httpErrorHandler(c *echo.Context, err error) { if r, _ := echo.UnwrapResponse(c.Response()); r != nil && r.Committed { return } code := http.StatusInternalServerError message := http.StatusText(code) var he *echo.HTTPError var sc echo.HTTPStatusCoder switch { case errors.As(err, &he): code = he.Code message = he.Message case errors.As(err, &sc): code = sc.StatusCode() } if code >= http.StatusInternalServerError && he == nil { logging.GetLogger().Error("Unhandled error", zap.String("path", c.Request().URL.Path), zap.Error(err)) } if message == "" { message = http.StatusText(code) } if c.Request().Method == http.MethodHead { _ = c.NoContent(code) return } _ = c.JSON(code, &APIError{Message: message}) }