Skip to content

Commit f7fa186

Browse files
committed
protocol: avoid double buffering
Use buffer only to read the PROXY header. Users may use they own buffers with they own buffer sizes and pools - connection should respect that.
1 parent 2e5664f commit f7fa186

File tree

1 file changed

+28
-3
lines changed

1 file changed

+28
-3
lines changed

protocol.go

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ type Conn struct {
4444
readErr error
4545
conn net.Conn
4646
bufReader *bufio.Reader
47+
reader io.Reader
4748
header *Header
4849
ProxyHeaderPolicy Policy
4950
Validate Validator
@@ -129,9 +130,11 @@ func NewConn(conn net.Conn, opts ...func(*Conn)) *Conn {
129130
// For v2 the header length is at most 52 bytes plus the length of the TLVs.
130131
// We use 256 bytes to be safe.
131132
const bufSize = 256
133+
br := bufio.NewReaderSize(conn, bufSize)
132134

133135
pConn := &Conn{
134-
bufReader: bufio.NewReaderSize(conn, bufSize),
136+
bufReader: br,
137+
reader: io.MultiReader(br, conn),
135138
conn: conn,
136139
}
137140

@@ -153,7 +156,7 @@ func (p *Conn) Read(b []byte) (int, error) {
153156
return 0, p.readErr
154157
}
155158

156-
return p.bufReader.Read(b)
159+
return p.reader.Read(b)
157160
}
158161

159162
// Write wraps original conn.Write
@@ -335,5 +338,27 @@ func (p *Conn) WriteTo(w io.Writer) (int64, error) {
335338
if p.readErr != nil {
336339
return 0, p.readErr
337340
}
338-
return p.bufReader.WriteTo(w)
341+
342+
b := make([]byte, p.bufReader.Buffered())
343+
if _, err := p.bufReader.Read(b); err != nil {
344+
return 0, err // this should never as we read buffered data
345+
}
346+
347+
var n int64
348+
{
349+
nn, err := w.Write(b)
350+
n += int64(nn)
351+
if err != nil {
352+
return n, err
353+
}
354+
}
355+
{
356+
nn, err := io.Copy(w, p.conn)
357+
n += nn
358+
if err != nil {
359+
return n, err
360+
}
361+
}
362+
363+
return n, nil
339364
}

0 commit comments

Comments
 (0)