@@ -3,6 +3,7 @@ package internet
33import (
44 "context"
55 "math/rand"
6+ gonet "net"
67 "syscall"
78 "time"
89
@@ -87,14 +88,34 @@ func (d *DefaultSystemDialer) Dial(ctx context.Context, src net.Address, dest ne
8788 Dest : destAddr ,
8889 }, nil
8990 }
90- goStdKeepAlive := time .Duration (0 )
91- if sockopt != nil && (sockopt .TcpKeepAliveInterval != 0 || sockopt .TcpKeepAliveIdle != 0 ) {
92- goStdKeepAlive = time .Duration (- 1 )
91+ // Chrome defaults
92+ keepAliveConfig := gonet.KeepAliveConfig {
93+ Enable : true ,
94+ Idle : 45 * time .Second ,
95+ Interval : 45 * time .Second ,
96+ Count : - 1 ,
97+ }
98+ keepAlive := time .Duration (0 )
99+ if sockopt != nil {
100+ if sockopt .TcpKeepAliveIdle * sockopt .TcpKeepAliveInterval < 0 {
101+ return nil , errors .New ("invalid TcpKeepAliveIdle or TcpKeepAliveInterval value: " , sockopt .TcpKeepAliveIdle , " " , sockopt .TcpKeepAliveInterval )
102+ }
103+ if sockopt .TcpKeepAliveIdle < 0 || sockopt .TcpKeepAliveInterval < 0 {
104+ keepAlive = - 1
105+ keepAliveConfig .Enable = false
106+ }
107+ if sockopt .TcpKeepAliveIdle > 0 {
108+ keepAliveConfig .Idle = time .Duration (sockopt .TcpKeepAliveIdle ) * time .Second
109+ }
110+ if sockopt .TcpKeepAliveInterval > 0 {
111+ keepAliveConfig .Interval = time .Duration (sockopt .TcpKeepAliveInterval ) * time .Second
112+ }
93113 }
94114 dialer := & net.Dialer {
95- Timeout : time .Second * 16 ,
96- LocalAddr : resolveSrcAddr (dest .Network , src ),
97- KeepAlive : goStdKeepAlive ,
115+ Timeout : time .Second * 16 ,
116+ LocalAddr : resolveSrcAddr (dest .Network , src ),
117+ KeepAlive : keepAlive ,
118+ KeepAliveConfig : keepAliveConfig ,
98119 }
99120
100121 if sockopt != nil || len (d .controllers ) > 0 {
0 commit comments