dialer.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package dns
  2. import (
  3. "context"
  4. "net"
  5. M "github.com/sagernet/sing/common/metadata"
  6. N "github.com/sagernet/sing/common/network"
  7. "github.com/sagernet/sing-box/adapter"
  8. "github.com/sagernet/sing-box/common/dialer"
  9. C "github.com/sagernet/sing-box/constant"
  10. )
  11. type DialerWrapper struct {
  12. dialer N.Dialer
  13. strategy C.DomainStrategy
  14. client adapter.DNSClient
  15. transport adapter.DNSTransport
  16. }
  17. func NewDialerWrapper(dialer N.Dialer, strategy C.DomainStrategy, client adapter.DNSClient, transport adapter.DNSTransport) N.Dialer {
  18. return &DialerWrapper{dialer, strategy, client, transport}
  19. }
  20. func (d *DialerWrapper) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
  21. if destination.IsIP() {
  22. return d.dialer.DialContext(ctx, network, destination)
  23. }
  24. addresses, err := d.client.Lookup(ctx, d.transport, destination.Fqdn, d.strategy)
  25. if err != nil {
  26. return nil, err
  27. }
  28. return dialer.DialSerial(ctx, d.dialer, network, destination, addresses)
  29. }
  30. func (d *DialerWrapper) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
  31. if destination.IsIP() {
  32. return d.dialer.ListenPacket(ctx, destination)
  33. }
  34. addresses, err := d.client.Lookup(ctx, d.transport, destination.Fqdn, d.strategy)
  35. if err != nil {
  36. return nil, err
  37. }
  38. return dialer.ListenSerial(ctx, d.dialer, destination, addresses)
  39. }
  40. func (d *DialerWrapper) Upstream() any {
  41. return d.dialer
  42. }