transport.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package dns
  2. import (
  3. "context"
  4. "net/url"
  5. E "github.com/sagernet/sing/common/exceptions"
  6. M "github.com/sagernet/sing/common/metadata"
  7. N "github.com/sagernet/sing/common/network"
  8. "github.com/sagernet/sing-box/adapter"
  9. "github.com/sagernet/sing-box/log"
  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. if port == "" {
  22. port = "53"
  23. }
  24. destination := M.ParseSocksaddrHostPortStr(host, port)
  25. switch serverURL.Scheme {
  26. case "", "udp":
  27. return NewUDPTransport(ctx, dialer, logger, destination), nil
  28. case "tcp":
  29. return NewTCPTransport(ctx, dialer, logger, destination), nil
  30. case "tls":
  31. return NewTLSTransport(ctx, dialer, logger, destination), nil
  32. case "https":
  33. return NewHTTPSTransport(dialer, serverURL.String()), nil
  34. default:
  35. return nil, E.New("unknown dns scheme: " + serverURL.Scheme)
  36. }
  37. }