http_test.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package http_test
  2. import (
  3. "context"
  4. "crypto/rand"
  5. "testing"
  6. "time"
  7. "github.com/google/go-cmp/cmp"
  8. "github.com/v2fly/v2ray-core/v5/common"
  9. "github.com/v2fly/v2ray-core/v5/common/buf"
  10. "github.com/v2fly/v2ray-core/v5/common/net"
  11. "github.com/v2fly/v2ray-core/v5/common/protocol/tls/cert"
  12. "github.com/v2fly/v2ray-core/v5/testing/servers/tcp"
  13. "github.com/v2fly/v2ray-core/v5/transport/internet"
  14. . "github.com/v2fly/v2ray-core/v5/transport/internet/http"
  15. "github.com/v2fly/v2ray-core/v5/transport/internet/tls"
  16. )
  17. func TestHTTPConnection(t *testing.T) {
  18. port := tcp.PickPort()
  19. listener, err := Listen(context.Background(), net.LocalHostIP, port, &internet.MemoryStreamConfig{
  20. ProtocolName: "http",
  21. ProtocolSettings: &Config{},
  22. SecurityType: "tls",
  23. SecuritySettings: &tls.Config{
  24. Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil, cert.CommonName("www.v2fly.org")))},
  25. },
  26. }, func(conn internet.Connection) {
  27. go func() {
  28. defer conn.Close()
  29. b := buf.New()
  30. defer b.Release()
  31. for {
  32. if _, err := b.ReadFrom(conn); err != nil {
  33. return
  34. }
  35. _, err := conn.Write(b.Bytes())
  36. common.Must(err)
  37. }
  38. }()
  39. })
  40. common.Must(err)
  41. defer listener.Close()
  42. time.Sleep(time.Second)
  43. dctx := context.Background()
  44. conn, err := Dial(dctx, net.TCPDestination(net.LocalHostIP, port), &internet.MemoryStreamConfig{
  45. ProtocolName: "http",
  46. ProtocolSettings: &Config{},
  47. SecurityType: "tls",
  48. SecuritySettings: &tls.Config{
  49. ServerName: "www.v2fly.org",
  50. AllowInsecure: true,
  51. },
  52. })
  53. common.Must(err)
  54. defer conn.Close()
  55. const N = 1024
  56. b1 := make([]byte, N)
  57. common.Must2(rand.Read(b1))
  58. b2 := buf.New()
  59. nBytes, err := conn.Write(b1)
  60. common.Must(err)
  61. if nBytes != N {
  62. t.Error("write: ", nBytes)
  63. }
  64. b2.Clear()
  65. common.Must2(b2.ReadFullFrom(conn, N))
  66. if r := cmp.Diff(b2.Bytes(), b1); r != "" {
  67. t.Error(r)
  68. }
  69. nBytes, err = conn.Write(b1)
  70. common.Must(err)
  71. if nBytes != N {
  72. t.Error("write: ", nBytes)
  73. }
  74. b2.Clear()
  75. common.Must2(b2.ReadFullFrom(conn, N))
  76. if r := cmp.Diff(b2.Bytes(), b1); r != "" {
  77. t.Error(r)
  78. }
  79. }