transport_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package scenarios
  2. import (
  3. "net"
  4. "testing"
  5. "time"
  6. "v2ray.com/core"
  7. "v2ray.com/core/app/proxyman"
  8. v2net "v2ray.com/core/common/net"
  9. "v2ray.com/core/common/protocol"
  10. "v2ray.com/core/common/serial"
  11. "v2ray.com/core/common/uuid"
  12. "v2ray.com/core/proxy/dokodemo"
  13. "v2ray.com/core/proxy/freedom"
  14. "v2ray.com/core/proxy/vmess"
  15. "v2ray.com/core/proxy/vmess/inbound"
  16. "v2ray.com/core/proxy/vmess/outbound"
  17. "v2ray.com/core/testing/assert"
  18. "v2ray.com/core/testing/servers/tcp"
  19. "v2ray.com/core/transport/internet"
  20. "v2ray.com/core/transport/internet/headers/http"
  21. tcptransport "v2ray.com/core/transport/internet/tcp"
  22. )
  23. func TestNoOpConnectionHeader(t *testing.T) {
  24. assert := assert.On(t)
  25. tcpServer := tcp.Server{
  26. MsgProcessor: xor,
  27. }
  28. dest, err := tcpServer.Start()
  29. assert.Error(err).IsNil()
  30. defer tcpServer.Close()
  31. userID := protocol.NewID(uuid.New())
  32. serverPort := pickPort()
  33. serverConfig := &core.Config{
  34. Inbound: []*proxyman.InboundHandlerConfig{
  35. {
  36. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  37. PortRange: v2net.SinglePortRange(serverPort),
  38. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  39. StreamSettings: &internet.StreamConfig{
  40. TransportSettings: []*internet.TransportConfig{
  41. {
  42. Protocol: internet.TransportProtocol_TCP,
  43. Settings: serial.ToTypedMessage(&tcptransport.Config{
  44. HeaderSettings: serial.ToTypedMessage(&http.Config{}),
  45. }),
  46. },
  47. },
  48. },
  49. }),
  50. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  51. User: []*protocol.User{
  52. {
  53. Account: serial.ToTypedMessage(&vmess.Account{
  54. Id: userID.String(),
  55. }),
  56. },
  57. },
  58. }),
  59. },
  60. },
  61. Outbound: []*proxyman.OutboundHandlerConfig{
  62. {
  63. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  64. },
  65. },
  66. }
  67. clientPort := pickPort()
  68. clientConfig := &core.Config{
  69. Inbound: []*proxyman.InboundHandlerConfig{
  70. {
  71. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  72. PortRange: v2net.SinglePortRange(clientPort),
  73. Listen: v2net.NewIPOrDomain(v2net.LocalHostIP),
  74. }),
  75. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  76. Address: v2net.NewIPOrDomain(dest.Address),
  77. Port: uint32(dest.Port),
  78. NetworkList: &v2net.NetworkList{
  79. Network: []v2net.Network{v2net.Network_TCP},
  80. },
  81. }),
  82. },
  83. },
  84. Outbound: []*proxyman.OutboundHandlerConfig{
  85. {
  86. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  87. Receiver: []*protocol.ServerEndpoint{
  88. {
  89. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  90. Port: uint32(serverPort),
  91. User: []*protocol.User{
  92. {
  93. Account: serial.ToTypedMessage(&vmess.Account{
  94. Id: userID.String(),
  95. }),
  96. },
  97. },
  98. },
  99. },
  100. }),
  101. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  102. StreamSettings: &internet.StreamConfig{
  103. TransportSettings: []*internet.TransportConfig{
  104. {
  105. Protocol: internet.TransportProtocol_TCP,
  106. Settings: serial.ToTypedMessage(&tcptransport.Config{
  107. HeaderSettings: serial.ToTypedMessage(&http.Config{}),
  108. }),
  109. },
  110. },
  111. },
  112. }),
  113. },
  114. },
  115. }
  116. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  117. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  118. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  119. IP: []byte{127, 0, 0, 1},
  120. Port: int(clientPort),
  121. })
  122. assert.Error(err).IsNil()
  123. payload := "dokodemo request."
  124. nBytes, err := conn.Write([]byte(payload))
  125. assert.Error(err).IsNil()
  126. assert.Int(nBytes).Equals(len(payload))
  127. response := readFrom(conn, time.Second*2, len(payload))
  128. assert.Bytes(response).Equals(xor([]byte(payload)))
  129. assert.Error(conn.Close()).IsNil()
  130. CloseAllServers()
  131. }