dialer.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package singbridge
  2. import (
  3. "context"
  4. "os"
  5. M "github.com/sagernet/sing/common/metadata"
  6. N "github.com/sagernet/sing/common/network"
  7. "github.com/xtls/xray-core/common/net"
  8. "github.com/xtls/xray-core/common/net/cnc"
  9. "github.com/xtls/xray-core/common/session"
  10. "github.com/xtls/xray-core/proxy"
  11. "github.com/xtls/xray-core/transport"
  12. "github.com/xtls/xray-core/transport/internet"
  13. "github.com/xtls/xray-core/transport/pipe"
  14. )
  15. var _ N.Dialer = (*XrayDialer)(nil)
  16. type XrayDialer struct {
  17. internet.Dialer
  18. }
  19. func NewDialer(dialer internet.Dialer) *XrayDialer {
  20. return &XrayDialer{dialer}
  21. }
  22. func (d *XrayDialer) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
  23. return d.Dialer.Dial(ctx, ToDestination(destination, ToNetwork(network)))
  24. }
  25. func (d *XrayDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
  26. return nil, os.ErrInvalid
  27. }
  28. type XrayOutboundDialer struct {
  29. outbound proxy.Outbound
  30. dialer internet.Dialer
  31. }
  32. func NewOutboundDialer(outbound proxy.Outbound, dialer internet.Dialer) *XrayOutboundDialer {
  33. return &XrayOutboundDialer{outbound, dialer}
  34. }
  35. func (d *XrayOutboundDialer) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
  36. outbounds := session.OutboundsFromContext(ctx)
  37. if len(outbounds) == 0 {
  38. outbounds = []*session.Outbound{{}}
  39. ctx = session.ContextWithOutbounds(ctx, outbounds)
  40. }
  41. ob := outbounds[len(outbounds) - 1]
  42. ob.Target = ToDestination(destination, ToNetwork(network))
  43. opts := []pipe.Option{pipe.WithSizeLimit(64 * 1024)}
  44. uplinkReader, uplinkWriter := pipe.New(opts...)
  45. downlinkReader, downlinkWriter := pipe.New(opts...)
  46. conn := cnc.NewConnection(cnc.ConnectionInputMulti(downlinkWriter), cnc.ConnectionOutputMulti(uplinkReader))
  47. go d.outbound.Process(ctx, &transport.Link{Reader: downlinkReader, Writer: uplinkWriter}, d.dialer)
  48. return conn, nil
  49. }
  50. func (d *XrayOutboundDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
  51. return nil, os.ErrInvalid
  52. }