diff --git a/lib/responses/errors.go b/lib/responses/errors.go index e35a88c..6172be6 100644 --- a/lib/responses/errors.go +++ b/lib/responses/errors.go @@ -1,6 +1,7 @@ package responses import ( + "encoding/json" "net/http" "github.com/getsentry/sentry-go" @@ -43,7 +44,7 @@ func HTTPErrorHandler(err error, c echo.Context) { return } c.Logger().Error(err) - if hub := sentryecho.GetHubFromContext(c); hub != nil { + if hub := sentryecho.GetHubFromContext(c); hub != nil && isErrResponseAllowedForSentry(errToErrorResponse(err)) { hub.WithScope(func(scope *sentry.Scope) { scope.SetExtra("UserID", c.Get("UserID")) hub.CaptureException(err) @@ -58,3 +59,30 @@ func HTTPErrorHandler(err error, c echo.Context) { } // TODO: use an error matching the error code } + +// this is a simple way to try to convert err.Message interface to ErrorResponse +// without external packages +func errToErrorResponse(err error) *ErrorResponse { + he, ok := err.(*echo.HTTPError) + if !ok { + return nil + } + + heJson, err := json.Marshal(he.Message) + if err != nil { + return nil + } + + heBadResponse := &ErrorResponse{} + err = json.Unmarshal(heJson, heBadResponse) + if err != nil { + return nil + } + + return heBadResponse +} + +// currently only bad auth errors are not allowed +func isErrResponseAllowedForSentry(errResponse *ErrorResponse) bool { + return errResponse != nil && errResponse.Code != BadAuthError.Code +}