handle message unknown charset error
This change handles message parse errors by printing the error when the user tries to view the message. Specifically only handling unknown charset errors in this patch, but there are many types of invalid messages that can be handled in this way. aerc currently leaves certain messages in the msglist in the pending (spinner) state, and I'm unable to view or modify the message. aerc also only prints parse errors with message when they are initially loaded. This UX is a little better, because you can still see the header info about the message, and if you try to view it, you will see the specific error.
This commit is contained in:
parent
43c4f2f3ab
commit
0acb28645f
5 changed files with 104 additions and 2 deletions
worker/lib
65
worker/lib/parse_test.go
Normal file
65
worker/lib/parse_test.go
Normal file
|
@ -0,0 +1,65 @@
|
|||
package lib
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"git.sr.ht/~sircmpwn/aerc/models"
|
||||
)
|
||||
|
||||
func TestMessageInfoHandledError(t *testing.T) {
|
||||
rootDir := "testdata/message/invalid"
|
||||
msgFiles, err := ioutil.ReadDir(rootDir)
|
||||
die(err)
|
||||
|
||||
for _, fi := range msgFiles {
|
||||
if fi.IsDir() {
|
||||
continue
|
||||
}
|
||||
|
||||
p := fi.Name()
|
||||
t.Run(p, func(t *testing.T) {
|
||||
m := newMockRawMessageFromPath(filepath.Join(rootDir, p))
|
||||
mi, err := MessageInfo(m)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if perr := mi.Error; perr == nil {
|
||||
t.Fatal("Expected MessageInfo.Error, got none")
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
type mockRawMessage struct {
|
||||
body []byte
|
||||
}
|
||||
|
||||
func newMockRawMessage(body []byte) *mockRawMessage {
|
||||
return &mockRawMessage{
|
||||
body: body,
|
||||
}
|
||||
}
|
||||
|
||||
func newMockRawMessageFromPath(p string) *mockRawMessage {
|
||||
b, err := ioutil.ReadFile(p)
|
||||
die(err)
|
||||
return newMockRawMessage(b)
|
||||
}
|
||||
|
||||
func (m *mockRawMessage) NewReader() (io.Reader, error) {
|
||||
return bytes.NewReader(m.body), nil
|
||||
}
|
||||
func (m *mockRawMessage) ModelFlags() ([]models.Flag, error) { return nil, nil }
|
||||
func (m *mockRawMessage) Labels() ([]string, error) { return nil, nil }
|
||||
func (m *mockRawMessage) UID() uint32 { return 0 }
|
||||
|
||||
func die(err error) {
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue