dialer.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package internet
  2. import (
  3. "context"
  4. "net"
  5. "v2ray.com/core/common/errors"
  6. v2net "v2ray.com/core/common/net"
  7. )
  8. type Dialer func(ctx context.Context, dest v2net.Destination) (Connection, error)
  9. var (
  10. transportDialerCache = make(map[TransportProtocol]Dialer)
  11. )
  12. func RegisterTransportDialer(protocol TransportProtocol, dialer Dialer) error {
  13. if _, found := transportDialerCache[protocol]; found {
  14. return errors.New("Internet|Dialer: ", protocol, " dialer already registered.")
  15. }
  16. transportDialerCache[protocol] = dialer
  17. return nil
  18. }
  19. func Dial(ctx context.Context, dest v2net.Destination) (Connection, error) {
  20. if dest.Network == v2net.Network_TCP {
  21. streamSettings := StreamSettingsFromContext(ctx)
  22. protocol := streamSettings.GetEffectiveProtocol()
  23. transportSettings, err := streamSettings.GetEffectiveTransportSettings()
  24. if err != nil {
  25. return nil, err
  26. }
  27. ctx = ContextWithTransportSettings(ctx, transportSettings)
  28. if streamSettings != nil && streamSettings.HasSecuritySettings() {
  29. securitySettings, err := streamSettings.GetEffectiveSecuritySettings()
  30. if err != nil {
  31. return nil, err
  32. }
  33. ctx = ContextWithSecuritySettings(ctx, securitySettings)
  34. }
  35. dialer := transportDialerCache[protocol]
  36. if dialer == nil {
  37. return nil, errors.New("Internet|Dialer: ", protocol, " dialer not registered.")
  38. }
  39. return dialer(ctx, dest)
  40. }
  41. udpDialer := transportDialerCache[TransportProtocol_UDP]
  42. if udpDialer == nil {
  43. return nil, errors.New("Internet|Dialer: UDP dialer not registered.")
  44. }
  45. return udpDialer(ctx, dest)
  46. }
  47. // DialSystem calls system dialer to create a network connection.
  48. func DialSystem(ctx context.Context, src v2net.Address, dest v2net.Destination) (net.Conn, error) {
  49. return effectiveSystemDialer.Dial(ctx, src, dest)
  50. }