Przeglądaj źródła

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.

Shelikhoo 9 lat temu
rodzic
commit
d1b44619b0
2 zmienionych plików z 40 dodań i 18 usunięć
  1. 22 18
      transport/internet/dialer.go
  2. 18 0
      transport/internet/dialerSubstitute.go

+ 22 - 18
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,
+		}
+		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
 		}
-		dialer.LocalAddr = addr
+		return dialer.Dial(dest.Network().String(), dest.NetAddr())
 	}
-
-	return dialer.Dial(dest.Network().String(), dest.NetAddr())
 }

+ 18 - 0
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)
+}