@@ -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