http_test.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package http_test
  2. import (
  3. "context"
  4. "testing"
  5. "time"
  6. "v2ray.com/core/common/buf"
  7. "v2ray.com/core/common/net"
  8. "v2ray.com/core/common/serial"
  9. . "v2ray.com/core/transport/internet/headers/http"
  10. . "v2ray.com/ext/assert"
  11. )
  12. func TestReaderWriter(t *testing.T) {
  13. assert := With(t)
  14. cache := buf.New()
  15. b := buf.New()
  16. b.AppendSupplier(serial.WriteString("abcd" + ENDING))
  17. writer := NewHeaderWriter(b)
  18. err := writer.Write(cache)
  19. assert(err, IsNil)
  20. assert(cache.Len(), Equals, int32(8))
  21. _, err = cache.Write([]byte{'e', 'f', 'g'})
  22. assert(err, IsNil)
  23. reader := &HeaderReader{}
  24. buffer, err := reader.Read(cache)
  25. assert(err, IsNil)
  26. assert(buffer.Bytes(), Equals, []byte{'e', 'f', 'g'})
  27. }
  28. func TestRequestHeader(t *testing.T) {
  29. assert := With(t)
  30. auth, err := NewHttpAuthenticator(context.Background(), &Config{
  31. Request: &RequestConfig{
  32. Uri: []string{"/"},
  33. Header: []*Header{
  34. {
  35. Name: "Test",
  36. Value: []string{"Value"},
  37. },
  38. },
  39. },
  40. })
  41. assert(err, IsNil)
  42. cache := buf.New()
  43. err = auth.GetClientWriter().Write(cache)
  44. assert(err, IsNil)
  45. assert(cache.String(), Equals, "GET / HTTP/1.1\r\nTest: Value\r\n\r\n")
  46. }
  47. func TestConnection(t *testing.T) {
  48. assert := With(t)
  49. auth, err := NewHttpAuthenticator(context.Background(), &Config{
  50. Request: &RequestConfig{
  51. Method: &Method{Value: "Post"},
  52. Uri: []string{"/testpath"},
  53. Header: []*Header{
  54. {
  55. Name: "Host",
  56. Value: []string{"www.v2ray.com", "www.google.com"},
  57. },
  58. {
  59. Name: "User-Agent",
  60. Value: []string{"Test-Agent"},
  61. },
  62. },
  63. },
  64. Response: &ResponseConfig{
  65. Version: &Version{
  66. Value: "1.1",
  67. },
  68. Status: &Status{
  69. Code: "404",
  70. Reason: "Not Found",
  71. },
  72. },
  73. })
  74. assert(err, IsNil)
  75. listener, err := net.Listen("tcp", "127.0.0.1:0")
  76. assert(err, IsNil)
  77. go func() {
  78. conn, err := listener.Accept()
  79. assert(err, IsNil)
  80. authConn := auth.Server(conn)
  81. b := make([]byte, 256)
  82. for {
  83. n, err := authConn.Read(b)
  84. assert(err, IsNil)
  85. _, err = authConn.Write(b[:n])
  86. assert(err, IsNil)
  87. }
  88. }()
  89. conn, err := net.DialTCP("tcp", nil, listener.Addr().(*net.TCPAddr))
  90. assert(err, IsNil)
  91. authConn := auth.Client(conn)
  92. authConn.Write([]byte("Test payload"))
  93. authConn.Write([]byte("Test payload 2"))
  94. expectedResponse := "Test payloadTest payload 2"
  95. actualResponse := make([]byte, 256)
  96. deadline := time.Now().Add(time.Second * 5)
  97. totalBytes := 0
  98. for {
  99. n, err := authConn.Read(actualResponse[totalBytes:])
  100. assert(err, IsNil)
  101. totalBytes += n
  102. if totalBytes >= len(expectedResponse) || time.Now().After(deadline) {
  103. break
  104. }
  105. }
  106. assert(string(actualResponse[:totalBytes]), Equals, expectedResponse)
  107. }