ws_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package websocket_test
  2. import (
  3. "bytes"
  4. "context"
  5. "runtime"
  6. "testing"
  7. "time"
  8. "v2ray.com/core/common/net"
  9. "v2ray.com/core/common/protocol/tls/cert"
  10. "v2ray.com/core/transport/internet"
  11. "v2ray.com/core/transport/internet/tls"
  12. . "v2ray.com/core/transport/internet/websocket"
  13. . "v2ray.com/ext/assert"
  14. )
  15. func Test_listenWSAndDial(t *testing.T) {
  16. assert := With(t)
  17. lctx := internet.ContextWithStreamSettings(context.Background(), &internet.MemoryStreamConfig{
  18. ProtocolName: "websocket",
  19. ProtocolSettings: &Config{
  20. Path: "ws",
  21. },
  22. })
  23. listen, err := ListenWS(lctx, net.DomainAddress("localhost"), 13146, func(conn internet.Connection) {
  24. go func(c internet.Connection) {
  25. defer c.Close()
  26. var b [1024]byte
  27. n, err := c.Read(b[:])
  28. //assert(err, IsNil)
  29. if err != nil {
  30. return
  31. }
  32. assert(bytes.HasPrefix(b[:n], []byte("Test connection")), IsTrue)
  33. _, err = c.Write([]byte("Response"))
  34. assert(err, IsNil)
  35. }(conn)
  36. })
  37. assert(err, IsNil)
  38. ctx := internet.ContextWithStreamSettings(context.Background(), &internet.MemoryStreamConfig{
  39. ProtocolName: "websocket",
  40. ProtocolSettings: &Config{Path: "ws"},
  41. })
  42. conn, err := Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), 13146))
  43. assert(err, IsNil)
  44. _, err = conn.Write([]byte("Test connection 1"))
  45. assert(err, IsNil)
  46. var b [1024]byte
  47. n, err := conn.Read(b[:])
  48. assert(err, IsNil)
  49. assert(string(b[:n]), Equals, "Response")
  50. assert(conn.Close(), IsNil)
  51. <-time.After(time.Second * 5)
  52. conn, err = Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), 13146))
  53. assert(err, IsNil)
  54. _, err = conn.Write([]byte("Test connection 2"))
  55. assert(err, IsNil)
  56. n, err = conn.Read(b[:])
  57. assert(err, IsNil)
  58. assert(string(b[:n]), Equals, "Response")
  59. assert(conn.Close(), IsNil)
  60. assert(listen.Close(), IsNil)
  61. }
  62. func TestDialWithRemoteAddr(t *testing.T) {
  63. assert := With(t)
  64. lctx := internet.ContextWithStreamSettings(context.Background(), &internet.MemoryStreamConfig{
  65. ProtocolName: "websocket",
  66. ProtocolSettings: &Config{
  67. Path: "ws",
  68. },
  69. })
  70. listen, err := ListenWS(lctx, net.DomainAddress("localhost"), 13148, func(conn internet.Connection) {
  71. go func(c internet.Connection) {
  72. defer c.Close()
  73. assert(c.RemoteAddr().String(), HasPrefix, "1.1.1.1")
  74. var b [1024]byte
  75. n, err := c.Read(b[:])
  76. //assert(err, IsNil)
  77. if err != nil {
  78. return
  79. }
  80. assert(bytes.HasPrefix(b[:n], []byte("Test connection")), IsTrue)
  81. _, err = c.Write([]byte("Response"))
  82. assert(err, IsNil)
  83. }(conn)
  84. })
  85. assert(err, IsNil)
  86. ctx := internet.ContextWithStreamSettings(context.Background(), &internet.MemoryStreamConfig{
  87. ProtocolName: "websocket",
  88. ProtocolSettings: &Config{Path: "ws", Header: []*Header{{Key: "X-Forwarded-For", Value: "1.1.1.1"}}},
  89. })
  90. conn, err := Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), 13148))
  91. assert(err, IsNil)
  92. _, err = conn.Write([]byte("Test connection 1"))
  93. assert(err, IsNil)
  94. var b [1024]byte
  95. n, err := conn.Read(b[:])
  96. assert(err, IsNil)
  97. assert(string(b[:n]), Equals, "Response")
  98. assert(listen.Close(), IsNil)
  99. }
  100. func Test_listenWSAndDial_TLS(t *testing.T) {
  101. if runtime.GOARCH == "arm64" {
  102. return
  103. }
  104. assert := With(t)
  105. start := time.Now()
  106. ctx := internet.ContextWithStreamSettings(context.Background(), &internet.MemoryStreamConfig{
  107. ProtocolName: "websocket",
  108. ProtocolSettings: &Config{
  109. Path: "wss",
  110. },
  111. SecurityType: "tls",
  112. SecuritySettings: &tls.Config{
  113. AllowInsecure: true,
  114. Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil, cert.CommonName("localhost")))},
  115. },
  116. })
  117. listen, err := ListenWS(ctx, net.DomainAddress("localhost"), 13143, func(conn internet.Connection) {
  118. go func() {
  119. _ = conn.Close()
  120. }()
  121. })
  122. assert(err, IsNil)
  123. defer listen.Close()
  124. conn, err := Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), 13143))
  125. assert(err, IsNil)
  126. _ = conn.Close()
  127. end := time.Now()
  128. assert(end.Before(start.Add(time.Second*5)), IsTrue)
  129. }