diff --git a/lib/format/format.go b/lib/format/format.go index 42dd34a..055e2c7 100644 --- a/lib/format/format.go +++ b/lib/format/format.go @@ -83,6 +83,10 @@ func ParseMessageFormat(format string, timeFmt string, thisDayTimeFmt string, thisWeekTimeFmt string, thisYearTimeFmt string, ctx Ctx) ( string, []interface{}, error, ) { + if ctx.MsgInfo.Error != nil { + return "", nil, + errors.New("(unable to fetch header)") + } retval := make([]byte, 0, len(format)) var args []interface{} diff --git a/lib/msgstore.go b/lib/msgstore.go index 33c2439..a545f62 100644 --- a/lib/msgstore.go +++ b/lib/msgstore.go @@ -112,8 +112,9 @@ func (store *MessageStore) FetchHeaders(uids []uint32, } if len(toFetch) > 0 { store.worker.PostAction(&types.FetchMessageHeaders{Uids: toFetch}, func(msg types.WorkerMessage) { - if _, ok := msg.(*types.Error); ok { + if msg, ok := msg.(*types.Error); ok { for _, uid := range toFetch { + store.postInvalidMessageInfo(uid, msg.Error) delete(store.pendingHeaders, uid) } } @@ -124,6 +125,17 @@ func (store *MessageStore) FetchHeaders(uids []uint32, } } +func (store *MessageStore) postInvalidMessageInfo(uid uint32, err error) { + logging.Errorf("Unable to fetch header %d: %w", uid, err) + info := &models.MessageInfo{ + Envelope: &models.Envelope{}, + Flags: []models.Flag{models.SeenFlag}, + Uid: uid, + Error: err, + } + store.Update(&types.MessageInfo{Info: info}) +} + func (store *MessageStore) FetchFull(uids []uint32, cb func(*types.FullMessage)) { // TODO: this could be optimized by pre-allocating toFetch and trimming it // at the end. In practice we expect to get most messages back in one frame.