feat: parse most header values

This commit is contained in:
James Houlahan
2020-07-02 12:50:09 +02:00
parent 953150cfdb
commit 45b863f931
5 changed files with 147 additions and 658 deletions

View File

@ -22,7 +22,6 @@ import (
"io"
"io/ioutil"
"math/rand"
"net/mail"
"os"
"path/filepath"
"testing"
@ -31,90 +30,6 @@ import (
"golang.org/x/text/encoding/charmap"
)
func TestRFC822AddressFormat(t *testing.T) { //nolint[funlen]
tests := []struct {
address string
expected []string
}{
{
" normal name <username@server.com>",
[]string{
"\"normal name\" <username@server.com>",
},
},
{
" \"comma, name\" <username@server.com>",
[]string{
"\"comma, name\" <username@server.com>",
},
},
{
" name <username@server.com> (ignore comment)",
[]string{
"\"name\" <username@server.com>",
},
},
{
" name (ignore comment) <username@server.com>, (Comment as name) username2@server.com",
[]string{
"\"name\" <username@server.com>",
"<username2@server.com>",
},
},
{
" normal name <username@server.com>, (comment)All.(around)address@(the)server.com",
[]string{
"\"normal name\" <username@server.com>",
"<All.address@server.com>",
},
},
{
" normal name <username@server.com>, All.(\"comma, in comment\")address@(the)server.com",
[]string{
"\"normal name\" <username@server.com>",
"<All.address@server.com>",
},
},
{
" \"normal name\" <username@server.com>, \"comma, name\" <address@server.com>",
[]string{
"\"normal name\" <username@server.com>",
"\"comma, name\" <address@server.com>",
},
},
{
" \"comma, one\" <username@server.com>, \"comma, two\" <address@server.com>",
[]string{
"\"comma, one\" <username@server.com>",
"\"comma, two\" <address@server.com>",
},
},
{
" \"comma, name\" <username@server.com>, another, name <address@server.com>",
[]string{
"\"comma, name\" <username@server.com>",
"\"another, name\" <address@server.com>",
},
},
}
for _, data := range tests {
uncommented := parseAddressComment(data.address)
result, err := mail.ParseAddressList(uncommented)
if err != nil {
t.Errorf("Can not parse '%s' created from '%s': %v", uncommented, data.address, err)
}
if len(result) != len(data.expected) {
t.Errorf("Wrong parsing of '%s' created from '%s': expected '%s' but have '%+v'", uncommented, data.address, data.expected, result)
}
for i, result := range result {
if data.expected[i] != result.String() {
t.Errorf("Wrong parsing\nof %q\ncreated from %q:\nexpected %q\nbut have %q", uncommented, data.address, data.expected, result.String())
}
}
}
}
func f(filename string) io.ReadCloser {
f, err := os.Open(filepath.Join("testdata", filename))
@ -149,7 +64,7 @@ func TestParseMessageTextPlain(t *testing.T) {
f := f("text_plain.eml")
defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f, "", "")
m, mimeBody, plainContents, atts, err := Parse(f)
assert.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
@ -166,7 +81,7 @@ func TestParseMessageTextPlainUTF8(t *testing.T) {
f := f("text_plain_utf8.eml")
defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f, "", "")
m, mimeBody, plainContents, atts, err := Parse(f)
assert.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
@ -183,7 +98,7 @@ func TestParseMessageTextPlainLatin1(t *testing.T) {
f := f("text_plain_latin1.eml")
defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f, "", "")
m, mimeBody, plainContents, atts, err := Parse(f)
assert.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
@ -200,7 +115,7 @@ func TestParseMessageTextPlainUnknownCharsetIsActuallyLatin1(t *testing.T) {
f := f("text_plain_unknown_latin1.eml")
defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f, "", "")
m, mimeBody, plainContents, atts, err := Parse(f)
assert.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
@ -217,7 +132,7 @@ func TestParseMessageTextPlainUnknownCharsetIsActuallyLatin2(t *testing.T) {
f := f("text_plain_unknown_latin2.eml")
defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f, "", "")
m, mimeBody, plainContents, atts, err := Parse(f)
assert.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
@ -240,7 +155,7 @@ func TestParseMessageTextPlainAlready7Bit(t *testing.T) {
f := f("text_plain_7bit.eml")
defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f, "", "")
m, mimeBody, plainContents, atts, err := Parse(f)
assert.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
@ -257,7 +172,7 @@ func TestParseMessageTextPlainWithOctetAttachment(t *testing.T) {
f := f("text_plain_octet_attachment.eml")
defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f, "", "")
m, mimeBody, plainContents, atts, err := Parse(f)
assert.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
@ -313,7 +228,7 @@ func TestParseMessageTextPlainWithPlainAttachment(t *testing.T) {
f := f("text_plain_plain_attachment.eml")
defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f, "", "")
m, mimeBody, plainContents, atts, err := Parse(f)
assert.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
@ -331,7 +246,7 @@ func TestParseMessageTextPlainWithImageInline(t *testing.T) {
f := f("text_plain_image_inline.eml")
defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f, "", "")
m, mimeBody, plainContents, atts, err := Parse(f)
assert.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
@ -353,7 +268,7 @@ func TestParseMessageWithMultipleTextParts(t *testing.T) {
f := f("multiple_text_parts.eml")
defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f, "", "")
m, mimeBody, plainContents, atts, err := Parse(f)
assert.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
@ -372,7 +287,7 @@ func TestParseMessageTextHTML(t *testing.T) {
f := f("text_html.eml")
defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f, "", "")
m, mimeBody, plainContents, atts, err := Parse(f)
assert.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
@ -391,7 +306,7 @@ func TestParseMessageTextHTMLAlready7Bit(t *testing.T) {
f := f("text_html_7bit.eml")
defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f, "", "")
m, mimeBody, plainContents, atts, err := Parse(f)
assert.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
@ -410,7 +325,7 @@ func TestParseMessageTextHTMLWithOctetAttachment(t *testing.T) {
f := f("text_html_octet_attachment.eml")
defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f, "", "")
m, mimeBody, plainContents, atts, err := Parse(f)
assert.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
@ -431,7 +346,7 @@ func _TestParseMessageTextHTMLWithPlainAttachment(t *testing.T) { // nolint[dead
f := f("text_html_plain_attachment.eml")
defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f, "", "")
m, mimeBody, plainContents, atts, err := Parse(f)
assert.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
@ -452,7 +367,7 @@ func TestParseMessageTextHTMLWithImageInline(t *testing.T) {
f := f("text_html_image_inline.eml")
defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f, "", "")
m, mimeBody, plainContents, atts, err := Parse(f)
assert.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
@ -471,6 +386,7 @@ func TestParseMessageTextHTMLWithImageInline(t *testing.T) {
}
// NOTE: Enable when bug is fixed.
/*
func _TestParseMessageWithAttachedPublicKey(t *testing.T) { // nolint[deadcode]
f := f("text_plain.eml")
defer func() { _ = f.Close() }()
@ -489,6 +405,7 @@ func _TestParseMessageWithAttachedPublicKey(t *testing.T) { // nolint[deadcode]
// BAD: Public key not available as an attachment!
assert.Len(t, atts, 1)
}
*/
// NOTE: Enable when bug is fixed.
func _TestParseMessageTextHTMLWithEmbeddedForeignEncoding(t *testing.T) { // nolint[deadcode]
@ -497,7 +414,7 @@ func _TestParseMessageTextHTMLWithEmbeddedForeignEncoding(t *testing.T) { // nol
f := f("text_html_embedded_foreign_encoding.eml")
defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f, "", "")
m, mimeBody, plainContents, atts, err := Parse(f)
assert.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())