diff --git a/transport/internet/dialer.go b/transport/internet/dialer.go index 26bc64a69..ad4e4b24f 100644 --- a/transport/internet/dialer.go +++ b/transport/internet/dialer.go @@ -4,7 +4,6 @@ import ( "crypto/tls" "errors" "net" - "time" v2net "github.com/v2ray/v2ray-core/common/net" v2tls "github.com/v2ray/v2ray-core/transport/internet/tls" @@ -56,30 +55,5 @@ func Dial(src v2net.Address, dest v2net.Destination, settings *StreamSettings) ( } func DialToDest(src v2net.Address, dest v2net.Destination) (net.Conn, error) { - - if isDefaultDialerSubstituted() { - dialer := v2AlternativeDialer - return (*dialer).Dial(dest.Network().String(), dest.NetAddr()) - } else { - dialer := &net.Dialer{ - Timeout: time.Second * 60, - DualStack: true, - } - if src != nil && src != v2net.AnyIP { - var addr net.Addr - if dest.IsTCP() { - addr = &net.TCPAddr{ - IP: src.IP(), - Port: 0, - } - } else { - addr = &net.UDPAddr{ - IP: src.IP(), - Port: 0, - } - } - dialer.LocalAddr = addr - } - return dialer.Dial(dest.Network().String(), dest.NetAddr()) - } + return effectiveSystemDialer.Dial(src, dest) } diff --git a/transport/internet/dialerSubstitute.go b/transport/internet/dialerSubstitute.go deleted file mode 100644 index 3c1e49248..000000000 --- a/transport/internet/dialerSubstitute.go +++ /dev/null @@ -1,18 +0,0 @@ -package internet - -import "net" - -var v2AlternativeDialer *V2AlternativeDialerT - -type V2AlternativeDialerT interface { - Dial(nw string, ad string) (net.Conn, error) -} - -func SubstituteDialer(substituteWith V2AlternativeDialerT) error { - v2AlternativeDialer = &substituteWith - return nil -} - -func isDefaultDialerSubstituted() bool { - return (v2AlternativeDialer != nil) -} diff --git a/transport/internet/system_dialer.go b/transport/internet/system_dialer.go new file mode 100644 index 000000000..018aa0534 --- /dev/null +++ b/transport/internet/system_dialer.go @@ -0,0 +1,74 @@ +package internet + +import ( + "net" + "time" + + v2net "github.com/v2ray/v2ray-core/common/net" +) + +var ( + effectiveSystemDialer SystemDialer +) + +type SystemDialer interface { + Dial(source v2net.Address, destination v2net.Destination) (net.Conn, error) +} + +type DefaultSystemDialer struct { +} + +func (this *DefaultSystemDialer) Dial(src v2net.Address, dest v2net.Destination) (net.Conn, error) { + dialer := &net.Dialer{ + Timeout: time.Second * 60, + DualStack: true, + } + if src != nil && src != v2net.AnyIP { + var addr net.Addr + if dest.IsTCP() { + addr = &net.TCPAddr{ + IP: src.IP(), + Port: 0, + } + } else { + addr = &net.UDPAddr{ + IP: src.IP(), + Port: 0, + } + } + dialer.LocalAddr = addr + } + return dialer.Dial(dest.Network().String(), dest.NetAddr()) +} + +type SystemDialerAdapter interface { + Dial(network string, address string) (net.Conn, error) +} + +type SimpleSystemDialer struct { + adapter SystemDialerAdapter +} + +func (this *SimpleSystemDialer) Dial(src v2net.Address, dest v2net.Destination) (net.Conn, error) { + return this.adapter.Dial(dest.Network().String(), dest.NetAddr()) +} + +func UseAlternativeSystemDialer(dialer SystemDialer) { + effectiveSystemDialer = dialer +} + +func UseAlternativeSimpleSystemDialer(dialer SystemDialerAdapter) { + effectiveSystemDialer = &SimpleSystemDialer{ + adapter: dialer, + } +} + +// @Deprecated: Use UseAlternativeSimpleSystemDialer. +func SubstituteDialer(dialer SystemDialerAdapter) error { + UseAlternativeSimpleSystemDialer(dialer) + return nil +} + +func init() { + effectiveSystemDialer = &DefaultSystemDialer{} +}