ws_test.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. package websocket_test
  2. import (
  3. "testing"
  4. "time"
  5. "bytes"
  6. v2net "v2ray.com/core/common/net"
  7. "v2ray.com/core/common/serial"
  8. "v2ray.com/core/testing/assert"
  9. tlsgen "v2ray.com/core/testing/tls"
  10. "v2ray.com/core/transport/internet"
  11. v2tls "v2ray.com/core/transport/internet/tls"
  12. . "v2ray.com/core/transport/internet/websocket"
  13. )
  14. func Test_listenWSAndDial(t *testing.T) {
  15. assert := assert.On(t)
  16. listen, err := ListenWS(v2net.DomainAddress("localhost"), 13146, internet.ListenOptions{
  17. Stream: &internet.StreamConfig{
  18. Protocol: internet.TransportProtocol_WebSocket,
  19. TransportSettings: []*internet.TransportSettings{
  20. {
  21. Protocol: internet.TransportProtocol_WebSocket,
  22. Settings: serial.ToTypedMessage(&Config{
  23. Path: "ws",
  24. }),
  25. },
  26. },
  27. },
  28. })
  29. assert.Error(err).IsNil()
  30. go func() {
  31. for {
  32. conn, err := listen.Accept()
  33. if err != nil {
  34. break
  35. }
  36. go func() {
  37. defer conn.Close()
  38. var b [1024]byte
  39. n, err := conn.Read(b[:])
  40. //assert.Error(err).IsNil()
  41. if err != nil {
  42. conn.SetReusable(false)
  43. return
  44. }
  45. assert.Bool(bytes.HasPrefix(b[:n], []byte("Test connection"))).IsTrue()
  46. _, err = conn.Write([]byte("Response"))
  47. assert.Error(err).IsNil()
  48. }()
  49. }
  50. }()
  51. conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13146), internet.DialerOptions{
  52. Stream: &internet.StreamConfig{
  53. Protocol: internet.TransportProtocol_WebSocket,
  54. TransportSettings: []*internet.TransportSettings{
  55. {
  56. Protocol: internet.TransportProtocol_WebSocket,
  57. Settings: serial.ToTypedMessage(&Config{
  58. Path: "ws",
  59. }),
  60. },
  61. },
  62. },
  63. })
  64. assert.Error(err).IsNil()
  65. _, err = conn.Write([]byte("Test connection 1"))
  66. assert.Error(err).IsNil()
  67. var b [1024]byte
  68. n, err := conn.Read(b[:])
  69. assert.Error(err).IsNil()
  70. assert.String(string(b[:n])).Equals("Response")
  71. assert.Error(conn.Close()).IsNil()
  72. <-time.After(time.Second * 5)
  73. conn, err = Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13146), internet.DialerOptions{
  74. Stream: &internet.StreamConfig{
  75. Protocol: internet.TransportProtocol_WebSocket,
  76. TransportSettings: []*internet.TransportSettings{
  77. {
  78. Protocol: internet.TransportProtocol_WebSocket,
  79. Settings: serial.ToTypedMessage(&Config{
  80. Path: "ws",
  81. }),
  82. },
  83. },
  84. },
  85. })
  86. assert.Error(err).IsNil()
  87. _, err = conn.Write([]byte("Test connection 2"))
  88. assert.Error(err).IsNil()
  89. n, err = conn.Read(b[:])
  90. assert.Error(err).IsNil()
  91. assert.String(string(b[:n])).Equals("Response")
  92. assert.Error(conn.Close()).IsNil()
  93. <-time.After(time.Second * 15)
  94. conn, err = Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13146), internet.DialerOptions{
  95. Stream: &internet.StreamConfig{
  96. Protocol: internet.TransportProtocol_WebSocket,
  97. TransportSettings: []*internet.TransportSettings{
  98. {
  99. Protocol: internet.TransportProtocol_WebSocket,
  100. Settings: serial.ToTypedMessage(&Config{
  101. Path: "ws",
  102. }),
  103. },
  104. },
  105. },
  106. })
  107. assert.Error(err).IsNil()
  108. _, err = conn.Write([]byte("Test connection 3"))
  109. assert.Error(err).IsNil()
  110. n, err = conn.Read(b[:])
  111. assert.Error(err).IsNil()
  112. assert.String(string(b[:n])).Equals("Response")
  113. assert.Error(conn.Close()).IsNil()
  114. assert.Error(listen.Close()).IsNil()
  115. }
  116. func Test_listenWSAndDial_TLS(t *testing.T) {
  117. assert := assert.On(t)
  118. go func() {
  119. <-time.After(time.Second * 5)
  120. assert.Fail("Too slow")
  121. }()
  122. listen, err := ListenWS(v2net.DomainAddress("localhost"), 13143, internet.ListenOptions{
  123. Stream: &internet.StreamConfig{
  124. SecurityType: serial.GetMessageType(new(v2tls.Config)),
  125. SecuritySettings: []*serial.TypedMessage{serial.ToTypedMessage(&v2tls.Config{
  126. Certificate: []*v2tls.Certificate{tlsgen.GenerateCertificateForTest()},
  127. })},
  128. Protocol: internet.TransportProtocol_WebSocket,
  129. TransportSettings: []*internet.TransportSettings{
  130. {
  131. Protocol: internet.TransportProtocol_WebSocket,
  132. Settings: serial.ToTypedMessage(&Config{
  133. Path: "wss",
  134. ConnectionReuse: &ConnectionReuse{
  135. Enable: true,
  136. },
  137. }),
  138. },
  139. },
  140. },
  141. })
  142. assert.Error(err).IsNil()
  143. go func() {
  144. conn, err := listen.Accept()
  145. assert.Error(err).IsNil()
  146. conn.Close()
  147. listen.Close()
  148. }()
  149. conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13143), internet.DialerOptions{
  150. Stream: &internet.StreamConfig{
  151. SecurityType: serial.GetMessageType(new(v2tls.Config)),
  152. SecuritySettings: []*serial.TypedMessage{serial.ToTypedMessage(&v2tls.Config{
  153. AllowInsecure: true,
  154. })},
  155. Protocol: internet.TransportProtocol_WebSocket,
  156. TransportSettings: []*internet.TransportSettings{
  157. {
  158. Protocol: internet.TransportProtocol_WebSocket,
  159. Settings: serial.ToTypedMessage(&Config{
  160. Path: "wss",
  161. ConnectionReuse: &ConnectionReuse{
  162. Enable: true,
  163. },
  164. }),
  165. },
  166. },
  167. },
  168. })
  169. assert.Error(err).IsNil()
  170. conn.Close()
  171. }