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:
@@ -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
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user