From f5e8cdae19cd5f6a1abf9cbd7990c6530de88c69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Sun, 20 Sep 2026 17:36:19 +0800 Subject: [PATCH] Fix gRPC transport half-close --- transport/v2raygrpc/conn.go | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/transport/v2raygrpc/conn.go b/transport/v2raygrpc/conn.go index 87be9661..5ad1ff5b 100644 --- a/transport/v2raygrpc/conn.go +++ b/transport/v2raygrpc/conn.go @@ -10,6 +10,8 @@ import ( "github.com/sagernet/sing/common/baderror" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" + + "google.golang.org/grpc" ) var _ net.Conn = (*GRPCConn)(nil) @@ -21,15 +23,15 @@ type GRPCConn struct { closeOnce sync.Once } -func NewGRPCConn(service GunService, cancel context.CancelCauseFunc) *GRPCConn { - //nolint:staticcheck - if client, isClient := service.(GunService_TunClient); isClient { - service = &clientConnWrapper{client} - } - return &GRPCConn{ +func NewGRPCConn(service GunService, cancel context.CancelCauseFunc) net.Conn { + conn := &GRPCConn{ GunService: service, cancel: cancel, } + if client, isClient := service.(grpc.ClientStream); isClient { + return &GRPCClientConn{GRPCConn: conn, client: client} + } + return conn } func (c *GRPCConn) Read(b []byte) (n int, err error) { @@ -95,12 +97,13 @@ func (c *GRPCConn) Upstream() any { return c.GunService } -var _ N.WriteCloser = (*clientConnWrapper)(nil) +var _ N.WriteCloser = (*GRPCClientConn)(nil) -type clientConnWrapper struct { - GunService_TunClient +type GRPCClientConn struct { + *GRPCConn + client grpc.ClientStream } -func (c *clientConnWrapper) CloseWrite() error { - return c.CloseSend() +func (c *GRPCClientConn) CloseWrite() error { + return c.client.CloseSend() }