transport.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package dns
  2. import (
  3. "context"
  4. "net/url"
  5. "github.com/sagernet/sing-box/adapter"
  6. "github.com/sagernet/sing-box/log"
  7. E "github.com/sagernet/sing/common/exceptions"
  8. M "github.com/sagernet/sing/common/metadata"
  9. N "github.com/sagernet/sing/common/network"
  10. )
  11. func NewTransport(ctx context.Context, dialer N.Dialer, logger log.Logger, address string) (adapter.DNSTransport, error) {
  12. if address == "local" {
  13. return NewLocalTransport(), nil
  14. }
  15. serverURL, err := url.Parse(address)
  16. if err != nil {
  17. return nil, err
  18. }
  19. host := serverURL.Hostname()
  20. if host == "" {
  21. host = address
  22. }
  23. port := serverURL.Port()
  24. switch serverURL.Scheme {
  25. case "tls":
  26. if port == "" {
  27. port = "853"
  28. }
  29. default:
  30. if port == "" {
  31. port = "53"
  32. }
  33. }
  34. destination := M.ParseSocksaddrHostPortStr(host, port)
  35. switch serverURL.Scheme {
  36. case "", "udp":
  37. return NewUDPTransport(ctx, dialer, logger, destination), nil
  38. case "tcp":
  39. return NewTCPTransport(ctx, dialer, logger, destination), nil
  40. case "tls":
  41. return NewTLSTransport(ctx, dialer, logger, destination), nil
  42. case "https":
  43. return NewHTTPSTransport(dialer, serverURL.String()), nil
  44. default:
  45. return nil, E.New("unknown dns scheme: " + serverURL.Scheme)
  46. }
  47. }