Browse Source

Send shadowsocks handshake with payload if available (#736)

世界 4 năm trước cách đây
mục cha
commit
3b31189f13
1 tập tin đã thay đổi với 15 bổ sung10 xóa
  1. 15 10
      proxy/shadowsocks/client.go

+ 15 - 10
proxy/shadowsocks/client.go

@@ -2,6 +2,7 @@ package shadowsocks
 
 import (
 	"context"
+	"time"
 
 	"github.com/xtls/xray-core/transport/internet/stat"
 
@@ -101,18 +102,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))
 		}