@@ -12,8 +12,6 @@ import (
1212 "github.com/xtls/xray-core/common/net"
1313 "github.com/xtls/xray-core/common/protocol"
1414 "github.com/xtls/xray-core/common/session"
15- "github.com/xtls/xray-core/common/signal"
16- "github.com/xtls/xray-core/common/task"
1715 "github.com/xtls/xray-core/core"
1816 "github.com/xtls/xray-core/features/policy"
1917 "github.com/xtls/xray-core/features/routing"
@@ -172,6 +170,15 @@ func (s *Server) Process(ctx context.Context, network net.Network, conn stat.Con
172170 }
173171 common .Must (conn .SetReadDeadline (time.Time {}))
174172
173+ bufferedWriter := buf .NewBufferedWriter (buf .NewWriter (conn ))
174+ err = WriteTCPResponse (bufferedWriter , true , "" )
175+ if err != nil {
176+ return errors .New ("failed to write response" ).Base (err )
177+ }
178+ if err := bufferedWriter .SetBuffered (false ); err != nil {
179+ return err
180+ }
181+
175182 dest := common .Must2 (net .ParseDestination ("tcp:" + addr ))
176183 ctx = log .ContextWithAccessMessage (ctx , & log.AccessMessage {
177184 From : conn .RemoteAddr (),
@@ -182,53 +189,10 @@ func (s *Server) Process(ctx context.Context, network net.Network, conn stat.Con
182189 })
183190 errors .LogInfo (ctx , "tunnelling request to " , dest )
184191
185- ctx , cancel := context .WithCancel (ctx )
186- timer := signal .CancelAfterInactivity (ctx , cancel , sessionPolicy .Timeouts .ConnectionIdle )
187-
188- ctx = policy .ContextWithBufferPolicy (ctx , sessionPolicy .Buffer )
189- link , err := dispatcher .Dispatch (ctx , dest )
190- if err != nil {
191- return err
192- }
193-
194- responseDone := func () error {
195- defer timer .SetTimeout (sessionPolicy .Timeouts .UplinkOnly )
196-
197- bufferedWriter := buf .NewBufferedWriter (buf .NewWriter (conn ))
198- err = WriteTCPResponse (bufferedWriter , true , "" )
199- if err != nil {
200- return errors .New ("failed to write response" ).Base (err )
201- }
202-
203- if err := bufferedWriter .SetBuffered (false ); err != nil {
204- return err
205- }
206-
207- if err := buf .Copy (link .Reader , bufferedWriter , buf .UpdateActivity (timer )); err != nil {
208- return errors .New ("failed to transport all TCP response" ).Base (err )
209- }
210-
211- return nil
212- }
213-
214- requestDone := func () error {
215- defer timer .SetTimeout (sessionPolicy .Timeouts .DownlinkOnly )
216-
217- if err := buf .Copy (buf .NewReader (conn ), link .Writer , buf .UpdateActivity (timer )); err != nil {
218- return errors .New ("failed to transport all TCP request" ).Base (err )
219- }
220-
221- return nil
222- }
223-
224- requestDoneAndCloseWriter := task .OnSuccess (requestDone , task .Close (link .Writer ))
225- if err := task .Run (ctx , requestDoneAndCloseWriter , responseDone ); err != nil {
226- common .Interrupt (link .Reader )
227- common .Interrupt (link .Writer )
228- return errors .New ("connection ends" ).Base (err )
229- }
230-
231- return nil
192+ return dispatcher .DispatchLink (ctx , dest , & transport.Link {
193+ Reader : buf .NewReader (conn ),
194+ Writer : bufferedWriter ,
195+ })
232196 }
233197}
234198
0 commit comments