|
|
@@ -3,6 +3,7 @@ package internet
|
|
|
import (
|
|
|
"context"
|
|
|
"math/rand"
|
|
|
+ gonet "net"
|
|
|
"syscall"
|
|
|
"time"
|
|
|
|
|
|
@@ -87,14 +88,34 @@ func (d *DefaultSystemDialer) Dial(ctx context.Context, src net.Address, dest ne
|
|
|
Dest: destAddr,
|
|
|
}, nil
|
|
|
}
|
|
|
- goStdKeepAlive := time.Duration(0)
|
|
|
- if sockopt != nil && (sockopt.TcpKeepAliveInterval != 0 || sockopt.TcpKeepAliveIdle != 0) {
|
|
|
- goStdKeepAlive = time.Duration(-1)
|
|
|
+ // Chrome defaults
|
|
|
+ keepAliveConfig := gonet.KeepAliveConfig{
|
|
|
+ Enable: true,
|
|
|
+ Idle: 45 * time.Second,
|
|
|
+ Interval: 45 * time.Second,
|
|
|
+ Count: -1,
|
|
|
+ }
|
|
|
+ keepAlive := time.Duration(0)
|
|
|
+ if sockopt != nil {
|
|
|
+ if sockopt.TcpKeepAliveIdle*sockopt.TcpKeepAliveInterval < 0 {
|
|
|
+ return nil, errors.New("invalid TcpKeepAliveIdle or TcpKeepAliveInterval value: ", sockopt.TcpKeepAliveIdle, " ", sockopt.TcpKeepAliveInterval)
|
|
|
+ }
|
|
|
+ if sockopt.TcpKeepAliveIdle < 0 || sockopt.TcpKeepAliveInterval < 0 {
|
|
|
+ keepAlive = -1
|
|
|
+ keepAliveConfig.Enable = false
|
|
|
+ }
|
|
|
+ if sockopt.TcpKeepAliveIdle > 0 {
|
|
|
+ keepAliveConfig.Idle = time.Duration(sockopt.TcpKeepAliveIdle) * time.Second
|
|
|
+ }
|
|
|
+ if sockopt.TcpKeepAliveInterval > 0 {
|
|
|
+ keepAliveConfig.Interval = time.Duration(sockopt.TcpKeepAliveInterval) * time.Second
|
|
|
+ }
|
|
|
}
|
|
|
dialer := &net.Dialer{
|
|
|
- Timeout: time.Second * 16,
|
|
|
- LocalAddr: resolveSrcAddr(dest.Network, src),
|
|
|
- KeepAlive: goStdKeepAlive,
|
|
|
+ Timeout: time.Second * 16,
|
|
|
+ LocalAddr: resolveSrcAddr(dest.Network, src),
|
|
|
+ KeepAlive: keepAlive,
|
|
|
+ KeepAliveConfig: keepAliveConfig,
|
|
|
}
|
|
|
|
|
|
if sockopt != nil || len(d.controllers) > 0 {
|