|  | @@ -20,42 +20,41 @@ type DialerOptions struct {
 | 
											
												
													
														|  |  type Dialer func(src v2net.Address, dest v2net.Destination, options DialerOptions) (Connection, error)
 |  |  type Dialer func(src v2net.Address, dest v2net.Destination, options DialerOptions) (Connection, error)
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  var (
 |  |  var (
 | 
											
												
													
														|  | -	TCPDialer   Dialer
 |  | 
 | 
											
												
													
														|  | -	KCPDialer   Dialer
 |  | 
 | 
											
												
													
														|  | -	UDPDialer   Dialer
 |  | 
 | 
											
												
													
														|  | -	WSDialer    Dialer
 |  | 
 | 
											
												
													
														|  | 
 |  | +	networkDialerCache = make(map[v2net.Network]Dialer)
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  	ProxyDialer Dialer
 |  |  	ProxyDialer Dialer
 | 
											
												
													
														|  |  )
 |  |  )
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +func RegisterNetworkDialer(network v2net.Network, dialer Dialer) error {
 | 
											
												
													
														|  | 
 |  | +	if _, found := networkDialerCache[network]; found {
 | 
											
												
													
														|  | 
 |  | +		return errors.New("Internet|Dialer: ", network, " dialer already registered.")
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	networkDialerCache[network] = dialer
 | 
											
												
													
														|  | 
 |  | +	return nil
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  func Dial(src v2net.Address, dest v2net.Destination, options DialerOptions) (Connection, error) {
 |  |  func Dial(src v2net.Address, dest v2net.Destination, options DialerOptions) (Connection, error) {
 | 
											
												
													
														|  |  	if options.Proxy.HasTag() && ProxyDialer != nil {
 |  |  	if options.Proxy.HasTag() && ProxyDialer != nil {
 | 
											
												
													
														|  |  		log.Info("Internet: Proxying outbound connection through: ", options.Proxy.Tag)
 |  |  		log.Info("Internet: Proxying outbound connection through: ", options.Proxy.Tag)
 | 
											
												
													
														|  |  		return ProxyDialer(src, dest, options)
 |  |  		return ProxyDialer(src, dest, options)
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -	var connection Connection
 |  | 
 | 
											
												
													
														|  | -	var err error
 |  | 
 | 
											
												
													
														|  |  	if dest.Network == v2net.Network_TCP {
 |  |  	if dest.Network == v2net.Network_TCP {
 | 
											
												
													
														|  | -		switch options.Stream.Network {
 |  | 
 | 
											
												
													
														|  | -		case v2net.Network_TCP:
 |  | 
 | 
											
												
													
														|  | -			connection, err = TCPDialer(src, dest, options)
 |  | 
 | 
											
												
													
														|  | -		case v2net.Network_KCP:
 |  | 
 | 
											
												
													
														|  | -			connection, err = KCPDialer(src, dest, options)
 |  | 
 | 
											
												
													
														|  | -		case v2net.Network_WebSocket:
 |  | 
 | 
											
												
													
														|  | -			connection, err = WSDialer(src, dest, options)
 |  | 
 | 
											
												
													
														|  | -		default:
 |  | 
 | 
											
												
													
														|  | -			return nil, ErrUnsupportedStreamType
 |  | 
 | 
											
												
													
														|  | 
 |  | +		dialer := networkDialerCache[options.Stream.Network]
 | 
											
												
													
														|  | 
 |  | +		if dialer == nil {
 | 
											
												
													
														|  | 
 |  | +			return nil, errors.New("Internet|Dialer: ", options.Stream.Network, " dialer not registered.")
 | 
											
												
													
														|  |  		}
 |  |  		}
 | 
											
												
													
														|  | -		if err != nil {
 |  | 
 | 
											
												
													
														|  | -			return nil, err
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -		return connection, nil
 |  | 
 | 
											
												
													
														|  | 
 |  | +		return dialer(src, dest, options)
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -	return UDPDialer(src, dest, options)
 |  | 
 | 
											
												
													
														|  | 
 |  | +	udpDialer := networkDialerCache[v2net.Network_UDP]
 | 
											
												
													
														|  | 
 |  | +	if udpDialer == nil {
 | 
											
												
													
														|  | 
 |  | +		return nil, errors.New("Internet|Dialer: UDP dialer not registered.")
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	return udpDialer(src, dest, options)
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -func DialToDest(src v2net.Address, dest v2net.Destination) (net.Conn, error) {
 |  | 
 | 
											
												
													
														|  | 
 |  | +// DialSystem calls system dialer to create a network connection.
 | 
											
												
													
														|  | 
 |  | +func DialSystem(src v2net.Address, dest v2net.Destination) (net.Conn, error) {
 | 
											
												
													
														|  |  	return effectiveSystemDialer.Dial(src, dest)
 |  |  	return effectiveSystemDialer.Dial(src, dest)
 | 
											
												
													
														|  |  }
 |  |  }
 |