mirror of
https://github.com/XTLS/Xray-core.git
synced 2026-01-12 21:57:15 +08:00
Tunnel/Dokodemo: Fix stats conn unwrap (#5440)
Fixes https://github.com/XTLS/Xray-core/issues/5439
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user