Compare commits

...

1 Commits

Author SHA1 Message Date
f41gh7
91bbb591bf wip
Signed-off-by: f41gh7 <nik@victoriametrics.com>
2025-08-05 20:00:06 +02:00
2 changed files with 47 additions and 31 deletions

View File

@@ -2,9 +2,11 @@ package netutil
import (
"encoding/binary"
"errors"
"fmt"
"io"
"net"
"sync"
"time"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/bytesutil"
@@ -12,36 +14,58 @@ import (
type proxyProtocolConn struct {
net.Conn
once sync.Once
remoteAddr net.Addr
readErr error
}
func newProxyProtocolConn(c net.Conn) (net.Conn, error) {
// Limit the time needed for reading the proxy protocol header.
d := time.Now().Add(5 * time.Second)
if err := c.SetReadDeadline(d); err != nil {
return nil, fmt.Errorf("cannot set deadline for reading proxy protocol header: %w", err)
}
remoteAddr, err := readProxyProto(c)
if err != nil {
return nil, fmt.Errorf("proxy protocol error: %w", err)
}
if remoteAddr == nil {
remoteAddr = c.RemoteAddr()
}
// Reset the read deadline.
if err := c.SetReadDeadline(time.Time{}); err != nil {
return nil, fmt.Errorf("cannot reset deadline after reading proxy protocol header: %w", err)
}
func newProxyProtocolConn(c net.Conn) net.Conn {
return &proxyProtocolConn{
Conn: c,
remoteAddr: remoteAddr,
}, nil
Conn: c,
}
}
func (ppc *proxyProtocolConn) init() {
ppc.once.Do(func() {
// Limit the time needed for reading the proxy protocol header.
d := time.Now().Add(5 * time.Second)
if err := ppc.Conn.SetReadDeadline(d); err != nil {
ppc.readErr = fmt.Errorf("cannot set deadline for reading proxy protocol header: %w", err)
return
}
addr, err := readProxyProto(ppc.Conn)
if err != nil {
if !errors.Is(err, io.EOF) {
proxyProtocolReadErrorLogger.Errorf("cannot read proxy proto conn for TCP addr %q: %s", ppc.Conn.RemoteAddr(), err)
}
ppc.remoteAddr = ppc.Conn.RemoteAddr()
ppc.readErr = err
return
}
if err := ppc.Conn.SetReadDeadline(time.Time{}); err != nil {
ppc.readErr = fmt.Errorf("cannot set deadline for reading proxy protocol header: %w", err)
return
}
if addr == nil {
addr = ppc.Conn.RemoteAddr()
}
ppc.remoteAddr = addr
})
}
func (ppc *proxyProtocolConn) Read(p []byte) (int, error) {
ppc.init()
if ppc.readErr != nil {
return 0, ppc.readErr
}
return ppc.Conn.Read(p)
}
func (ppc *proxyProtocolConn) RemoteAddr() net.Addr {
ppc.init()
if ppc.readErr != nil {
return ppc.Conn.RemoteAddr()
}
return ppc.remoteAddr
}

View File

@@ -5,7 +5,6 @@ import (
"errors"
"flag"
"fmt"
"io"
"net"
"time"
@@ -102,14 +101,7 @@ func (ln *TCPListener) Accept() (net.Conn, error) {
return nil, err
}
if ln.useProxyProtocol {
pConn, err := newProxyProtocolConn(conn)
if err != nil {
if !errors.Is(err, io.EOF) {
proxyProtocolReadErrorLogger.Errorf("cannot read proxy proto conn for TCP addr %q: %s", ln.Addr(), err)
}
_ = conn.Close()
continue
}
pConn := newProxyProtocolConn(conn)
conn = pConn
}
ln.cm.conns.Inc()