1
0
mirror of https://github.com/jhillyerd/inbucket.git synced 2025-12-17 09:37:02 +00:00

storage: eliminate ReadBody, ReadRaw for #69

This commit is contained in:
James Hillyerd
2018-03-12 21:13:57 -07:00
parent 219862797e
commit 9be4eec31c
3 changed files with 14 additions and 53 deletions

View File

@@ -4,7 +4,6 @@ import (
"bufio" "bufio"
"fmt" "fmt"
"io" "io"
"io/ioutil"
"net/mail" "net/mail"
"os" "os"
"path/filepath" "path/filepath"
@@ -99,26 +98,6 @@ func (m *Message) rawPath() string {
return filepath.Join(m.mailbox.path, m.Fid+".raw") return filepath.Join(m.mailbox.path, m.Fid+".raw")
} }
// ReadBody opens the .raw portion of a Message and returns a MIMEBody object
func (m *Message) ReadBody() (body *enmime.Envelope, err error) {
file, err := os.Open(m.rawPath())
if err != nil {
return nil, err
}
defer func() {
if err := file.Close(); err != nil {
log.Errorf("Failed to close %q: %v", m.rawPath(), err)
}
}()
reader := bufio.NewReader(file)
mime, err := enmime.ReadEnvelope(reader)
if err != nil {
return nil, err
}
return mime, nil
}
// RawReader opens the .raw portion of a Message as an io.ReadCloser // RawReader opens the .raw portion of a Message as an io.ReadCloser
func (m *Message) RawReader() (reader io.ReadCloser, err error) { func (m *Message) RawReader() (reader io.ReadCloser, err error) {
file, err := os.Open(m.rawPath()) file, err := os.Open(m.rawPath())
@@ -128,26 +107,6 @@ func (m *Message) RawReader() (reader io.ReadCloser, err error) {
return file, nil return file, nil
} }
// ReadRaw opens the .raw portion of a Message and returns it as a string
func (m *Message) ReadRaw() (raw *string, err error) {
reader, err := m.RawReader()
if err != nil {
return nil, err
}
defer func() {
if err := reader.Close(); err != nil {
log.Errorf("Failed to close %q: %v", m.rawPath(), err)
}
}()
bodyBytes, err := ioutil.ReadAll(bufio.NewReader(reader))
if err != nil {
return nil, err
}
bodyString := string(bodyBytes)
return &bodyString, nil
}
// Append data to a newly opened Message, this will fail on a pre-existing Message and // Append data to a newly opened Message, this will fail on a pre-existing Message and
// after Close() is called. // after Close() is called.
func (m *Message) Append(data []byte) error { func (m *Message) Append(data []byte) error {
@@ -195,26 +154,32 @@ func (m *Message) Close() error {
} }
} }
// Fetch headers // Fetch envelope.
body, err := m.ReadBody() // TODO should happen outside of datastore.
r, err := m.RawReader()
if err != nil {
return err
}
env, err := enmime.ReadEnvelope(r)
_ = r.Close()
if err != nil { if err != nil {
return err return err
} }
// Only public fields are stored in gob, hence starting with capital F // Only public fields are stored in gob, hence starting with capital F
// Parse From address // Parse From address
if address, err := mail.ParseAddress(body.GetHeader("From")); err == nil { if address, err := mail.ParseAddress(env.GetHeader("From")); err == nil {
m.Ffrom = address m.Ffrom = address
} else { } else {
m.Ffrom = &mail.Address{Address: body.GetHeader("From")} m.Ffrom = &mail.Address{Address: env.GetHeader("From")}
} }
m.Fsubject = body.GetHeader("Subject") m.Fsubject = env.GetHeader("Subject")
// Turn the To header into a slice // Turn the To header into a slice
if addresses, err := body.AddressList("To"); err == nil { if addresses, err := env.AddressList("To"); err == nil {
m.Fto = addresses m.Fto = addresses
} else { } else {
m.Fto = []*mail.Address{{Address: body.GetHeader("To")}} m.Fto = []*mail.Address{{Address: env.GetHeader("To")}}
} }
// Refresh the index before adding our message // Refresh the index before adding our message

View File

@@ -337,7 +337,7 @@ func TestFSMissing(t *testing.T) {
assert.Nil(t, err) assert.Nil(t, err)
// Try to read parts of message // Try to read parts of message
_, err = msg.ReadBody() _, err = msg.RawReader()
assert.Error(t, err) assert.Error(t, err)
if t.Failed() { if t.Failed() {

View File

@@ -7,8 +7,6 @@ import (
"net/mail" "net/mail"
"sync" "sync"
"time" "time"
"github.com/jhillyerd/enmime"
) )
var ( var (
@@ -41,8 +39,6 @@ type StoreMessage interface {
Date() time.Time Date() time.Time
Subject() string Subject() string
RawReader() (reader io.ReadCloser, err error) RawReader() (reader io.ReadCloser, err error)
ReadBody() (body *enmime.Envelope, err error)
ReadRaw() (raw *string, err error)
Append(data []byte) error Append(data []byte) error
Close() error Close() error
String() string String() string