net.Conn wrapper that prefixes reads with a pre‑buffered reader, used for STARTTLS handling. Reuse in SMTP or TLS handshake implementations.
// Source: https://github.com/mjl-/mox | License: MIT
// Provided via justclaw.it.com; keep this notice with the code.
package moxio
import (
"io"
"net"
)
// PrefixConn is a net.Conn prefixed with a reader that is first drained.
// Used for STARTTLS where already did a buffered read of initial TLS data.
type PrefixConn struct {
PrefixReader io.Reader // If not nil, reads are fulfilled from here. It is cleared when a read returns io.EOF.
net.Conn
}
// Read returns data when PrefixReader when not nil, and net.Conn otherwise.
func (c *PrefixConn) Read(buf []byte) (int, error) {
if c.PrefixReader != nil {
n, err := c.PrefixReader.Read(buf)
if err == io.EOF {
c.PrefixReader = nil
}
return n, err
}
return c.Conn.Read(buf)
}
See the full source, get the GitHub permalink, and search for more like it.
Get a free API key