dialer_tls.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package singbridge
  2. import (
  3. "context"
  4. gotls "crypto/tls"
  5. "os"
  6. E "github.com/sagernet/sing/common/exceptions"
  7. M "github.com/sagernet/sing/common/metadata"
  8. "github.com/xtls/xray-core/common/net"
  9. "github.com/xtls/xray-core/transport/internet"
  10. "github.com/xtls/xray-core/transport/internet/tls"
  11. )
  12. type XrayTLSDialer struct {
  13. dialer internet.Dialer
  14. clientFunc tls.CustomClientFunc
  15. }
  16. func NewTLSDialer(dialer internet.Dialer, clientFunc tls.CustomClientFunc) *XrayTLSDialer {
  17. return &XrayTLSDialer{dialer, clientFunc}
  18. }
  19. func (d *XrayTLSDialer) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
  20. var internetTLSConfig *tls.Config
  21. var tlsConfig *gotls.Config
  22. conn, err := d.dialer.Dial(tls.ContextWithCustomClient(ctx, func(conn net.Conn, xrayConfig *tls.Config, config *gotls.Config) net.Conn {
  23. internetTLSConfig = xrayConfig
  24. tlsConfig = config
  25. return conn
  26. }), ToDestination(destination, ToNetwork(network)))
  27. if err != nil {
  28. return nil, err
  29. }
  30. if tlsConfig == nil {
  31. return nil, E.New("missing TLS config")
  32. }
  33. return d.clientFunc(conn, internetTLSConfig, tlsConfig), nil
  34. }
  35. func (d *XrayTLSDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
  36. return nil, os.ErrInvalid
  37. }