dialer.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package tcp
  2. import (
  3. "context"
  4. "v2ray.com/core/common"
  5. "v2ray.com/core/common/net"
  6. "v2ray.com/core/transport/internet"
  7. "v2ray.com/core/transport/internet/tls"
  8. )
  9. func getTCPSettingsFromContext(ctx context.Context) *Config {
  10. rawTCPSettings := internet.TransportSettingsFromContext(ctx)
  11. if rawTCPSettings == nil {
  12. return nil
  13. }
  14. return rawTCPSettings.(*Config)
  15. }
  16. func Dial(ctx context.Context, dest net.Destination) (internet.Connection, error) {
  17. newError("dialing TCP to ", dest).WriteToLog()
  18. src := internet.DialerSourceFromContext(ctx)
  19. conn, err := internet.DialSystem(ctx, src, dest)
  20. if err != nil {
  21. return nil, err
  22. }
  23. if config := tls.ConfigFromContext(ctx, tls.WithDestination(dest), tls.WithNextProto("h2")); config != nil {
  24. conn = tls.Client(conn, config.GetTLSConfig())
  25. }
  26. tcpSettings := getTCPSettingsFromContext(ctx)
  27. if tcpSettings != nil && tcpSettings.HeaderSettings != nil {
  28. headerConfig, err := tcpSettings.HeaderSettings.GetInstance()
  29. if err != nil {
  30. return nil, newError("failed to get header settings").Base(err).AtError()
  31. }
  32. auth, err := internet.CreateConnectionAuthenticator(headerConfig)
  33. if err != nil {
  34. return nil, newError("failed to create header authenticator").Base(err).AtError()
  35. }
  36. conn = auth.Client(conn)
  37. }
  38. return internet.Connection(conn), nil
  39. }
  40. func init() {
  41. common.Must(internet.RegisterTransportDialer(internet.TransportProtocol_TCP, Dial))
  42. }