transport.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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. port := serverURL.Port()
  21. switch serverURL.Scheme {
  22. case "tls":
  23. if port == "" {
  24. port = "853"
  25. }
  26. default:
  27. if port == "" {
  28. port = "53"
  29. }
  30. }
  31. destination := M.ParseSocksaddrHostPortStr(host, port)
  32. switch serverURL.Scheme {
  33. case "", "udp":
  34. return NewUDPTransport(ctx, dialer, logger, destination), nil
  35. case "tcp":
  36. return NewTCPTransport(ctx, dialer, logger, destination), nil
  37. case "tls":
  38. return NewTLSTransport(ctx, dialer, logger, destination), nil
  39. case "https":
  40. return NewHTTPSTransport(dialer, serverURL.String()), nil
  41. default:
  42. return nil, E.New("unknown dns scheme: " + serverURL.Scheme)
  43. }
  44. }