|
|
@ -28,6 +28,7 @@ import (
|
|
|
|
"github.com/xtls/xray-core/transport"
|
|
|
|
"github.com/xtls/xray-core/transport"
|
|
|
|
"github.com/xtls/xray-core/transport/internet"
|
|
|
|
"github.com/xtls/xray-core/transport/internet"
|
|
|
|
"github.com/xtls/xray-core/transport/internet/stat"
|
|
|
|
"github.com/xtls/xray-core/transport/internet/stat"
|
|
|
|
|
|
|
|
"github.com/xtls/xray-core/transport/internet/tls"
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
var useSplice bool
|
|
|
|
var useSplice bool
|
|
|
@ -225,9 +226,16 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
|
|
|
|
writeConn = inbound.Conn
|
|
|
|
writeConn = inbound.Conn
|
|
|
|
inTimer = inbound.Timer
|
|
|
|
inTimer = inbound.Timer
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return proxy.CopyRawConnIfExist(ctx, conn, writeConn, link.Writer, timer, inTimer)
|
|
|
|
if !isTLSConn(conn) { // it would be tls conn in special use case of MITM, we need to let link handle traffic
|
|
|
|
|
|
|
|
return proxy.CopyRawConnIfExist(ctx, conn, writeConn, link.Writer, timer, inTimer)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
var reader buf.Reader
|
|
|
|
|
|
|
|
if destination.Network == net.Network_TCP {
|
|
|
|
|
|
|
|
reader = buf.NewReader(conn)
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
reader = NewPacketReader(conn, UDPOverride)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
reader := NewPacketReader(conn, UDPOverride)
|
|
|
|
|
|
|
|
if err := buf.Copy(reader, output, buf.UpdateActivity(timer)); err != nil {
|
|
|
|
if err := buf.Copy(reader, output, buf.UpdateActivity(timer)); err != nil {
|
|
|
|
return errors.New("failed to process response").Base(err)
|
|
|
|
return errors.New("failed to process response").Base(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -245,6 +253,19 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func isTLSConn(conn stat.Connection) bool {
|
|
|
|
|
|
|
|
if conn != nil {
|
|
|
|
|
|
|
|
statConn, ok := conn.(*stat.CounterConnection)
|
|
|
|
|
|
|
|
if ok {
|
|
|
|
|
|
|
|
conn = statConn.Connection
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, ok := conn.(*tls.Conn); ok {
|
|
|
|
|
|
|
|
return true
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func NewPacketReader(conn net.Conn, UDPOverride net.Destination) buf.Reader {
|
|
|
|
func NewPacketReader(conn net.Conn, UDPOverride net.Destination) buf.Reader {
|
|
|
|
iConn := conn
|
|
|
|
iConn := conn
|
|
|
|
statConn, ok := iConn.(*stat.CounterConnection)
|
|
|
|
statConn, ok := iConn.(*stat.CounterConnection)
|
|
|
|