From d1b44619b06b61d6cc0bba2667bff94c9cb9f3fe Mon Sep 17 00:00:00 2001 From: Shelikhoo Date: Tue, 26 Jul 2016 16:33:12 +0800 Subject: [PATCH] Solve #218: Supporting substitute of the default Dialer, this is a prerequisite of Libv2ray's support of Android VPNService mode; It is not recommanded to modify exported func introduced by this commit. --- transport/internet/dialer.go | 42 ++++++++++++++------------ transport/internet/dialerSubstitute.go | 18 +++++++++++ 2 files changed, 41 insertions(+), 19 deletions(-) create mode 100644 transport/internet/dialerSubstitute.go diff --git a/transport/internet/dialer.go b/transport/internet/dialer.go index ff270e0f1..26bc64a69 100644 --- a/transport/internet/dialer.go +++ b/transport/internet/dialer.go @@ -56,26 +56,30 @@ func Dial(src v2net.Address, dest v2net.Destination, settings *StreamSettings) ( } func DialToDest(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, - } + if isDefaultDialerSubstituted() { + dialer := v2AlternativeDialer + return (*dialer).Dial(dest.Network().String(), dest.NetAddr()) + } else { + dialer := &net.Dialer{ + Timeout: time.Second * 60, + DualStack: true, } - dialer.LocalAddr = addr + 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 dialer.Dial(dest.Network().String(), dest.NetAddr()) } diff --git a/transport/internet/dialerSubstitute.go b/transport/internet/dialerSubstitute.go new file mode 100644 index 000000000..3c1e49248 --- /dev/null +++ b/transport/internet/dialerSubstitute.go @@ -0,0 +1,18 @@ +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) +}