diff --git a/listener/shadowsocks/tcp.go b/listener/shadowsocks/tcp.go index b150e4cb..8ae269ed 100644 --- a/listener/shadowsocks/tcp.go +++ b/listener/shadowsocks/tcp.go @@ -8,6 +8,7 @@ import ( N "github.com/metacubex/mihomo/common/net" C "github.com/metacubex/mihomo/constant" LC "github.com/metacubex/mihomo/listener/config" + "github.com/metacubex/mihomo/listener/sing" "github.com/metacubex/mihomo/transport/shadowsocks/core" "github.com/metacubex/mihomo/transport/socks5" ) @@ -18,6 +19,7 @@ type Listener struct { listeners []net.Listener udpListeners []*UDPListener pickCipher core.Cipher + handler *sing.ListenerHandler } var _listener *Listener @@ -28,7 +30,17 @@ func New(config LC.ShadowsocksServer, tunnel C.Tunnel, additions ...inbound.Addi return nil, err } - sl := &Listener{false, config, nil, nil, pickCipher} + h, err := sing.NewListenerHandler(sing.ListenerConfig{ + Tunnel: tunnel, + Type: C.SHADOWSOCKS, + Additions: additions, + MuxOption: config.MuxOption, + }) + if err != nil { + return nil, err + } + + sl := &Listener{false, config, nil, nil, pickCipher, h} _listener = sl for _, addr := range strings.Split(config.Listen, ",") { @@ -107,7 +119,8 @@ func (l *Listener) HandleConn(conn net.Conn, tunnel C.Tunnel, additions ...inbou _ = conn.Close() return } - tunnel.HandleTCPConn(inbound.NewSocket(target, conn, C.SHADOWSOCKS, additions...)) + l.handler.HandleSocket(target, conn, additions...) + //tunnel.HandleTCPConn(inbound.NewSocket(target, conn, C.SHADOWSOCKS, additions...)) } func HandleShadowSocks(conn net.Conn, tunnel C.Tunnel, additions ...inbound.Addition) bool { diff --git a/listener/sing/sing.go b/listener/sing/sing.go index 0d4bb926..eb13e6c9 100644 --- a/listener/sing/sing.go +++ b/listener/sing/sing.go @@ -136,8 +136,8 @@ func (h *ListenerHandler) NewConnection(ctx context.Context, conn net.Conn, meta cMetadata.RawDstAddr = metadata.Destination.Unwrap().TCPAddr() } inbound.ApplyAdditions(cMetadata, inbound.WithDstAddr(metadata.Destination), inbound.WithSrcAddr(metadata.Source), inbound.WithInAddr(conn.LocalAddr())) - inbound.ApplyAdditions(cMetadata, getAdditions(ctx)...) inbound.ApplyAdditions(cMetadata, h.Additions...) + inbound.ApplyAdditions(cMetadata, getAdditions(ctx)...) h.Tunnel.HandleTCPConn(conn, cMetadata) // this goroutine must exit after conn unused return nil @@ -198,8 +198,8 @@ func (h *ListenerHandler) NewPacketConnection(ctx context.Context, conn network. cMetadata.RawDstAddr = dest.Unwrap().UDPAddr() } inbound.ApplyAdditions(cMetadata, inbound.WithDstAddr(dest), inbound.WithSrcAddr(metadata.Source), inbound.WithInAddr(conn.LocalAddr())) - inbound.ApplyAdditions(cMetadata, getAdditions(ctx)...) inbound.ApplyAdditions(cMetadata, h.Additions...) + inbound.ApplyAdditions(cMetadata, getAdditions(ctx)...) h.Tunnel.HandleUDPPacket(cPacket, cMetadata) } diff --git a/listener/sing/util.go b/listener/sing/util.go new file mode 100644 index 00000000..30630162 --- /dev/null +++ b/listener/sing/util.go @@ -0,0 +1,24 @@ +package sing + +import ( + "context" + "net" + + "github.com/metacubex/mihomo/adapter/inbound" + "github.com/metacubex/mihomo/transport/socks5" +) + +// HandleSocket like inbound.NewSocket combine with Tunnel.HandleTCPConn but also handel specialFqdn +func (h *ListenerHandler) HandleSocket(target socks5.Addr, conn net.Conn, _additions ...inbound.Addition) { + conn, metadata := inbound.NewSocket(target, conn, h.Type, h.Additions...) + if h.IsSpecialFqdn(metadata.Host) { + _ = h.ParseSpecialFqdn( + WithAdditions(context.Background(), _additions...), + conn, + ConvertMetadata(metadata), + ) + } else { + inbound.ApplyAdditions(metadata, _additions...) + h.Tunnel.HandleTCPConn(conn, metadata) + } +} diff --git a/listener/tuic/server.go b/listener/tuic/server.go index 837c1d10..3425cb04 100644 --- a/listener/tuic/server.go +++ b/listener/tuic/server.go @@ -1,7 +1,6 @@ package tuic import ( - "context" "crypto/tls" "net" "strings" @@ -93,23 +92,14 @@ func New(config LC.TuicServer, tunnel C.Tunnel, additions ...inbound.Addition) ( quicConfig.MaxDatagramFrameSize = int64(maxDatagramFrameSize) handleTcpFn := func(conn net.Conn, addr socks5.Addr, _additions ...inbound.Addition) error { - newAdditions := additions - if len(_additions) > 0 { - newAdditions = slices.Clone(additions) - newAdditions = append(newAdditions, _additions...) - } - conn, metadata := inbound.NewSocket(addr, conn, C.TUIC, newAdditions...) - if h.IsSpecialFqdn(metadata.Host) { - go func() { // ParseSpecialFqdn will block, so open a new goroutine - _ = h.ParseSpecialFqdn( - sing.WithAdditions(context.Background(), newAdditions...), - conn, - sing.ConvertMetadata(metadata), - ) - }() - return nil - } - go tunnel.HandleTCPConn(conn, metadata) + //newAdditions := additions + //if len(_additions) > 0 { + // newAdditions = slices.Clone(additions) + // newAdditions = append(newAdditions, _additions...) + //} + //conn, metadata := inbound.NewSocket(addr, conn, C.TUIC, newAdditions...) + //go tunnel.HandleTCPConn(conn, metadata) + go h.HandleSocket(addr, conn, _additions...) // h.HandleSocket will block, so open a new goroutine return nil } handleUdpFn := func(addr socks5.Addr, packet C.UDPPacket, _additions ...inbound.Addition) error {