copy_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package httpheaders
  2. import (
  3. "fmt"
  4. "net/http"
  5. "testing"
  6. "github.com/stretchr/testify/require"
  7. )
  8. func TestCopy(t *testing.T) {
  9. from := http.Header{
  10. "X-Test-1": {"value1", "value2"},
  11. "X-Test-2": {"value3"},
  12. "X-Test-3": {"value4"},
  13. "X-Test-4": nil,
  14. }
  15. to := http.Header{
  16. "X-Test-1": {"oldvalue"},
  17. "X-Test-4": {"value5"},
  18. "X-Test-5": {"value6"},
  19. }
  20. Copy(from, to, []string{"X-Test-1", "x-test-3", "X-Non-Existent"})
  21. require.Equal(t, []string{"value1", "value2"}, to.Values("X-Test-1"))
  22. require.Equal(t, []string{"value4"}, to.Values("X-Test-3"))
  23. require.Equal(t, []string{"value5"}, to.Values("X-Test-4"))
  24. require.Equal(t, []string{"value6"}, to.Values("X-Test-5"))
  25. require.Empty(t, to.Values("X-Test-2"))
  26. }
  27. func TestCopyAll(t *testing.T) {
  28. from := http.Header{
  29. "X-Test-1": {"value1", "value2"},
  30. "X-Test-2": {"value3"},
  31. "X-Test-3": nil,
  32. }
  33. to := http.Header{
  34. "X-Test-1": {"oldvalue"},
  35. "X-Test-3": {"value4"},
  36. "X-Test-4": {"value5"},
  37. }
  38. testCases := []struct {
  39. overwrite bool
  40. expected http.Header
  41. }{
  42. {
  43. overwrite: false,
  44. expected: http.Header{
  45. "X-Test-1": {"oldvalue"},
  46. "X-Test-2": {"value3"},
  47. "X-Test-3": {"value4"},
  48. "X-Test-4": {"value5"},
  49. },
  50. },
  51. {
  52. overwrite: true,
  53. expected: http.Header{
  54. "X-Test-1": {"value1", "value2"},
  55. "X-Test-2": {"value3"},
  56. "X-Test-3": {"value4"},
  57. "X-Test-4": {"value5"},
  58. },
  59. },
  60. }
  61. for _, tc := range testCases {
  62. t.Run(fmt.Sprintf("overwrite=%v", tc.overwrite), func(t *testing.T) {
  63. toCopy := to.Clone() // Clone to avoid modifying the original 'to' header
  64. CopyAll(from, toCopy, tc.overwrite)
  65. require.Equal(t, tc.expected, toCopy)
  66. })
  67. }
  68. }
  69. func TestCopyFromRequest(t *testing.T) {
  70. req, err := http.NewRequest("GET", "http://example.com", nil)
  71. require.NoError(t, err)
  72. req.Host = "example.com"
  73. req.Header = http.Header{
  74. "X-Test-1": {"value1", "value2"},
  75. "X-Test-2": {"value3"},
  76. "X-Test-3": nil,
  77. }
  78. header := http.Header{
  79. "X-Test-1": {"oldvalue"},
  80. "X-Test-3": {"value4"},
  81. "X-Test-4": {"value5"},
  82. }
  83. CopyFromRequest(req, header, []string{"X-Test-1", "x-test-2", "host", "X-Non-Existent"})
  84. require.Equal(t, []string{"value1", "value2"}, header.Values("X-Test-1"))
  85. require.Equal(t, []string{"value3"}, header.Values("X-Test-2"))
  86. require.Equal(t, []string{"value4"}, header.Values("X-Test-3"))
  87. require.Equal(t, []string{"value5"}, header.Values("X-Test-4"))
  88. require.Equal(t, []string{"example.com"}, header.Values("Host"))
  89. }
  90. func TestCopyToRequest(t *testing.T) {
  91. req, err := http.NewRequest("GET", "http://example.com", nil)
  92. require.NoError(t, err)
  93. req.Header = http.Header{
  94. "X-Test-1": {"oldvalue"},
  95. "X-Test-3": {"value4"},
  96. "X-Test-4": {"value5"},
  97. }
  98. header := http.Header{
  99. "X-Test-1": {"value1", "value2"},
  100. "X-Test-2": {"value3"},
  101. "X-Test-3": nil,
  102. "Host": {"newhost.com"},
  103. }
  104. CopyToRequest(header, req)
  105. require.Equal(t, []string{"value1", "value2"}, req.Header.Values("X-Test-1"))
  106. require.Equal(t, []string{"value3"}, req.Header.Values("X-Test-2"))
  107. require.Equal(t, []string{"value4"}, req.Header.Values("X-Test-3"))
  108. require.Equal(t, []string{"value5"}, req.Header.Values("X-Test-4"))
  109. require.Equal(t, "newhost.com", req.Host)
  110. }