fin := make(chan error)
reqc := req.NetConn()
resc := res.NetConn()
+ ctx, cancle := pctx.WithWait(ctx, 2, time.Minute)
defer func() {
- reqc.Close()
- resc.Close()
+ if errors.Is(cancle(), pctx.ErrWaitTo) {
+ logger.L(`E:`, "退出超时")
+ }
}()
go func() {
+ ctx1, done1 := pctx.WaitCtx(ctx)
+ defer done1()
_, e := io.Copy(reqc, resc)
- fin <- e
+ select {
+ case fin <- e:
+ case <-ctx1.Done():
+ fin <- nil
+ }
+ reqc.Close()
}()
go func() {
+ ctx1, done1 := pctx.WaitCtx(ctx)
+ defer done1()
_, e := io.Copy(resc, reqc)
- fin <- e
- }()
- select {
- case e := <-fin:
- if e != nil {
- logger.L(`E:`, fmt.Sprintf("%s=>%s %v", routePath, back.Name, e))
- return ErrCopy
+ select {
+ case fin <- e:
+ case <-ctx1.Done():
+ fin <- nil
}
- case <-ctx.Done():
+ resc.Close()
+ }()
+ if e := <-fin; e != nil {
+ logger.L(`E:`, fmt.Sprintf("%s=>%s %v", routePath, back.Name, e))
+ return ErrCopy
}
return nil
}