mirror of
https://github.com/mjl-/mox.git
synced 2024-12-27 08:53:48 +03:00
361bc2b516
because that is what most of the code expects. we could work around having bare lf, but it would complicate too much code. currently, a message with bare lf is accepted (in smtpserver delivery, imapserver append, etc), but when an imap session would try to fetch parsed parts, that would fail because and even cause a imapserver panic (closing the connection). in message imports we would already convert bare lf to crlf (because it is expected those messages are all lf-only-ending). we store messages with crlf-ending instead of lf-ending so the imapserver has all correct information at hand (line counts, byte counts). found by using emclient with mox. it adds a message to the inbox that can have mixed crlf and bare lf line endings in a few header fields (in some localization, emclient authors explained how that happened, thanks!). we can now convert those lines and read those messages over imap. emclient already switched to all-crlf line endings in newer (development) versions.
55 lines
1.3 KiB
Go
55 lines
1.3 KiB
Go
package message
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestMsgWriter(t *testing.T) {
|
|
check := func(data string, want bool) {
|
|
t.Helper()
|
|
|
|
b := &strings.Builder{}
|
|
mw := NewWriter(b)
|
|
if _, err := mw.Write([]byte(data)); err != nil {
|
|
t.Fatalf("write for message %q: %s", data, err)
|
|
}
|
|
if mw.HaveBody != want {
|
|
t.Fatalf("got %v, expected %v, for message %q", mw.HaveBody, want, data)
|
|
}
|
|
|
|
b = &strings.Builder{}
|
|
mw = NewWriter(b)
|
|
for i := range data {
|
|
if _, err := mw.Write([]byte(data[i : i+1])); err != nil {
|
|
t.Fatalf("write for message %q: %s", data, err)
|
|
}
|
|
}
|
|
if mw.HaveBody != want {
|
|
t.Fatalf("got %v, expected %v, for message %q", mw.HaveBody, want, data)
|
|
}
|
|
}
|
|
|
|
check("no header", false)
|
|
check("no header\r\n", false)
|
|
check("key: value\r\n\r\n", true)
|
|
check("key: value\r\n\r\nbody", true)
|
|
check("key: value\n\nbody", true)
|
|
check("key: value\n\r\nbody", true)
|
|
check("key: value\r\rbody", false)
|
|
check("\r\n\r\n", true)
|
|
check("\r\n\r\nbody", true)
|
|
check("\r\nbody", true)
|
|
|
|
// Check \n is replaced with \r\n.
|
|
var b strings.Builder
|
|
mw := NewWriter(&b)
|
|
msg := "key: value\n\nline1\r\nline2\n"
|
|
_, err := mw.Write([]byte(msg))
|
|
tcheck(t, err, "write")
|
|
got := b.String()
|
|
exp := "key: value\r\n\r\nline1\r\nline2\r\n"
|
|
if got != exp {
|
|
t.Fatalf("got %q, expected %q", got, exp)
|
|
}
|
|
}
|