77package intra
88
99import (
10+ "io"
1011 "net"
1112 "time"
1213
@@ -21,10 +22,7 @@ type rwext struct {
2122 minidle uint32 // min idle timeout in secs
2223}
2324
24- func (rw rwext ) IsZeroDeadline () bool {
25- r , w := rw .deadlines ()
26- return r == 0 && w == 0
27- }
25+ var _ core.RetrierConn = (* rwext )(nil )
2826
2927func (rw rwext ) SetTimeoutSockOpt () (secs int , didSet bool ) {
3028 r , w := rw .deadlines ()
@@ -41,26 +39,56 @@ func (rw rwext) Unwrap() net.Conn {
4139}
4240
4341func (rw rwext ) Read (b []byte ) (n int , err error ) {
44- rw .extend ()
42+ rw .extendr ()
4543 return rw .Conn .Read (b )
4644}
4745
4846func (rw rwext ) Write (b []byte ) (n int , err error ) {
49- rw .extend ()
47+ rw .extendw ()
5048 return rw .Conn .Write (b )
5149}
5250
51+ // ReadFrom implements core.RetrierConn.
52+ func (rw rwext ) ReadFrom (r io.Reader ) (n int64 , err error ) {
53+ switch c := rw .Unwrap ().(type ) {
54+ case io.ReaderFrom :
55+ // disable read and write deadlines for rw.Conn as
56+ // io.ReaderFrom does not support io.Reader+io.Writer
57+ // semantics which rwext relies on to extend deadlines.
58+ rw .extendForever ()
59+ return c .ReadFrom (r )
60+ default :
61+ }
62+ bptr := core .Alloc ()
63+ b := * bptr
64+ defer func () {
65+ * bptr = b
66+ core .Recycle (bptr )
67+ }()
68+ return io .CopyBuffer (rw , r , b )
69+ }
70+
5371func (rw rwext ) deadlines () (r , w uint32 ) {
5472 dopt := settings .GetDialerOpts ()
5573 // -ve ints go higher than 2^31 w/ uint: go.dev/play/p/Rrqk_V8a7W0
5674 return max (rw .minidle , uint32 (dopt .ReadTimeoutSec )),
5775 max (rw .minidle , uint32 (dopt .WriteTimeoutSec ))
5876}
5977
60- func (rw rwext ) extend () {
61- r , w := rw .deadlines ()
62- tr := time .Second * time .Duration (r )
78+ func (rw rwext ) extendForever () {
79+ extendc (rw , 0 , 0 )
80+ }
81+
82+ func (rw rwext ) extendw () {
83+ _ , w := rw .deadlines ()
6384 tw := time .Second * time .Duration (w )
6485
65- extendc (rw .Conn , tr , tw )
86+ extendw (rw .Conn , tw )
87+ }
88+
89+ func (rw rwext ) extendr () {
90+ r , _ := rw .deadlines ()
91+ tr := time .Second * time .Duration (r )
92+
93+ extendr (rw .Conn , tr )
6694}
0 commit comments