mirror of https://github.com/v2ray/v2ray-core
refine system dialer substitution
parent
27a29da7bf
commit
ca0ae50e62
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
|
@ -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{}
|
||||
}
|
Loading…
Reference in New Issue