dialer.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package assembly
  2. import (
  3. "context"
  4. gonet "net"
  5. "time"
  6. "github.com/v2fly/v2ray-core/v5/transport/internet/transportcommon"
  7. "github.com/v2fly/v2ray-core/v5/common"
  8. "github.com/v2fly/v2ray-core/v5/common/net"
  9. "github.com/v2fly/v2ray-core/v5/common/serial"
  10. "github.com/v2fly/v2ray-core/v5/common/session"
  11. "github.com/v2fly/v2ray-core/v5/transport/internet"
  12. "github.com/v2fly/v2ray-core/v5/transport/internet/request"
  13. )
  14. type client struct {
  15. tripper request.RoundTripperClient
  16. assembler request.SessionAssemblerClient
  17. streamSettings *internet.MemoryStreamConfig
  18. dest net.Destination
  19. }
  20. func (c client) Dial(ctx context.Context) (net.Conn, error) {
  21. return transportcommon.DialWithSecuritySettings(ctx, c.dest, c.streamSettings)
  22. }
  23. func (c client) AutoImplDialer() request.Dialer {
  24. return c
  25. }
  26. func (c client) Tripper() request.Tripper {
  27. return c.tripper
  28. }
  29. func (c client) dialRequestSession(ctx context.Context) (net.Conn, error) {
  30. session, err := c.assembler.NewSession(ctx)
  31. if err != nil {
  32. return nil, newError("failed to create new session").Base(err)
  33. }
  34. return clientConnection{session}, nil
  35. }
  36. type clientConnection struct {
  37. request.Session
  38. }
  39. func (c clientConnection) LocalAddr() gonet.Addr {
  40. return &net.UnixAddr{Name: "unimplemented"}
  41. }
  42. func (c clientConnection) RemoteAddr() gonet.Addr {
  43. return &net.UnixAddr{Name: "unimplemented"}
  44. }
  45. func (c clientConnection) SetDeadline(t time.Time) error {
  46. // Unimplemented
  47. return nil
  48. }
  49. func (c clientConnection) SetReadDeadline(t time.Time) error {
  50. // Unimplemented
  51. return nil
  52. }
  53. func (c clientConnection) SetWriteDeadline(t time.Time) error {
  54. // Unimplemented
  55. return nil
  56. }
  57. func dialRequest(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (net.Conn, error) {
  58. clientAssembly := &client{}
  59. transportConfiguration := streamSettings.ProtocolSettings.(*Config)
  60. assemblerConfigInstance, err := serial.GetInstanceOf(transportConfiguration.Assembler)
  61. if err != nil {
  62. return nil, newError("failed to get config instance of assembler").Base(err)
  63. }
  64. assembler, err := common.CreateObject(ctx, assemblerConfigInstance)
  65. if err != nil {
  66. return nil, newError("failed to create assembler").Base(err)
  67. }
  68. if typedAssembler, ok := assembler.(request.SessionAssemblerClient); !ok {
  69. return nil, newError("failed to type assert assembler to SessionAssemblerClient")
  70. } else {
  71. clientAssembly.assembler = typedAssembler
  72. }
  73. roundtripperConfigInstance, err := serial.GetInstanceOf(transportConfiguration.Roundtripper)
  74. if err != nil {
  75. return nil, newError("failed to get config instance of roundtripper").Base(err)
  76. }
  77. roundtripper, err := common.CreateObject(ctx, roundtripperConfigInstance)
  78. if err != nil {
  79. return nil, newError("failed to create roundtripper").Base(err)
  80. }
  81. if typedRoundtripper, ok := roundtripper.(request.RoundTripperClient); !ok {
  82. return nil, newError("failed to type assert roundtripper to RoundTripperClient")
  83. } else {
  84. clientAssembly.tripper = typedRoundtripper
  85. }
  86. clientAssembly.streamSettings = streamSettings
  87. clientAssembly.dest = dest
  88. clientAssembly.assembler.OnTransportClientAssemblyReady(clientAssembly)
  89. clientAssembly.tripper.OnTransportClientAssemblyReady(clientAssembly)
  90. return clientAssembly.dialRequestSession(ctx)
  91. }
  92. func dial(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (internet.Connection, error) {
  93. newError("creating connection to ", dest).WriteToLog(session.ExportIDToError(ctx))
  94. conn, err := dialRequest(ctx, dest, streamSettings)
  95. if err != nil {
  96. return nil, newError("failed to dial request to ", dest).Base(err)
  97. }
  98. return internet.Connection(conn), nil
  99. }
  100. func init() {
  101. common.Must(internet.RegisterTransportDialer(protocolName, dial))
  102. }