diff --git a/experimental/clashapi/trafficontrol/tracker.go b/experimental/clashapi/trafficontrol/tracker.go index a918908c..3155f340 100644 --- a/experimental/clashapi/trafficontrol/tracker.go +++ b/experimental/clashapi/trafficontrol/tracker.go @@ -79,6 +79,10 @@ func (tt *tcpTracker) Leave() { tt.manager.Leave(tt) } +func (tt *tcpTracker) Upstream() any { + return tt.Conn +} + func NewTCPTracker(conn net.Conn, manager *Manager, metadata Metadata, router adapter.Router, rule adapter.Rule) *tcpTracker { uuid, _ := uuid.NewV4() @@ -166,6 +170,10 @@ func (ut *udpTracker) Leave() { ut.manager.Leave(ut) } +func (ut *udpTracker) Upstream() any { + return ut.PacketConn +} + func NewUDPTracker(conn N.PacketConn, manager *Manager, metadata Metadata, router adapter.Router, rule adapter.Rule) *udpTracker { uuid, _ := uuid.NewV4() diff --git a/outbound/default.go b/outbound/default.go index d7319976..5149b570 100644 --- a/outbound/default.go +++ b/outbound/default.go @@ -49,6 +49,15 @@ func NewConnection(ctx context.Context, this N.Dialer, conn net.Conn, metadata a if err != nil { return N.HandshakeFailure(conn, err) } + if cachedReader, isCached := conn.(N.CachedReader); isCached { + payload := cachedReader.ReadCached() + if payload != nil && !payload.IsEmpty() { + _, err = outConn.Write(payload.Bytes()) + if err != nil { + return err + } + } + } return bufio.CopyConn(ctx, conn, outConn) } @@ -122,7 +131,7 @@ func connectPacketConnection(ctx context.Context, this N.Dialer, conn N.PacketCo } func CopyEarlyConn(ctx context.Context, conn net.Conn, serverConn net.Conn) error { - if cachedReader, isCached := serverConn.(N.CachedReader); isCached { + if cachedReader, isCached := conn.(N.CachedReader); isCached { payload := cachedReader.ReadCached() if payload != nil && !payload.IsEmpty() { _, err := serverConn.Write(payload.Bytes())