ws_test.go 9.4 KB

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