sing.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package proxydialer
  2. import (
  3. "context"
  4. "net"
  5. C "github.com/metacubex/mihomo/constant"
  6. M "github.com/sagernet/sing/common/metadata"
  7. N "github.com/sagernet/sing/common/network"
  8. )
  9. type SingDialer interface {
  10. N.Dialer
  11. SetDialer(dialer C.Dialer)
  12. }
  13. type singDialer proxyDialer
  14. var _ N.Dialer = (*singDialer)(nil)
  15. func (d *singDialer) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
  16. return (*proxyDialer)(d).DialContext(ctx, network, destination.String())
  17. }
  18. func (d *singDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
  19. return (*proxyDialer)(d).ListenPacket(ctx, "udp", "", destination.AddrPort())
  20. }
  21. func (d *singDialer) SetDialer(dialer C.Dialer) {
  22. (*proxyDialer)(d).dialer = dialer
  23. }
  24. func NewSingDialer(proxy C.ProxyAdapter, dialer C.Dialer, statistic bool) SingDialer {
  25. return (*singDialer)(&proxyDialer{
  26. proxy: proxy,
  27. dialer: dialer,
  28. statistic: statistic,
  29. })
  30. }
  31. type byNameSingDialer struct {
  32. dialer C.Dialer
  33. proxyName string
  34. }
  35. var _ N.Dialer = (*byNameSingDialer)(nil)
  36. func (d *byNameSingDialer) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
  37. var cDialer C.Dialer = d.dialer
  38. if len(d.proxyName) > 0 {
  39. pd, err := NewByName(d.proxyName, d.dialer)
  40. if err != nil {
  41. return nil, err
  42. }
  43. cDialer = pd
  44. }
  45. return cDialer.DialContext(ctx, network, destination.String())
  46. }
  47. func (d *byNameSingDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
  48. var cDialer C.Dialer = d.dialer
  49. if len(d.proxyName) > 0 {
  50. pd, err := NewByName(d.proxyName, d.dialer)
  51. if err != nil {
  52. return nil, err
  53. }
  54. cDialer = pd
  55. }
  56. return cDialer.ListenPacket(ctx, "udp", "", destination.AddrPort())
  57. }
  58. func (d *byNameSingDialer) SetDialer(dialer C.Dialer) {
  59. d.dialer = dialer
  60. }
  61. func NewByNameSingDialer(proxyName string, dialer C.Dialer) SingDialer {
  62. return &byNameSingDialer{
  63. dialer: dialer,
  64. proxyName: proxyName,
  65. }
  66. }