client.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package tls
  2. import (
  3. "context"
  4. "net"
  5. "os"
  6. "github.com/sagernet/sing-box/adapter"
  7. C "github.com/sagernet/sing-box/constant"
  8. "github.com/sagernet/sing-box/option"
  9. M "github.com/sagernet/sing/common/metadata"
  10. N "github.com/sagernet/sing/common/network"
  11. )
  12. func NewDialerFromOptions(router adapter.Router, dialer N.Dialer, serverAddress string, options option.OutboundTLSOptions) (N.Dialer, error) {
  13. config, err := NewClient(router, serverAddress, options)
  14. if err != nil {
  15. return nil, err
  16. }
  17. return NewDialer(dialer, config), nil
  18. }
  19. func NewClient(router adapter.Router, serverAddress string, options option.OutboundTLSOptions) (Config, error) {
  20. return newStdClient(serverAddress, options)
  21. }
  22. func ClientHandshake(ctx context.Context, conn net.Conn, config Config) (net.Conn, error) {
  23. tlsConn := config.Client(conn)
  24. ctx, cancel := context.WithTimeout(ctx, C.TCPTimeout)
  25. defer cancel()
  26. err := tlsConn.HandshakeContext(ctx)
  27. return tlsConn, err
  28. }
  29. type Dialer struct {
  30. dialer N.Dialer
  31. config Config
  32. }
  33. func NewDialer(dialer N.Dialer, config Config) N.Dialer {
  34. return &Dialer{dialer, config}
  35. }
  36. func (d *Dialer) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
  37. if network != N.NetworkTCP {
  38. return nil, os.ErrInvalid
  39. }
  40. conn, err := d.dialer.DialContext(ctx, network, destination)
  41. if err != nil {
  42. return nil, err
  43. }
  44. return ClientHandshake(ctx, conn, d.config)
  45. }
  46. func (d *Dialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
  47. return nil, os.ErrInvalid
  48. }