dialer.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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. type DialerOptions struct {
  9. Stream *StreamConfig
  10. Proxy *ProxyConfig
  11. }
  12. type Dialer func(src v2net.Address, dest v2net.Destination, options DialerOptions) (Connection, error)
  13. var (
  14. transportDialerCache = make(map[TransportProtocol]Dialer)
  15. ProxyDialer Dialer
  16. )
  17. func RegisterTransportDialer(protocol TransportProtocol, dialer Dialer) error {
  18. if _, found := transportDialerCache[protocol]; found {
  19. return errors.New("Internet|Dialer: ", protocol, " dialer already registered.")
  20. }
  21. transportDialerCache[protocol] = dialer
  22. return nil
  23. }
  24. func Dial(src v2net.Address, dest v2net.Destination, options DialerOptions) (Connection, error) {
  25. if options.Proxy.HasTag() && ProxyDialer != nil {
  26. log.Info("Internet: Proxying outbound connection through: ", options.Proxy.Tag)
  27. return ProxyDialer(src, dest, options)
  28. }
  29. if dest.Network == v2net.Network_TCP {
  30. protocol := options.Stream.GetEffectiveProtocol()
  31. dialer := transportDialerCache[protocol]
  32. if dialer == nil {
  33. return nil, errors.New("Internet|Dialer: ", options.Stream.Protocol, " dialer not registered.")
  34. }
  35. return dialer(src, dest, options)
  36. }
  37. udpDialer := transportDialerCache[TransportProtocol_UDP]
  38. if udpDialer == nil {
  39. return nil, errors.New("Internet|Dialer: UDP dialer not registered.")
  40. }
  41. return udpDialer(src, dest, options)
  42. }
  43. // DialSystem calls system dialer to create a network connection.
  44. func DialSystem(src v2net.Address, dest v2net.Destination) (net.Conn, error) {
  45. return effectiveSystemDialer.Dial(src, dest)
  46. }