malformed_host_override_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // +build !windows
  2. package hack
  3. import (
  4. "bytes"
  5. "io"
  6. "net"
  7. "strings"
  8. "testing"
  9. )
  10. func TestHeaderOverrideHack(t *testing.T) {
  11. client, srv := net.Pipe()
  12. tests := [][2][]byte{
  13. {
  14. []byte("GET /foo\nHost: /var/run/docker.sock\nUser-Agent: Docker\r\n\r\n"),
  15. []byte("GET /foo\nHost: \r\nConnection: close\r\nUser-Agent: Docker\r\n\r\n"),
  16. },
  17. {
  18. []byte("GET /foo\nHost: /var/run/docker.sock\nUser-Agent: Docker\nFoo: Bar\r\n"),
  19. []byte("GET /foo\nHost: \r\nConnection: close\r\nUser-Agent: Docker\nFoo: Bar\r\n"),
  20. },
  21. {
  22. []byte("GET /foo\nHost: /var/run/docker.sock\nUser-Agent: Docker\r\n\r\ntest something!"),
  23. []byte("GET /foo\nHost: \r\nConnection: close\r\nUser-Agent: Docker\r\n\r\ntest something!"),
  24. },
  25. {
  26. []byte("GET /foo\nHost: /var/run/docker.sock\nUser-Agent: Docker\r\n\r\ntest something! " + strings.Repeat("test", 15000)),
  27. []byte("GET /foo\nHost: \r\nConnection: close\r\nUser-Agent: Docker\r\n\r\ntest something! " + strings.Repeat("test", 15000)),
  28. },
  29. {
  30. []byte("GET /foo\nFoo: Bar\nHost: /var/run/docker.sock\nUser-Agent: Docker\r\n\r\n"),
  31. []byte("GET /foo\nFoo: Bar\nHost: /var/run/docker.sock\nUser-Agent: Docker\r\n\r\n"),
  32. },
  33. }
  34. l := MalformedHostHeaderOverrideConn{client, true}
  35. read := make([]byte, 4096)
  36. for _, pair := range tests {
  37. go func(x []byte) {
  38. srv.Write(x)
  39. }(pair[0])
  40. n, err := l.Read(read)
  41. if err != nil && err != io.EOF {
  42. t.Fatalf("read: %d - %d, err: %v\n%s", n, len(pair[0]), err, string(read[:n]))
  43. }
  44. if !bytes.Equal(read[:n], pair[1][:n]) {
  45. t.Fatalf("\n%s\n%s\n", read[:n], pair[1][:n])
  46. }
  47. l.first = true
  48. // clean out the slice
  49. read = read[:0]
  50. }
  51. srv.Close()
  52. l.Close()
  53. }
  54. func BenchmarkWithHack(b *testing.B) {
  55. client, srv := net.Pipe()
  56. done := make(chan struct{})
  57. req := []byte("GET /foo\nHost: /var/run/docker.sock\nUser-Agent: Docker\n")
  58. read := make([]byte, 4096)
  59. b.SetBytes(int64(len(req) * 30))
  60. l := MalformedHostHeaderOverrideConn{client, true}
  61. go func() {
  62. for {
  63. if _, err := srv.Write(req); err != nil {
  64. srv.Close()
  65. break
  66. }
  67. l.first = true // make sure each subsequent run uses the hack parsing
  68. }
  69. close(done)
  70. }()
  71. for i := 0; i < b.N; i++ {
  72. for i := 0; i < 30; i++ {
  73. if n, err := l.Read(read); err != nil && err != io.EOF {
  74. b.Fatalf("read: %d - %d, err: %v\n%s", n, len(req), err, string(read[:n]))
  75. }
  76. }
  77. }
  78. l.Close()
  79. <-done
  80. }
  81. func BenchmarkNoHack(b *testing.B) {
  82. client, srv := net.Pipe()
  83. done := make(chan struct{})
  84. req := []byte("GET /foo\nHost: /var/run/docker.sock\nUser-Agent: Docker\n")
  85. read := make([]byte, 4096)
  86. b.SetBytes(int64(len(req) * 30))
  87. go func() {
  88. for {
  89. if _, err := srv.Write(req); err != nil {
  90. srv.Close()
  91. break
  92. }
  93. }
  94. close(done)
  95. }()
  96. for i := 0; i < b.N; i++ {
  97. for i := 0; i < 30; i++ {
  98. if _, err := client.Read(read); err != nil && err != io.EOF {
  99. b.Fatal(err)
  100. }
  101. }
  102. }
  103. client.Close()
  104. <-done
  105. }