ws_test.go 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. package ws_test
  2. import (
  3. "io/ioutil"
  4. "testing"
  5. "time"
  6. "v2ray.com/core/common/loader"
  7. v2net "v2ray.com/core/common/net"
  8. "v2ray.com/core/testing/assert"
  9. "v2ray.com/core/transport/internet"
  10. v2tls "v2ray.com/core/transport/internet/tls"
  11. . "v2ray.com/core/transport/internet/ws"
  12. )
  13. func Test_Connect_ws(t *testing.T) {
  14. assert := assert.On(t)
  15. conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("echo.websocket.org"), 80), internet.DialerOptions{
  16. Stream: &internet.StreamConfig{
  17. Network: v2net.Network_WebSocket,
  18. NetworkSettings: []*internet.NetworkSettings{
  19. {
  20. Network: v2net.Network_WebSocket,
  21. Settings: loader.NewTypedSettings(&Config{
  22. Path: "",
  23. }),
  24. },
  25. },
  26. },
  27. })
  28. assert.Error(err).IsNil()
  29. conn.Write([]byte("echo"))
  30. s := make(chan int)
  31. go func() {
  32. buf := make([]byte, 4)
  33. conn.Read(buf)
  34. str := string(buf)
  35. if str != "echo" {
  36. assert.Fail("Data mismatch")
  37. }
  38. s <- 0
  39. }()
  40. <-s
  41. conn.Close()
  42. }
  43. func Test_Connect_wss(t *testing.T) {
  44. assert := assert.On(t)
  45. conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("echo.websocket.org"), 443), internet.DialerOptions{
  46. Stream: &internet.StreamConfig{
  47. Network: v2net.Network_WebSocket,
  48. NetworkSettings: []*internet.NetworkSettings{
  49. {
  50. Network: v2net.Network_WebSocket,
  51. Settings: loader.NewTypedSettings(&Config{
  52. Path: "",
  53. }),
  54. },
  55. },
  56. SecurityType: loader.GetType(new(v2tls.Config)),
  57. },
  58. })
  59. assert.Error(err).IsNil()
  60. conn.Write([]byte("echo"))
  61. s := make(chan int)
  62. go func() {
  63. buf := make([]byte, 4)
  64. conn.Read(buf)
  65. str := string(buf)
  66. if str != "echo" {
  67. assert.Fail("Data mismatch")
  68. }
  69. s <- 0
  70. }()
  71. <-s
  72. conn.Close()
  73. }
  74. func Test_Connect_wss_1_nil(t *testing.T) {
  75. assert := assert.On(t)
  76. conn, err := Dial(nil, v2net.TCPDestination(v2net.DomainAddress("echo.websocket.org"), 443), internet.DialerOptions{
  77. Stream: &internet.StreamConfig{
  78. Network: v2net.Network_WebSocket,
  79. NetworkSettings: []*internet.NetworkSettings{
  80. {
  81. Network: v2net.Network_WebSocket,
  82. Settings: loader.NewTypedSettings(&Config{
  83. Path: "",
  84. }),
  85. },
  86. },
  87. SecurityType: loader.GetType(new(v2tls.Config)),
  88. },
  89. })
  90. assert.Error(err).IsNil()
  91. conn.Write([]byte("echo"))
  92. s := make(chan int)
  93. go func() {
  94. buf := make([]byte, 4)
  95. conn.Read(buf)
  96. str := string(buf)
  97. if str != "echo" {
  98. assert.Fail("Data mismatch")
  99. }
  100. s <- 0
  101. }()
  102. <-s
  103. conn.Close()
  104. }
  105. func Test_Connect_ws_guess(t *testing.T) {
  106. assert := assert.On(t)
  107. conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("echo.websocket.org"), 80), internet.DialerOptions{
  108. Stream: &internet.StreamConfig{
  109. Network: v2net.Network_WebSocket,
  110. NetworkSettings: []*internet.NetworkSettings{
  111. {
  112. Network: v2net.Network_WebSocket,
  113. Settings: loader.NewTypedSettings(&Config{
  114. Path: "",
  115. }),
  116. },
  117. },
  118. },
  119. })
  120. assert.Error(err).IsNil()
  121. conn.Write([]byte("echo"))
  122. s := make(chan int)
  123. go func() {
  124. buf := make([]byte, 4)
  125. conn.Read(buf)
  126. str := string(buf)
  127. if str != "echo" {
  128. assert.Fail("Data mismatch")
  129. }
  130. s <- 0
  131. }()
  132. <-s
  133. conn.Close()
  134. }
  135. func Test_Connect_wss_guess(t *testing.T) {
  136. assert := assert.On(t)
  137. conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("echo.websocket.org"), 443), internet.DialerOptions{
  138. Stream: &internet.StreamConfig{
  139. Network: v2net.Network_WebSocket,
  140. NetworkSettings: []*internet.NetworkSettings{
  141. {
  142. Network: v2net.Network_WebSocket,
  143. Settings: loader.NewTypedSettings(&Config{
  144. Path: "",
  145. }),
  146. },
  147. },
  148. SecurityType: loader.GetType(new(v2tls.Config)),
  149. },
  150. })
  151. assert.Error(err).IsNil()
  152. conn.Write([]byte("echo"))
  153. s := make(chan int)
  154. go func() {
  155. buf := make([]byte, 4)
  156. conn.Read(buf)
  157. str := string(buf)
  158. if str != "echo" {
  159. assert.Fail("Data mismatch")
  160. }
  161. s <- 0
  162. }()
  163. <-s
  164. conn.Close()
  165. }
  166. func Test_Connect_wss_guess_fail(t *testing.T) {
  167. assert := assert.On(t)
  168. _, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("static.kkdev.org"), 443), internet.DialerOptions{
  169. Stream: &internet.StreamConfig{
  170. Network: v2net.Network_WebSocket,
  171. NetworkSettings: []*internet.NetworkSettings{
  172. {
  173. Network: v2net.Network_WebSocket,
  174. Settings: loader.NewTypedSettings(&Config{
  175. Path: "",
  176. }),
  177. },
  178. },
  179. SecurityType: loader.GetType(new(v2tls.Config)),
  180. },
  181. })
  182. assert.Error(err).IsNotNil()
  183. }
  184. func Test_Connect_wss_guess_reuse(t *testing.T) {
  185. assert := assert.On(t)
  186. i := 3
  187. for i != 0 {
  188. conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("echo.websocket.org"), 443), internet.DialerOptions{
  189. Stream: &internet.StreamConfig{
  190. Network: v2net.Network_WebSocket,
  191. NetworkSettings: []*internet.NetworkSettings{
  192. {
  193. Network: v2net.Network_WebSocket,
  194. Settings: loader.NewTypedSettings(&Config{
  195. Path: "",
  196. ConnectionReuse: &ConnectionReuse{
  197. Enable: true,
  198. },
  199. }),
  200. },
  201. },
  202. SecurityType: loader.GetType(new(v2tls.Config)),
  203. },
  204. })
  205. assert.Error(err).IsNil()
  206. conn.Write([]byte("echo"))
  207. s := make(chan int)
  208. go func() {
  209. buf := make([]byte, 4)
  210. conn.Read(buf)
  211. str := string(buf)
  212. if str != "echo" {
  213. assert.Fail("Data mismatch")
  214. }
  215. s <- 0
  216. }()
  217. <-s
  218. if i == 0 {
  219. conn.SetDeadline(time.Now())
  220. conn.SetReadDeadline(time.Now())
  221. conn.SetWriteDeadline(time.Now())
  222. conn.SetReusable(false)
  223. }
  224. conn.Close()
  225. i--
  226. }
  227. }
  228. func Test_listenWSAndDial(t *testing.T) {
  229. assert := assert.On(t)
  230. listen, err := ListenWS(v2net.DomainAddress("localhost"), 13146, internet.ListenOptions{
  231. Stream: &internet.StreamConfig{
  232. Network: v2net.Network_WebSocket,
  233. NetworkSettings: []*internet.NetworkSettings{
  234. {
  235. Network: v2net.Network_WebSocket,
  236. Settings: loader.NewTypedSettings(&Config{
  237. Path: "ws",
  238. }),
  239. },
  240. },
  241. },
  242. })
  243. assert.Error(err).IsNil()
  244. go func() {
  245. conn, err := listen.Accept()
  246. assert.Error(err).IsNil()
  247. conn.Close()
  248. conn, err = listen.Accept()
  249. assert.Error(err).IsNil()
  250. conn.Close()
  251. conn, err = listen.Accept()
  252. assert.Error(err).IsNil()
  253. conn.Close()
  254. listen.Close()
  255. }()
  256. conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13146), internet.DialerOptions{
  257. Stream: &internet.StreamConfig{
  258. Network: v2net.Network_WebSocket,
  259. NetworkSettings: []*internet.NetworkSettings{
  260. {
  261. Network: v2net.Network_WebSocket,
  262. Settings: loader.NewTypedSettings(&Config{
  263. Path: "ws",
  264. }),
  265. },
  266. },
  267. },
  268. })
  269. assert.Error(err).IsNil()
  270. conn.Close()
  271. <-time.After(time.Second * 5)
  272. conn, err = Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13146), internet.DialerOptions{
  273. Stream: &internet.StreamConfig{
  274. Network: v2net.Network_WebSocket,
  275. NetworkSettings: []*internet.NetworkSettings{
  276. {
  277. Network: v2net.Network_WebSocket,
  278. Settings: loader.NewTypedSettings(&Config{
  279. Path: "ws",
  280. }),
  281. },
  282. },
  283. },
  284. })
  285. assert.Error(err).IsNil()
  286. conn.Close()
  287. <-time.After(time.Second * 15)
  288. conn, err = Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13146), internet.DialerOptions{
  289. Stream: &internet.StreamConfig{
  290. Network: v2net.Network_WebSocket,
  291. NetworkSettings: []*internet.NetworkSettings{
  292. {
  293. Network: v2net.Network_WebSocket,
  294. Settings: loader.NewTypedSettings(&Config{
  295. Path: "ws",
  296. }),
  297. },
  298. },
  299. },
  300. })
  301. assert.Error(err).IsNil()
  302. conn.Close()
  303. }
  304. func Test_listenWSAndDial_TLS(t *testing.T) {
  305. assert := assert.On(t)
  306. go func() {
  307. <-time.After(time.Second * 5)
  308. assert.Fail("Too slow")
  309. }()
  310. tlsSettings := &v2tls.Config{
  311. AllowInsecure: true,
  312. Certificate: []*v2tls.Certificate{
  313. {
  314. Certificate: ReadFile("./../../../testing/tls/cert.pem", assert),
  315. Key: ReadFile("./../../../testing/tls/key.pem", assert),
  316. },
  317. },
  318. }
  319. listen, err := ListenWS(v2net.DomainAddress("localhost"), 13143, internet.ListenOptions{
  320. Stream: &internet.StreamConfig{
  321. SecurityType: loader.GetType(new(v2tls.Config)),
  322. SecuritySettings: []*loader.TypedSettings{loader.NewTypedSettings(tlsSettings)},
  323. Network: v2net.Network_WebSocket,
  324. NetworkSettings: []*internet.NetworkSettings{
  325. {
  326. Network: v2net.Network_WebSocket,
  327. Settings: loader.NewTypedSettings(&Config{
  328. Path: "wss",
  329. ConnectionReuse: &ConnectionReuse{
  330. Enable: true,
  331. },
  332. }),
  333. },
  334. },
  335. },
  336. })
  337. assert.Error(err).IsNil()
  338. go func() {
  339. conn, err := listen.Accept()
  340. assert.Error(err).IsNil()
  341. conn.Close()
  342. listen.Close()
  343. }()
  344. conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13143), internet.DialerOptions{
  345. Stream: &internet.StreamConfig{
  346. SecurityType: loader.GetType(new(v2tls.Config)),
  347. SecuritySettings: []*loader.TypedSettings{loader.NewTypedSettings(tlsSettings)},
  348. Network: v2net.Network_WebSocket,
  349. NetworkSettings: []*internet.NetworkSettings{
  350. {
  351. Network: v2net.Network_WebSocket,
  352. Settings: loader.NewTypedSettings(&Config{
  353. Path: "wss",
  354. ConnectionReuse: &ConnectionReuse{
  355. Enable: true,
  356. },
  357. }),
  358. },
  359. },
  360. },
  361. })
  362. assert.Error(err).IsNil()
  363. conn.Close()
  364. }
  365. func ReadFile(file string, assert *assert.Assert) []byte {
  366. b, err := ioutil.ReadFile(file)
  367. assert.Error(err).IsNil()
  368. return b
  369. }