http_test.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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.NewLocal(256)
  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, 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(), new(Config))
  50. assert(err, IsNil)
  51. listener, err := net.Listen("tcp", "127.0.0.1:0")
  52. assert(err, IsNil)
  53. go func() {
  54. conn, err := listener.Accept()
  55. assert(err, IsNil)
  56. authConn := auth.Server(conn)
  57. b := make([]byte, 256)
  58. for {
  59. n, err := authConn.Read(b)
  60. assert(err, IsNil)
  61. _, err = authConn.Write(b[:n])
  62. assert(err, IsNil)
  63. }
  64. }()
  65. conn, err := net.DialTCP("tcp", nil, listener.Addr().(*net.TCPAddr))
  66. assert(err, IsNil)
  67. authConn := auth.Client(conn)
  68. authConn.Write([]byte("Test payload"))
  69. authConn.Write([]byte("Test payload 2"))
  70. expectedResponse := "Test payloadTest payload 2"
  71. actualResponse := make([]byte, 256)
  72. deadline := time.Now().Add(time.Second * 5)
  73. totalBytes := 0
  74. for {
  75. n, err := authConn.Read(actualResponse[totalBytes:])
  76. assert(err, IsNil)
  77. totalBytes += n
  78. if totalBytes >= len(expectedResponse) || time.Now().After(deadline) {
  79. break
  80. }
  81. }
  82. assert(string(actualResponse[:totalBytes]), Equals, expectedResponse)
  83. }