From 7d78683d6fbfa9b325e6806669543a9ad3c1b05e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Sun, 26 Sep 2021 14:15:25 +0800 Subject: [PATCH] Send shadowsocks handshake with payload if available (#1292) --- proxy/shadowsocks/client.go | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/proxy/shadowsocks/client.go b/proxy/shadowsocks/client.go index 80d619af770..96a5a275235 100644 --- a/proxy/shadowsocks/client.go +++ b/proxy/shadowsocks/client.go @@ -2,6 +2,7 @@ package shadowsocks import ( "context" + "time" core "github.com/v2fly/v2ray-core/v4" "github.com/v2fly/v2ray-core/v4/common" @@ -99,18 +100,22 @@ func (c *Client) Process(ctx context.Context, link *transport.Link, dialer inter timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeouts.ConnectionIdle) if request.Command == protocol.RequestCommandTCP { - bufferedWriter := buf.NewBufferedWriter(buf.NewWriter(conn)) - bodyWriter, err := WriteTCPRequest(request, bufferedWriter) - if err != nil { - return newError("failed to write request").Base(err) - } - - if err := bufferedWriter.SetBuffered(false); err != nil { - return err - } - requestDone := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly) + bufferedWriter := buf.NewBufferedWriter(buf.NewWriter(conn)) + bodyWriter, err := WriteTCPRequest(request, bufferedWriter) + if err != nil { + return newError("failed to write request").Base(err) + } + + if err = buf.CopyOnceTimeout(link.Reader, bodyWriter, time.Millisecond*100); err != nil && err != buf.ErrNotTimeoutReader && err != buf.ErrReadTimeout { + return newError("failed to write A request payload").Base(err).AtWarning() + } + + if err := bufferedWriter.SetBuffered(false); err != nil { + return err + } + return buf.Copy(link.Reader, bodyWriter, buf.UpdateActivity(timer)) }