@@ -157,7 +157,7 @@ func (w *ServerWorker) Close() error {
157157
158158func (w * ServerWorker ) handleStatusKeepAlive (meta * FrameMetadata , reader * buf.BufferedReader ) error {
159159 if meta .Option .Has (OptionData ) {
160- return buf . Copy ( NewStreamReader ( reader ) , buf .Discard )
160+ return CopyChunk ( reader , buf .Discard )
161161 }
162162 return nil
163163}
@@ -264,7 +264,7 @@ func (w *ServerWorker) handleStatusNew(ctx context.Context, meta *FrameMetadata,
264264 link , err := w .dispatcher .Dispatch (ctx , meta .Target )
265265 if err != nil {
266266 if meta .Option .Has (OptionData ) {
267- buf . Copy ( NewStreamReader ( reader ) , buf .Discard )
267+ CopyChunk ( reader , buf .Discard )
268268 }
269269 return errors .New ("failed to dispatch request." ).Base (err )
270270 }
@@ -287,6 +287,15 @@ func (w *ServerWorker) handleStatusNew(ctx context.Context, meta *FrameMetadata,
287287 return nil
288288 }
289289
290+ if s .transferType == protocol .TransferTypeStream {
291+ err = CopyChunk (reader , s .output )
292+ if err != nil && buf .IsWriteError (err ) {
293+ s .Close (false )
294+ return err
295+ }
296+ return err
297+ }
298+
290299 rr := s .NewReader (reader , & meta .Target )
291300 err = buf .Copy (rr , s .output )
292301
@@ -308,7 +317,17 @@ func (w *ServerWorker) handleStatusKeep(meta *FrameMetadata, reader *buf.Buffere
308317 closingWriter := NewResponseWriter (meta .SessionID , w .link .Writer , protocol .TransferTypeStream )
309318 closingWriter .Close ()
310319
311- return buf .Copy (NewStreamReader (reader ), buf .Discard )
320+ return CopyChunk (reader , buf .Discard )
321+ }
322+
323+ if s .transferType == protocol .TransferTypeStream {
324+ err := CopyChunk (reader , s .output )
325+ if err != nil && buf .IsWriteError (err ) {
326+ errors .LogInfoInner (context .Background (), err , "failed to write to downstream writer. closing session " , s .ID )
327+ s .Close (false )
328+ return err
329+ }
330+ return err
312331 }
313332
314333 rr := s .NewReader (reader , & meta .Target )
@@ -328,7 +347,7 @@ func (w *ServerWorker) handleStatusEnd(meta *FrameMetadata, reader *buf.Buffered
328347 s .Close (false )
329348 }
330349 if meta .Option .Has (OptionData ) {
331- return buf . Copy ( NewStreamReader ( reader ) , buf .Discard )
350+ return CopyChunk ( reader , buf .Discard )
332351 }
333352 return nil
334353}
0 commit comments