mirror of
https://github.com/mjl-/mox.git
synced 2025-07-10 10:34:40 +03:00
mox!
This commit is contained in:
55
message/writer.go
Normal file
55
message/writer.go
Normal file
@ -0,0 +1,55 @@
|
||||
package message
|
||||
|
||||
import (
|
||||
"io"
|
||||
)
|
||||
|
||||
// Writer is a write-through helper, collecting properties about the written
|
||||
// message.
|
||||
type Writer struct {
|
||||
Writer io.Writer
|
||||
HaveHeaders bool
|
||||
Has8bit bool // Whether a byte with the high/8bit has been read. So whether this is 8BITMIME instead of 7BIT.
|
||||
Size int64
|
||||
tail [3]byte // For detecting crlfcrlf.
|
||||
// todo: should be parsing headers here, as we go
|
||||
}
|
||||
|
||||
// Write implements io.Writer.
|
||||
func (w *Writer) Write(buf []byte) (int, error) {
|
||||
if !w.HaveHeaders && len(buf) > 0 {
|
||||
get := func(i int) byte {
|
||||
if i < 0 {
|
||||
return w.tail[3+i]
|
||||
}
|
||||
return buf[i]
|
||||
}
|
||||
|
||||
for i, b := range buf {
|
||||
if b == '\n' && get(i-3) == '\r' && get(i-2) == '\n' && get(i-1) == '\r' {
|
||||
w.HaveHeaders = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
n := len(buf)
|
||||
if n > 3 {
|
||||
n = 3
|
||||
}
|
||||
copy(w.tail[:], w.tail[n:])
|
||||
copy(w.tail[3-n:], buf[len(buf)-n:])
|
||||
}
|
||||
if !w.Has8bit {
|
||||
for _, b := range buf {
|
||||
if b&0x80 != 0 {
|
||||
w.Has8bit = true
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
n, err := w.Writer.Write(buf)
|
||||
if n > 0 {
|
||||
w.Size += int64(n)
|
||||
}
|
||||
return n, err
|
||||
}
|
Reference in New Issue
Block a user