ws_test.go 3.7 KB

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