|
|
|
@ -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)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|