From 107a9a3b51c13eeb5544cdc9512e8f875fc14f43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Sat, 8 Apr 2023 22:37:10 +0800 Subject: [PATCH] Fix read deadline implementation --- common/mux/client.go | 5 +++-- common/mux/service.go | 3 ++- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- inbound/vless.go | 3 ++- inbound/vmess.go | 3 ++- outbound/shadowsocks.go | 2 +- outbound/shadowsocksr.go | 2 +- outbound/trojan.go | 2 +- outbound/vless.go | 2 +- transport/trojan/mux.go | 4 +++- transport/trojan/service.go | 3 ++- transport/v2raygrpc/client.go | 3 ++- transport/v2raygrpc/server.go | 3 ++- transport/v2raygrpclite/client.go | 3 ++- transport/v2raygrpclite/conn.go | 15 --------------- transport/v2raygrpclite/server.go | 3 ++- transport/v2raywebsocket/client.go | 5 +++-- transport/v2raywebsocket/server.go | 3 ++- transport/vless/client.go | 22 ++++++++++++---------- transport/vless/service.go | 3 ++- 21 files changed, 57 insertions(+), 56 deletions(-) diff --git a/common/mux/client.go b/common/mux/client.go index c4b2a6f9..8ade94e4 100644 --- a/common/mux/client.go +++ b/common/mux/client.go @@ -11,6 +11,7 @@ import ( "github.com/sagernet/sing/common" "github.com/sagernet/sing/common/buf" "github.com/sagernet/sing/common/bufio" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -68,7 +69,7 @@ func (c *Client) DialContext(ctx context.Context, network string, destination M. if err != nil { return nil, err } - return bufio.NewUnbindPacketConn(&ClientPacketConn{ExtendedConn: bufio.NewExtendedConn(stream), destination: destination}), nil + return bufio.NewBindPacketConn(deadline.NewPacketConn(bufio.NewNetPacketConn(&ClientPacketConn{ExtendedConn: bufio.NewExtendedConn(stream), destination: destination})), destination), nil default: return nil, E.Extend(N.ErrUnknownNetwork, network) } @@ -79,7 +80,7 @@ func (c *Client) ListenPacket(ctx context.Context, destination M.Socksaddr) (net if err != nil { return nil, err } - return &ClientPacketAddrConn{ExtendedConn: bufio.NewExtendedConn(stream), destination: destination}, nil + return deadline.NewPacketConn(&ClientPacketAddrConn{ExtendedConn: bufio.NewExtendedConn(stream), destination: destination}), nil } func (c *Client) openStream() (net.Conn, error) { diff --git a/common/mux/service.go b/common/mux/service.go index 3dfae46c..9433ba09 100644 --- a/common/mux/service.go +++ b/common/mux/service.go @@ -10,6 +10,7 @@ import ( "github.com/sagernet/sing/common" "github.com/sagernet/sing/common/buf" "github.com/sagernet/sing/common/bufio" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -67,7 +68,7 @@ func newConnection(ctx context.Context, router adapter.Router, errorHandler E.Ha logger.InfoContext(ctx, "inbound multiplex packet connection") packetConn = &ServerPacketAddrConn{ExtendedConn: bufio.NewExtendedConn(stream)} } - hErr := router.RoutePacketConnection(ctx, packetConn, metadata) + hErr := router.RoutePacketConnection(ctx, deadline.NewPacketConn(bufio.NewNetPacketConn(packetConn)), metadata) stream.Close() if hErr != nil { errorHandler.NewError(ctx, hErr) diff --git a/go.mod b/go.mod index 2d6ba669..376ac9ef 100644 --- a/go.mod +++ b/go.mod @@ -25,12 +25,12 @@ require ( github.com/sagernet/gomobile v0.0.0-20221130124640-349ebaa752ca github.com/sagernet/quic-go v0.0.0-20230202071646-a8c8afb18b32 github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 - github.com/sagernet/sing v0.2.2-0.20230408135335-14c8c38f67f2 + github.com/sagernet/sing v0.2.2-0.20230408144503-9dc13fd20e70 github.com/sagernet/sing-dns v0.1.5-0.20230408004833-5adaf486d440 - github.com/sagernet/sing-shadowsocks v0.2.1-0.20230408064153-75848ae8c6a2 - github.com/sagernet/sing-shadowtls v0.1.0 + github.com/sagernet/sing-shadowsocks v0.2.1-0.20230408141421-e40d6a4e42d4 + github.com/sagernet/sing-shadowtls v0.1.1-0.20230408141548-81d74d2a8661 github.com/sagernet/sing-tun v0.1.4-0.20230326080954-8848c0e4cbab - github.com/sagernet/sing-vmess v0.1.4-0.20230408065245-5bca9ddcac72 + github.com/sagernet/sing-vmess v0.1.4-0.20230408141409-03460e4b014a github.com/sagernet/smux v0.0.0-20230312102458-337ec2a5af37 github.com/sagernet/tfo-go v0.0.0-20230303015439-ffcfd8c41cf9 github.com/sagernet/utls v0.0.0-20230309024959-6732c2ab36f2 diff --git a/go.sum b/go.sum index 06e6953d..0178cfd2 100644 --- a/go.sum +++ b/go.sum @@ -111,18 +111,18 @@ github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 h1:5Th31OC6yj8byL github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691/go.mod h1:B8lp4WkQ1PwNnrVMM6KyuFR20pU8jYBD+A4EhJovEXU= github.com/sagernet/sing v0.0.0-20220817130738-ce854cda8522/go.mod h1:QVsS5L/ZA2Q5UhQwLrn0Trw+msNd/NPGEhBKR/ioWiY= github.com/sagernet/sing v0.1.8/go.mod h1:jt1w2u7lJQFFSGLiRrRIs5YWmx4kAPfWuOejuDW9qMk= -github.com/sagernet/sing v0.2.2-0.20230408135335-14c8c38f67f2 h1:1DuT9KnpWQx3Vy4pDP5duBuyyk//HB8OC0QrhZ0Y9kI= -github.com/sagernet/sing v0.2.2-0.20230408135335-14c8c38f67f2/go.mod h1:9uHswk2hITw8leDbiLS/xn0t9nzBcbePxzm9PJhwdlw= +github.com/sagernet/sing v0.2.2-0.20230408144503-9dc13fd20e70 h1:b6TdWtpaDiX8Lis778UW2MEmTuv3grzP1GNsG27jX7w= +github.com/sagernet/sing v0.2.2-0.20230408144503-9dc13fd20e70/go.mod h1:9uHswk2hITw8leDbiLS/xn0t9nzBcbePxzm9PJhwdlw= github.com/sagernet/sing-dns v0.1.5-0.20230408004833-5adaf486d440 h1:VH8/BcOVuApHtS+vKP+khxlGRcXH7KKhgkTDtNynqSQ= github.com/sagernet/sing-dns v0.1.5-0.20230408004833-5adaf486d440/go.mod h1:69PNSHyEmXdjf6C+bXBOdr2GQnPeEyWjIzo/MV8gmz8= -github.com/sagernet/sing-shadowsocks v0.2.1-0.20230408064153-75848ae8c6a2 h1:wCsNEWWjNUaSRH3CB2UkhAb1Zi8NotBWcMUN9qEEoeE= -github.com/sagernet/sing-shadowsocks v0.2.1-0.20230408064153-75848ae8c6a2/go.mod h1:x6jt78kUBzfZ0zlZHbcNfqLzCRM5s2HHhavJ2bSwIZs= -github.com/sagernet/sing-shadowtls v0.1.0 h1:05MYce8aR5xfKIn+y7xRFsdKhKt44QZTSEQW+lG5IWQ= -github.com/sagernet/sing-shadowtls v0.1.0/go.mod h1:Kn1VUIprdkwCgkS6SXYaLmIpKzQbqBIKJBMY+RvBhYc= +github.com/sagernet/sing-shadowsocks v0.2.1-0.20230408141421-e40d6a4e42d4 h1:mKpXBBnAhTy9/CvDKqt5cN78LKX8cVUqjoWEXI/g0No= +github.com/sagernet/sing-shadowsocks v0.2.1-0.20230408141421-e40d6a4e42d4/go.mod h1:NFEROpOEiLG+lEoSPNpSL2yDyXx6q0OJvwWnEAd40cI= +github.com/sagernet/sing-shadowtls v0.1.1-0.20230408141548-81d74d2a8661 h1:QnV79JbJbJGT0MJJfd8o7QMEfRu3eUVKsmahxFMonrc= +github.com/sagernet/sing-shadowtls v0.1.1-0.20230408141548-81d74d2a8661/go.mod h1:xCeSRP8cV32aPsY+6BbRdJjyD6q8ufdKwhgqxEbU/3U= github.com/sagernet/sing-tun v0.1.4-0.20230326080954-8848c0e4cbab h1:a9oeWuPBuIZ70qMhIIH6RrYhp886xN9jJIwsuu4ZFUo= github.com/sagernet/sing-tun v0.1.4-0.20230326080954-8848c0e4cbab/go.mod h1:4YxIDEkkCjGXDOTMPw1SXpLmCQUFAWuaQN250oo+928= -github.com/sagernet/sing-vmess v0.1.4-0.20230408065245-5bca9ddcac72 h1:2+Tv6vF7FLhoLhHgQIU8Uoodgbj8jtgaVb1ago/d2/I= -github.com/sagernet/sing-vmess v0.1.4-0.20230408065245-5bca9ddcac72/go.mod h1:L11PY/M3wQOAIIBvwsFdMYG5MNTBAVZA5I/Fd0MBFLo= +github.com/sagernet/sing-vmess v0.1.4-0.20230408141409-03460e4b014a h1:kClgb0phf3Jn1nKufk9eGTcnGriXpdbm5/dYtP613tA= +github.com/sagernet/sing-vmess v0.1.4-0.20230408141409-03460e4b014a/go.mod h1:xuq/+XxniuiYqxK9Qdz9OPRqcDgjkwR2PaobjmNZbLM= github.com/sagernet/smux v0.0.0-20230312102458-337ec2a5af37 h1:HuE6xSwco/Xed8ajZ+coeYLmioq0Qp1/Z2zczFaV8as= github.com/sagernet/smux v0.0.0-20230312102458-337ec2a5af37/go.mod h1:3skNSftZDJWTGVtVaM2jfbce8qHnmH/AGDRe62iNOg0= github.com/sagernet/tfo-go v0.0.0-20230303015439-ffcfd8c41cf9 h1:2ItpW1nMNkPzmBTxV0/eClCklHrFSQMnUGcpUmJxVeE= diff --git a/inbound/vless.go b/inbound/vless.go index d4c00f76..02b0bd1b 100644 --- a/inbound/vless.go +++ b/inbound/vless.go @@ -16,6 +16,7 @@ import ( "github.com/sagernet/sing-vmess/packetaddr" "github.com/sagernet/sing/common" "github.com/sagernet/sing/common/auth" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" F "github.com/sagernet/sing/common/format" M "github.com/sagernet/sing/common/metadata" @@ -171,7 +172,7 @@ func (h *VLESS) newPacketConnection(ctx context.Context, conn N.PacketConn, meta } if metadata.Destination.Fqdn == packetaddr.SeqPacketMagicAddress { metadata.Destination = M.Socksaddr{} - conn = packetaddr.NewConn(conn.(vmess.PacketConn), metadata.Destination) + conn = deadline.NewPacketConn(packetaddr.NewConn(conn.(vmess.PacketConn), metadata.Destination)) h.logger.InfoContext(ctx, "[", user, "] inbound packet addr connection") } else { h.logger.InfoContext(ctx, "[", user, "] inbound packet connection to ", metadata.Destination) diff --git a/inbound/vmess.go b/inbound/vmess.go index 69552162..f7581c0d 100644 --- a/inbound/vmess.go +++ b/inbound/vmess.go @@ -15,6 +15,7 @@ import ( "github.com/sagernet/sing-vmess/packetaddr" "github.com/sagernet/sing/common" "github.com/sagernet/sing/common/auth" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" F "github.com/sagernet/sing/common/format" M "github.com/sagernet/sing/common/metadata" @@ -179,7 +180,7 @@ func (h *VMess) newPacketConnection(ctx context.Context, conn N.PacketConn, meta } if metadata.Destination.Fqdn == packetaddr.SeqPacketMagicAddress { metadata.Destination = M.Socksaddr{} - conn = packetaddr.NewConn(conn.(vmess.PacketConn), metadata.Destination) + conn = deadline.NewPacketConn(packetaddr.NewConn(conn.(vmess.PacketConn), metadata.Destination)) h.logger.InfoContext(ctx, "[", user, "] inbound packet addr connection") } else { h.logger.InfoContext(ctx, "[", user, "] inbound packet connection to ", metadata.Destination) diff --git a/outbound/shadowsocks.go b/outbound/shadowsocks.go index 0741eb80..e196c03a 100644 --- a/outbound/shadowsocks.go +++ b/outbound/shadowsocks.go @@ -157,7 +157,7 @@ func (h *shadowsocksDialer) DialContext(ctx context.Context, network string, des if err != nil { return nil, err } - return &bufio.BindPacketConn{PacketConn: h.method.DialPacketConn(outConn), Addr: destination}, nil + return bufio.NewBindPacketConn(h.method.DialPacketConn(outConn), destination), nil default: return nil, E.Extend(N.ErrUnknownNetwork, network) } diff --git a/outbound/shadowsocksr.go b/outbound/shadowsocksr.go index f2a172fb..3ce9640a 100644 --- a/outbound/shadowsocksr.go +++ b/outbound/shadowsocksr.go @@ -127,7 +127,7 @@ func (h *ShadowsocksR) DialContext(ctx context.Context, network string, destinat if err != nil { return nil, err } - return &bufio.BindPacketConn{PacketConn: conn, Addr: destination}, nil + return bufio.NewBindPacketConn(conn, destination), nil default: return nil, E.Extend(N.ErrUnknownNetwork, network) } diff --git a/outbound/trojan.go b/outbound/trojan.go index b30d88d5..2e4bc96a 100644 --- a/outbound/trojan.go +++ b/outbound/trojan.go @@ -131,7 +131,7 @@ func (h *trojanDialer) DialContext(ctx context.Context, network string, destinat case N.NetworkTCP: return trojan.NewClientConn(conn, h.key, destination), nil case N.NetworkUDP: - return &bufio.BindPacketConn{PacketConn: trojan.NewClientPacketConn(conn, h.key), Addr: destination}, nil + return bufio.NewBindPacketConn(trojan.NewClientPacketConn(conn, h.key), destination), nil default: return nil, E.Extend(N.ErrUnknownNetwork, network) } diff --git a/outbound/vless.go b/outbound/vless.go index ac5eb02d..adb84df0 100644 --- a/outbound/vless.go +++ b/outbound/vless.go @@ -111,7 +111,7 @@ func (h *VLESS) DialContext(ctx context.Context, network string, destination M.S if err != nil { return nil, err } - return &bufio.BindPacketConn{PacketConn: packetaddr.NewConn(packetConn, destination), Addr: destination}, nil + return bufio.NewBindPacketConn(packetaddr.NewConn(packetConn, destination), destination), nil } else { return h.client.DialEarlyPacketConn(conn, destination) } diff --git a/transport/trojan/mux.go b/transport/trojan/mux.go index 745cde56..b5ecb316 100644 --- a/transport/trojan/mux.go +++ b/transport/trojan/mux.go @@ -4,6 +4,8 @@ import ( "context" "net" + "github.com/sagernet/sing/common/bufio" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" "github.com/sagernet/sing/common/rw" @@ -53,7 +55,7 @@ func newMuxConnection0(ctx context.Context, stream net.Conn, metadata M.Metadata case CommandTCP: return handler.NewConnection(ctx, stream, metadata) case CommandUDP: - return handler.NewPacketConnection(ctx, &PacketConn{stream}, metadata) + return handler.NewPacketConnection(ctx, deadline.NewPacketConn(bufio.NewNetPacketConn(&PacketConn{stream})), metadata) default: return E.New("unknown command ", command) } diff --git a/transport/trojan/service.go b/transport/trojan/service.go index 453423d2..d4d26d5e 100644 --- a/transport/trojan/service.go +++ b/transport/trojan/service.go @@ -8,6 +8,7 @@ import ( "github.com/sagernet/sing/common/auth" "github.com/sagernet/sing/common/buf" "github.com/sagernet/sing/common/bufio" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -106,7 +107,7 @@ func (s *Service[K]) NewConnection(ctx context.Context, conn net.Conn, metadata case CommandTCP: return s.handler.NewConnection(ctx, conn, metadata) case CommandUDP: - return s.handler.NewPacketConnection(ctx, &PacketConn{conn}, metadata) + return s.handler.NewPacketConnection(ctx, deadline.NewPacketConn(bufio.NewNetPacketConn(&PacketConn{conn})), metadata) // case CommandMux: default: return HandleMuxConnection(ctx, conn, metadata, s.handler) diff --git a/transport/v2raygrpc/client.go b/transport/v2raygrpc/client.go index 17b3b5cd..4e31ee59 100644 --- a/transport/v2raygrpc/client.go +++ b/transport/v2raygrpc/client.go @@ -10,6 +10,7 @@ import ( "github.com/sagernet/sing-box/common/tls" "github.com/sagernet/sing-box/option" "github.com/sagernet/sing/common" + "github.com/sagernet/sing/common/bufio/deadline" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -107,5 +108,5 @@ func (c *Client) DialContext(ctx context.Context) (net.Conn, error) { cancel() return nil, err } - return NewGRPCConn(stream, cancel), nil + return deadline.NewConn(NewGRPCConn(stream, cancel)), nil } diff --git a/transport/v2raygrpc/server.go b/transport/v2raygrpc/server.go index 1b6a34c1..dbfee671 100644 --- a/transport/v2raygrpc/server.go +++ b/transport/v2raygrpc/server.go @@ -10,6 +10,7 @@ import ( "github.com/sagernet/sing-box/adapter" "github.com/sagernet/sing-box/common/tls" "github.com/sagernet/sing-box/option" + "github.com/sagernet/sing/common/bufio/deadline" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -62,7 +63,7 @@ func (s *Server) Tun(server GunService_TunServer) error { } } } - go s.handler.NewConnection(ctx, conn, metadata) + go s.handler.NewConnection(ctx, deadline.NewConn(conn), metadata) <-ctx.Done() return nil } diff --git a/transport/v2raygrpclite/client.go b/transport/v2raygrpclite/client.go index 369d0bb2..107f574c 100644 --- a/transport/v2raygrpclite/client.go +++ b/transport/v2raygrpclite/client.go @@ -13,6 +13,7 @@ import ( "github.com/sagernet/sing-box/common/tls" "github.com/sagernet/sing-box/option" "github.com/sagernet/sing-box/transport/v2rayhttp" + "github.com/sagernet/sing/common/bufio/deadline" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -92,7 +93,7 @@ func (c *Client) DialContext(ctx context.Context) (net.Conn, error) { conn.setup(nil, err) } }() - return conn, nil + return deadline.NewConn(conn), nil } func (c *Client) Close() error { diff --git a/transport/v2raygrpclite/conn.go b/transport/v2raygrpclite/conn.go index 7906fcdb..6f6fe0aa 100644 --- a/transport/v2raygrpclite/conn.go +++ b/transport/v2raygrpclite/conn.go @@ -145,28 +145,13 @@ func (c *GunConn) RemoteAddr() net.Addr { } func (c *GunConn) SetDeadline(t time.Time) error { - if responseWriter, loaded := c.writer.(interface { - SetWriteDeadline(time.Time) error - }); loaded { - return responseWriter.SetWriteDeadline(t) - } return os.ErrInvalid } func (c *GunConn) SetReadDeadline(t time.Time) error { - if responseWriter, loaded := c.writer.(interface { - SetReadDeadline(time.Time) error - }); loaded { - return responseWriter.SetReadDeadline(t) - } return os.ErrInvalid } func (c *GunConn) SetWriteDeadline(t time.Time) error { - if responseWriter, loaded := c.writer.(interface { - SetWriteDeadline(time.Time) error - }); loaded { - return responseWriter.SetWriteDeadline(t) - } return os.ErrInvalid } diff --git a/transport/v2raygrpclite/server.go b/transport/v2raygrpclite/server.go index d9b04791..a9c57fdd 100644 --- a/transport/v2raygrpclite/server.go +++ b/transport/v2raygrpclite/server.go @@ -15,6 +15,7 @@ import ( "github.com/sagernet/sing-box/option" "github.com/sagernet/sing-box/transport/v2rayhttp" "github.com/sagernet/sing/common" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -80,7 +81,7 @@ func (s *Server) ServeHTTP(writer http.ResponseWriter, request *http.Request) { var metadata M.Metadata metadata.Source = sHttp.SourceAddress(request) conn := v2rayhttp.NewHTTP2Wrapper(newGunConn(request.Body, writer, writer.(http.Flusher))) - s.handler.NewConnection(request.Context(), conn, metadata) + s.handler.NewConnection(request.Context(), deadline.NewConn(conn), metadata) conn.CloseWrapper() } diff --git a/transport/v2raywebsocket/client.go b/transport/v2raywebsocket/client.go index 49d7555a..bbcfa569 100644 --- a/transport/v2raywebsocket/client.go +++ b/transport/v2raywebsocket/client.go @@ -11,6 +11,7 @@ import ( "github.com/sagernet/sing-box/adapter" "github.com/sagernet/sing-box/common/tls" "github.com/sagernet/sing-box/option" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -77,11 +78,11 @@ func (c *Client) DialContext(ctx context.Context) (net.Conn, error) { if c.maxEarlyData <= 0 { conn, response, err := c.dialer.DialContext(ctx, c.uri, c.headers) if err == nil { - return &WebsocketConn{Conn: conn, Writer: NewWriter(conn, false)}, nil + return deadline.NewConn(&WebsocketConn{Conn: conn, Writer: NewWriter(conn, false)}), nil } return nil, wrapDialError(response, err) } else { - return &EarlyWebsocketConn{Client: c, ctx: ctx, create: make(chan struct{})}, nil + return deadline.NewConn(&EarlyWebsocketConn{Client: c, ctx: ctx, create: make(chan struct{})}), nil } } diff --git a/transport/v2raywebsocket/server.go b/transport/v2raywebsocket/server.go index 44106e95..6d542572 100644 --- a/transport/v2raywebsocket/server.go +++ b/transport/v2raywebsocket/server.go @@ -16,6 +16,7 @@ import ( "github.com/sagernet/sing/common" "github.com/sagernet/sing/common/buf" "github.com/sagernet/sing/common/bufio" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -104,7 +105,7 @@ func (s *Server) ServeHTTP(writer http.ResponseWriter, request *http.Request) { if len(earlyData) > 0 { conn = bufio.NewCachedConn(conn, buf.As(earlyData)) } - s.handler.NewConnection(request.Context(), conn, metadata) + s.handler.NewConnection(request.Context(), deadline.NewConn(conn), metadata) } func (s *Server) fallbackRequest(ctx context.Context, writer http.ResponseWriter, request *http.Request, statusCode int, err error) { diff --git a/transport/vless/client.go b/transport/vless/client.go index 0c3bec34..453e96ed 100644 --- a/transport/vless/client.go +++ b/transport/vless/client.go @@ -8,6 +8,8 @@ import ( "github.com/sagernet/sing-vmess" "github.com/sagernet/sing/common" "github.com/sagernet/sing/common/buf" + "github.com/sagernet/sing/common/bufio" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" "github.com/sagernet/sing/common/logger" M "github.com/sagernet/sing/common/metadata" @@ -46,30 +48,30 @@ func (c *Client) prepareConn(conn net.Conn) (net.Conn, error) { return conn, nil } -func (c *Client) DialConn(conn net.Conn, destination M.Socksaddr) (*Conn, error) { +func (c *Client) DialConn(conn net.Conn, destination M.Socksaddr) (net.Conn, error) { vConn, err := c.prepareConn(conn) if err != nil { return nil, err } serverConn := &Conn{Conn: conn, protocolConn: vConn, key: c.key, command: vmess.CommandTCP, destination: destination, flow: c.flow} - return serverConn, common.Error(serverConn.Write(nil)) + return deadline.NewConn(serverConn), common.Error(serverConn.Write(nil)) } -func (c *Client) DialEarlyConn(conn net.Conn, destination M.Socksaddr) (*Conn, error) { +func (c *Client) DialEarlyConn(conn net.Conn, destination M.Socksaddr) (net.Conn, error) { vConn, err := c.prepareConn(conn) if err != nil { return nil, err } - return &Conn{Conn: conn, protocolConn: vConn, key: c.key, command: vmess.CommandTCP, destination: destination, flow: c.flow}, nil + return deadline.NewConn(&Conn{Conn: conn, protocolConn: vConn, key: c.key, command: vmess.CommandTCP, destination: destination, flow: c.flow}), nil } -func (c *Client) DialPacketConn(conn net.Conn, destination M.Socksaddr) (*PacketConn, error) { +func (c *Client) DialPacketConn(conn net.Conn, destination M.Socksaddr) (vmess.PacketConn, error) { serverConn := &PacketConn{Conn: conn, key: c.key, destination: destination, flow: c.flow} - return serverConn, common.Error(serverConn.Write(nil)) + return bufio.NewBindPacketConn(deadline.NewPacketConn(bufio.NewPacketConn(serverConn)), destination), common.Error(serverConn.Write(nil)) } -func (c *Client) DialEarlyPacketConn(conn net.Conn, destination M.Socksaddr) (*PacketConn, error) { - return &PacketConn{Conn: conn, key: c.key, destination: destination, flow: c.flow}, nil +func (c *Client) DialEarlyPacketConn(conn net.Conn, destination M.Socksaddr) (vmess.PacketConn, error) { + return bufio.NewBindPacketConn(deadline.NewPacketConn(bufio.NewPacketConn(&PacketConn{Conn: conn, key: c.key, destination: destination, flow: c.flow})), destination), nil } func (c *Client) DialXUDPPacketConn(conn net.Conn, destination M.Socksaddr) (vmess.PacketConn, error) { @@ -78,11 +80,11 @@ func (c *Client) DialXUDPPacketConn(conn net.Conn, destination M.Socksaddr) (vme if err != nil { return nil, err } - return vmess.NewXUDPConn(serverConn, destination), nil + return bufio.NewBindPacketConn(deadline.NewPacketConn(vmess.NewXUDPConn(serverConn, destination)), destination), nil } func (c *Client) DialEarlyXUDPPacketConn(conn net.Conn, destination M.Socksaddr) (vmess.PacketConn, error) { - return vmess.NewXUDPConn(&Conn{Conn: conn, protocolConn: conn, key: c.key, command: vmess.CommandMux, destination: destination, flow: c.flow}, destination), nil + return bufio.NewBindPacketConn(deadline.NewPacketConn(vmess.NewXUDPConn(&Conn{Conn: conn, protocolConn: conn, key: c.key, command: vmess.CommandMux, destination: destination, flow: c.flow}, destination)), destination), nil } var _ N.EarlyConn = (*Conn)(nil) diff --git a/transport/vless/service.go b/transport/vless/service.go index 7a6cf97d..e278e16e 100644 --- a/transport/vless/service.go +++ b/transport/vless/service.go @@ -10,6 +10,7 @@ import ( "github.com/sagernet/sing/common/auth" "github.com/sagernet/sing/common/buf" "github.com/sagernet/sing/common/bufio" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" "github.com/sagernet/sing/common/logger" M "github.com/sagernet/sing/common/metadata" @@ -89,7 +90,7 @@ func (s *Service[T]) NewConnection(ctx context.Context, conn net.Conn, metadata case vmess.CommandTCP: return s.handler.NewConnection(ctx, &serverConn{Conn: conn, responseWriter: responseWriter}, metadata) case vmess.CommandUDP: - return s.handler.NewPacketConnection(ctx, &serverPacketConn{ExtendedConn: bufio.NewExtendedConn(conn), destination: request.Destination}, metadata) + return s.handler.NewPacketConnection(ctx, deadline.NewPacketConn(&serverPacketConn{ExtendedConn: bufio.NewExtendedConn(conn), destination: request.Destination}), metadata) case vmess.CommandMux: return vmess.HandleMuxConnection(ctx, &serverConn{Conn: conn, responseWriter: responseWriter}, s.handler) default: