From 74cf5d422ba29709a2633969785f9fe1a40c16b6 Mon Sep 17 00:00:00 2001 From: Leander Beernaert Date: Fri, 24 Feb 2023 12:45:13 +0100 Subject: [PATCH] fix(GODT-2390): Missing changes from pervious commit Always reports error type to sentry. Add error checks for get event as well. --- internal/bridge/user_events.go | 18 ++++++++++++++++-- internal/user/user.go | 27 +++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/internal/bridge/user_events.go b/internal/bridge/user_events.go index 923bd8e5..4422b27f 100644 --- a/internal/bridge/user_events.go +++ b/internal/bridge/user_events.go @@ -19,6 +19,7 @@ package bridge import ( "context" + "errors" "fmt" "github.com/ProtonMail/gluon/reporter" @@ -142,7 +143,7 @@ func (bridge *Bridge) handleUserDeauth(ctx context.Context, user *user.User) { func (bridge *Bridge) handleUserBadEvent(ctx context.Context, user *user.User, err error) { safe.Lock(func() { if rerr := bridge.reporter.ReportMessageWithContext("Failed to handle event", reporter.Context{ - "error_type": fmt.Sprintf("%T", err), + "error_type": fmt.Sprintf("%T", getUnwrappedError(err)), "error": err, }); rerr != nil { logrus.WithError(rerr).Error("Failed to report failed event handling") @@ -154,9 +155,22 @@ func (bridge *Bridge) handleUserBadEvent(ctx context.Context, user *user.User, e func (bridge *Bridge) handleUncategorizedErrorEvent(event events.UncategorizedEventError) { if rerr := bridge.reporter.ReportMessageWithContext("Failed to handle due to uncategorized error", reporter.Context{ - "error_type": fmt.Sprintf("%T", event.Error), + "error_type": fmt.Sprintf("%T", getUnwrappedError(event.Error)), "error": event.Error, }); rerr != nil { logrus.WithError(rerr).Error("Failed to report failed event handling") } } + +func getUnwrappedError(err error) error { + for { + unwrapped := errors.Unwrap(err) + if unwrapped == nil { + break + } + + err = unwrapped + } + + return err +} diff --git a/internal/user/user.go b/internal/user/user.go index f993f5e9..3d942696 100644 --- a/internal/user/user.go +++ b/internal/user/user.go @@ -627,6 +627,33 @@ func (user *User) doEventPoll(ctx context.Context) error { event, err := user.client.GetEvent(ctx, user.vault.EventID()) if err != nil { + if netErr := new(proton.NetError); errors.As(err, &netErr) { + return fmt.Errorf("failed to get event due to network issue: %w", err) + } + + // Catch all for uncategorized net errors that may slip through. + if netErr := new(net.OpError); errors.As(err, &netErr) { + user.eventCh.Enqueue(events.UncategorizedEventError{ + UserID: user.ID(), + Error: err, + }) + + return fmt.Errorf("failed to get event due to network issues (uncategorized): %w", err) + } + + // In case a json decode error slips through. + if jsonErr := new(json.UnmarshalTypeError); errors.As(err, &jsonErr) { + user.eventCh.Enqueue(events.UncategorizedEventError{ + UserID: user.ID(), + Error: err, + }) + } + + // If the error is a server-side issue, return error to retry later. + if apiErr := new(proton.APIError); errors.As(err, &apiErr) && apiErr.Status >= 500 { + return fmt.Errorf("failed to get event due to server error: %w", err) + } + return fmt.Errorf("failed to get event: %w", err) }