transport_test.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. package scenarios
  2. import (
  3. "os"
  4. "runtime"
  5. "testing"
  6. "time"
  7. "v2ray.com/core"
  8. "v2ray.com/core/app/proxyman"
  9. "v2ray.com/core/common/net"
  10. "v2ray.com/core/common/protocol"
  11. "v2ray.com/core/common/serial"
  12. "v2ray.com/core/common/uuid"
  13. "v2ray.com/core/proxy/dokodemo"
  14. "v2ray.com/core/proxy/freedom"
  15. "v2ray.com/core/proxy/vmess"
  16. "v2ray.com/core/proxy/vmess/inbound"
  17. "v2ray.com/core/proxy/vmess/outbound"
  18. "v2ray.com/core/testing/servers/tcp"
  19. "v2ray.com/core/transport/internet"
  20. "v2ray.com/core/transport/internet/domainsocket"
  21. "v2ray.com/core/transport/internet/headers/http"
  22. tcptransport "v2ray.com/core/transport/internet/tcp"
  23. . "v2ray.com/ext/assert"
  24. )
  25. func TestHttpConnectionHeader(t *testing.T) {
  26. assert := With(t)
  27. tcpServer := tcp.Server{
  28. MsgProcessor: xor,
  29. }
  30. dest, err := tcpServer.Start()
  31. assert(err, IsNil)
  32. defer tcpServer.Close()
  33. userID := protocol.NewID(uuid.New())
  34. serverPort := tcp.PickPort()
  35. serverConfig := &core.Config{
  36. Inbound: []*core.InboundHandlerConfig{
  37. {
  38. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  39. PortRange: net.SinglePortRange(serverPort),
  40. Listen: net.NewIPOrDomain(net.LocalHostIP),
  41. StreamSettings: &internet.StreamConfig{
  42. TransportSettings: []*internet.TransportConfig{
  43. {
  44. Protocol: internet.TransportProtocol_TCP,
  45. Settings: serial.ToTypedMessage(&tcptransport.Config{
  46. HeaderSettings: serial.ToTypedMessage(&http.Config{}),
  47. }),
  48. },
  49. },
  50. },
  51. }),
  52. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  53. User: []*protocol.User{
  54. {
  55. Account: serial.ToTypedMessage(&vmess.Account{
  56. Id: userID.String(),
  57. }),
  58. },
  59. },
  60. }),
  61. },
  62. },
  63. Outbound: []*core.OutboundHandlerConfig{
  64. {
  65. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  66. },
  67. },
  68. }
  69. clientPort := tcp.PickPort()
  70. clientConfig := &core.Config{
  71. Inbound: []*core.InboundHandlerConfig{
  72. {
  73. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  74. PortRange: net.SinglePortRange(clientPort),
  75. Listen: net.NewIPOrDomain(net.LocalHostIP),
  76. }),
  77. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  78. Address: net.NewIPOrDomain(dest.Address),
  79. Port: uint32(dest.Port),
  80. NetworkList: &net.NetworkList{
  81. Network: []net.Network{net.Network_TCP},
  82. },
  83. }),
  84. },
  85. },
  86. Outbound: []*core.OutboundHandlerConfig{
  87. {
  88. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  89. Receiver: []*protocol.ServerEndpoint{
  90. {
  91. Address: net.NewIPOrDomain(net.LocalHostIP),
  92. Port: uint32(serverPort),
  93. User: []*protocol.User{
  94. {
  95. Account: serial.ToTypedMessage(&vmess.Account{
  96. Id: userID.String(),
  97. }),
  98. },
  99. },
  100. },
  101. },
  102. }),
  103. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  104. StreamSettings: &internet.StreamConfig{
  105. TransportSettings: []*internet.TransportConfig{
  106. {
  107. Protocol: internet.TransportProtocol_TCP,
  108. Settings: serial.ToTypedMessage(&tcptransport.Config{
  109. HeaderSettings: serial.ToTypedMessage(&http.Config{}),
  110. }),
  111. },
  112. },
  113. },
  114. }),
  115. },
  116. },
  117. }
  118. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  119. assert(err, IsNil)
  120. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  121. IP: []byte{127, 0, 0, 1},
  122. Port: int(clientPort),
  123. })
  124. assert(err, IsNil)
  125. payload := "dokodemo request."
  126. nBytes, err := conn.Write([]byte(payload))
  127. assert(err, IsNil)
  128. assert(nBytes, Equals, len(payload))
  129. response := readFrom(conn, time.Second*2, len(payload))
  130. assert(response, Equals, xor([]byte(payload)))
  131. assert(conn.Close(), IsNil)
  132. CloseAllServers(servers)
  133. }
  134. func TestDomainSocket(t *testing.T) {
  135. if runtime.GOOS == "windows" {
  136. t.Skip("Not supported on windows")
  137. return
  138. }
  139. assert := With(t)
  140. tcpServer := tcp.Server{
  141. MsgProcessor: xor,
  142. }
  143. dest, err := tcpServer.Start()
  144. assert(err, IsNil)
  145. defer tcpServer.Close()
  146. const dsPath = "/tmp/ds_scenario"
  147. os.Remove(dsPath)
  148. userID := protocol.NewID(uuid.New())
  149. serverPort := tcp.PickPort()
  150. serverConfig := &core.Config{
  151. Inbound: []*core.InboundHandlerConfig{
  152. {
  153. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  154. PortRange: net.SinglePortRange(serverPort),
  155. Listen: net.NewIPOrDomain(net.LocalHostIP),
  156. StreamSettings: &internet.StreamConfig{
  157. Protocol: internet.TransportProtocol_DomainSocket,
  158. TransportSettings: []*internet.TransportConfig{
  159. {
  160. Protocol: internet.TransportProtocol_DomainSocket,
  161. Settings: serial.ToTypedMessage(&domainsocket.Config{
  162. Path: dsPath,
  163. }),
  164. },
  165. },
  166. },
  167. }),
  168. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  169. User: []*protocol.User{
  170. {
  171. Account: serial.ToTypedMessage(&vmess.Account{
  172. Id: userID.String(),
  173. }),
  174. },
  175. },
  176. }),
  177. },
  178. },
  179. Outbound: []*core.OutboundHandlerConfig{
  180. {
  181. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  182. },
  183. },
  184. }
  185. clientPort := tcp.PickPort()
  186. clientConfig := &core.Config{
  187. Inbound: []*core.InboundHandlerConfig{
  188. {
  189. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  190. PortRange: net.SinglePortRange(clientPort),
  191. Listen: net.NewIPOrDomain(net.LocalHostIP),
  192. }),
  193. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  194. Address: net.NewIPOrDomain(dest.Address),
  195. Port: uint32(dest.Port),
  196. NetworkList: &net.NetworkList{
  197. Network: []net.Network{net.Network_TCP},
  198. },
  199. }),
  200. },
  201. },
  202. Outbound: []*core.OutboundHandlerConfig{
  203. {
  204. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  205. Receiver: []*protocol.ServerEndpoint{
  206. {
  207. Address: net.NewIPOrDomain(net.LocalHostIP),
  208. Port: uint32(serverPort),
  209. User: []*protocol.User{
  210. {
  211. Account: serial.ToTypedMessage(&vmess.Account{
  212. Id: userID.String(),
  213. }),
  214. },
  215. },
  216. },
  217. },
  218. }),
  219. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  220. StreamSettings: &internet.StreamConfig{
  221. Protocol: internet.TransportProtocol_DomainSocket,
  222. TransportSettings: []*internet.TransportConfig{
  223. {
  224. Protocol: internet.TransportProtocol_DomainSocket,
  225. Settings: serial.ToTypedMessage(&domainsocket.Config{
  226. Path: dsPath,
  227. }),
  228. },
  229. },
  230. },
  231. }),
  232. },
  233. },
  234. }
  235. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  236. assert(err, IsNil)
  237. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  238. IP: []byte{127, 0, 0, 1},
  239. Port: int(clientPort),
  240. })
  241. assert(err, IsNil)
  242. payload := "dokodemo request."
  243. nBytes, err := conn.Write([]byte(payload))
  244. assert(err, IsNil)
  245. assert(nBytes, Equals, len(payload))
  246. response := readFrom(conn, time.Second*2, len(payload))
  247. assert(response, Equals, xor([]byte(payload)))
  248. assert(conn.Close(), IsNil)
  249. CloseAllServers(servers)
  250. }