Skip to content

Commit d38c8e3

Browse files
committed
Implement io.ReaderFrom/WriterTo for Conn
This change increase performance when proxying wrapped connections using io.Copy. Since go 1.11 copying between tcp connections uses the splice system call on linux yielding considerable performance improvments. See: https://golang.org/doc/go1.11#net Signed-off-by: Fabian Ruff <[email protected]>
1 parent fff0abf commit d38c8e3

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

protocol.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package proxyproto
22

33
import (
44
"bufio"
5+
"io"
56
"net"
67
"sync"
78
"time"
@@ -237,3 +238,21 @@ func (p *Conn) readHeader() error {
237238

238239
return err
239240
}
241+
242+
// ReadFrom implements the io.ReaderFrom ReadFrom method
243+
func (p *Conn) ReadFrom(r io.Reader) (int64, error) {
244+
if rf, ok := p.conn.(io.ReaderFrom); ok {
245+
return rf.ReadFrom(r)
246+
}
247+
return io.Copy(p.conn, r)
248+
}
249+
250+
// WriteTo implements io.WriterTo
251+
func (p *Conn) WriteTo(w io.Writer) (int64, error) {
252+
var err error
253+
p.once.Do(func() { p.readErr = p.readHeader() })
254+
if err != nil {
255+
return 0, err
256+
}
257+
return p.bufReader.WriteTo(w)
258+
}

0 commit comments

Comments
 (0)