1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-06-10 18:00:43 +00:00

refine system dialer substitution

This commit is contained in:
v2ray 2016-07-26 17:11:58 +02:00
parent 27a29da7bf
commit ca0ae50e62
No known key found for this signature in database
GPG Key ID: 7251FFA14BB18169
3 changed files with 75 additions and 45 deletions

View File

@ -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)
}

View File

@ -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)
}

View File

@ -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{}
}