dialer.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package internet
  2. import (
  3. "net"
  4. "v2ray.com/core/common/errors"
  5. "v2ray.com/core/common/log"
  6. v2net "v2ray.com/core/common/net"
  7. )
  8. var (
  9. ErrUnsupportedStreamType = errors.New("Unsupported stream type.")
  10. )
  11. type DialerOptions struct {
  12. Stream *StreamConfig
  13. Proxy *ProxyConfig
  14. }
  15. type Dialer func(src v2net.Address, dest v2net.Destination, options DialerOptions) (Connection, error)
  16. var (
  17. networkDialerCache = make(map[v2net.Network]Dialer)
  18. ProxyDialer Dialer
  19. )
  20. func RegisterNetworkDialer(network v2net.Network, dialer Dialer) error {
  21. if _, found := networkDialerCache[network]; found {
  22. return errors.New("Internet|Dialer: ", network, " dialer already registered.")
  23. }
  24. networkDialerCache[network] = dialer
  25. return nil
  26. }
  27. func Dial(src v2net.Address, dest v2net.Destination, options DialerOptions) (Connection, error) {
  28. if options.Proxy.HasTag() && ProxyDialer != nil {
  29. log.Info("Internet: Proxying outbound connection through: ", options.Proxy.Tag)
  30. return ProxyDialer(src, dest, options)
  31. }
  32. if dest.Network == v2net.Network_TCP {
  33. dialer := networkDialerCache[options.Stream.Network]
  34. if dialer == nil {
  35. return nil, errors.New("Internet|Dialer: ", options.Stream.Network, " dialer not registered.")
  36. }
  37. return dialer(src, dest, options)
  38. }
  39. udpDialer := networkDialerCache[v2net.Network_UDP]
  40. if udpDialer == nil {
  41. return nil, errors.New("Internet|Dialer: UDP dialer not registered.")
  42. }
  43. return udpDialer(src, dest, options)
  44. }
  45. // DialSystem calls system dialer to create a network connection.
  46. func DialSystem(src v2net.Address, dest v2net.Destination) (net.Conn, error) {
  47. return effectiveSystemDialer.Dial(src, dest)
  48. }