Tunnel/Dokodemo: Fix stats conn unwrap (#5440)

Fixes https://github.com/XTLS/Xray-core/issues/5439
This commit is contained in:
风扇滑翔翼
2025-12-23 17:44:54 +08:00
committed by GitHub
parent a6792dda69
commit fa64775f07
8 changed files with 18 additions and 26 deletions

View File

@@ -111,7 +111,8 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn st
destinationOverridden = true destinationOverridden = true
} }
} }
if tlsConn, ok := conn.(tls.Interface); ok && !destinationOverridden { iConn := stat.TryUnwrapStatsConn(conn)
if tlsConn, ok := iConn.(tls.Interface); ok && !destinationOverridden {
if serverName := tlsConn.HandshakeContextServerName(ctx); serverName != "" { if serverName := tlsConn.HandshakeContextServerName(ctx); serverName != "" {
dest.Address = net.DomainAddress(serverName) dest.Address = net.DomainAddress(serverName)
destinationOverridden = true destinationOverridden = true

View File

@@ -296,10 +296,7 @@ func setUpHTTPTunnel(ctx context.Context, dest net.Destination, target string, u
return nil, err return nil, err
} }
iConn := rawConn iConn := stat.TryUnwrapStatsConn(rawConn)
if statConn, ok := iConn.(*stat.CounterConnection); ok {
iConn = statConn.Connection
}
nextProto := "" nextProto := ""
if tlsConn, ok := iConn.(*tls.Conn); ok { if tlsConn, ok := iConn.(*tls.Conn); ok {

View File

@@ -787,10 +787,7 @@ func readV(ctx context.Context, reader buf.Reader, writer buf.Writer, timer sign
} }
func IsRAWTransportWithoutSecurity(conn stat.Connection) bool { func IsRAWTransportWithoutSecurity(conn stat.Connection) bool {
iConn := conn iConn := stat.TryUnwrapStatsConn(conn)
if statConn, ok := iConn.(*stat.CounterConnection); ok {
iConn = statConn.Connection
}
_, ok1 := iConn.(*proxyproto.Conn) _, ok1 := iConn.(*proxyproto.Conn)
_, ok2 := iConn.(*net.TCPConn) _, ok2 := iConn.(*net.TCPConn)
_, ok3 := iConn.(*internet.UnixConnWrapper) _, ok3 := iConn.(*internet.UnixConnWrapper)

View File

@@ -147,11 +147,7 @@ func (s *Server) Network() []net.Network {
// Process implements proxy.Inbound.Process(). // Process implements proxy.Inbound.Process().
func (s *Server) Process(ctx context.Context, network net.Network, conn stat.Connection, dispatcher routing.Dispatcher) error { func (s *Server) Process(ctx context.Context, network net.Network, conn stat.Connection, dispatcher routing.Dispatcher) error {
iConn := conn iConn := stat.TryUnwrapStatsConn(conn)
statConn, ok := iConn.(*stat.CounterConnection)
if ok {
iConn = statConn.Connection
}
sessionPolicy := s.policyManager.ForLevel(0) sessionPolicy := s.policyManager.ForLevel(0)
if err := conn.SetReadDeadline(time.Now().Add(sessionPolicy.Timeouts.Handshake)); err != nil { if err := conn.SetReadDeadline(time.Now().Add(sessionPolicy.Timeouts.Handshake)); err != nil {

View File

@@ -265,10 +265,7 @@ func (*Handler) Network() []net.Network {
// Process implements proxy.Inbound.Process(). // Process implements proxy.Inbound.Process().
func (h *Handler) Process(ctx context.Context, network net.Network, connection stat.Connection, dispatcher routing.Dispatcher) error { func (h *Handler) Process(ctx context.Context, network net.Network, connection stat.Connection, dispatcher routing.Dispatcher) error {
iConn := connection iConn := stat.TryUnwrapStatsConn(connection)
if statConn, ok := iConn.(*stat.CounterConnection); ok {
iConn = statConn.Connection
}
if h.decryption != nil { if h.decryption != nil {
var err error var err error

View File

@@ -192,10 +192,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
ob.Conn = conn // for Vision's pre-connect ob.Conn = conn // for Vision's pre-connect
iConn := conn iConn := stat.TryUnwrapStatsConn(conn)
if statConn, ok := iConn.(*stat.CounterConnection); ok {
iConn = statConn.Connection
}
target := ob.Target target := ob.Target
errors.LogInfo(ctx, "tunneling request to ", target, " via ", rec.Destination.NetAddr()) errors.LogInfo(ctx, "tunneling request to ", target, " via ", rec.Destination.NetAddr())

View File

@@ -229,10 +229,7 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s
return errors.New("unable to set read deadline").Base(err).AtWarning() return errors.New("unable to set read deadline").Base(err).AtWarning()
} }
iConn := connection iConn := stat.TryUnwrapStatsConn(connection)
if statConn, ok := iConn.(*stat.CounterConnection); ok {
iConn = statConn.Connection
}
_, isDrain := iConn.(*net.TCPConn) _, isDrain := iConn.(*net.TCPConn)
if !isDrain { if !isDrain {
_, isDrain = iConn.(*net.UnixConn) _, isDrain = iConn.(*net.UnixConn)

View File

@@ -32,3 +32,13 @@ func (c *CounterConnection) Write(b []byte) (int, error) {
} }
return nBytes, err return nBytes, err
} }
func TryUnwrapStatsConn(conn net.Conn) net.Conn {
if conn == nil {
return conn
}
if conn, ok := conn.(*CounterConnection); ok {
return conn.Connection
}
return conn
}