|
@@ -0,0 +1,130 @@
|
|
|
+package httpheaders
|
|
|
+
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ "net/http"
|
|
|
+ "testing"
|
|
|
+
|
|
|
+ "github.com/stretchr/testify/require"
|
|
|
+)
|
|
|
+
|
|
|
+func TestCopy(t *testing.T) {
|
|
|
+ from := http.Header{
|
|
|
+ "X-Test-1": {"value1", "value2"},
|
|
|
+ "X-Test-2": {"value3"},
|
|
|
+ "X-Test-3": {"value4"},
|
|
|
+ "X-Test-4": nil,
|
|
|
+ }
|
|
|
+
|
|
|
+ to := http.Header{
|
|
|
+ "X-Test-1": {"oldvalue"},
|
|
|
+ "X-Test-4": {"value5"},
|
|
|
+ "X-Test-5": {"value6"},
|
|
|
+ }
|
|
|
+
|
|
|
+ Copy(from, to, []string{"X-Test-1", "x-test-3", "X-Non-Existent"})
|
|
|
+
|
|
|
+ require.Equal(t, []string{"value1", "value2"}, to.Values("X-Test-1"))
|
|
|
+ require.Equal(t, []string{"value4"}, to.Values("X-Test-3"))
|
|
|
+ require.Equal(t, []string{"value5"}, to.Values("X-Test-4"))
|
|
|
+ require.Equal(t, []string{"value6"}, to.Values("X-Test-5"))
|
|
|
+ require.Empty(t, to.Values("X-Test-2"))
|
|
|
+}
|
|
|
+
|
|
|
+func TestCopyAll(t *testing.T) {
|
|
|
+ from := http.Header{
|
|
|
+ "X-Test-1": {"value1", "value2"},
|
|
|
+ "X-Test-2": {"value3"},
|
|
|
+ "X-Test-3": nil,
|
|
|
+ }
|
|
|
+
|
|
|
+ to := http.Header{
|
|
|
+ "X-Test-1": {"oldvalue"},
|
|
|
+ "X-Test-3": {"value4"},
|
|
|
+ "X-Test-4": {"value5"},
|
|
|
+ }
|
|
|
+
|
|
|
+ testCases := []struct {
|
|
|
+ overwrite bool
|
|
|
+ expected http.Header
|
|
|
+ }{
|
|
|
+ {
|
|
|
+ overwrite: false,
|
|
|
+ expected: http.Header{
|
|
|
+ "X-Test-1": {"oldvalue"},
|
|
|
+ "X-Test-2": {"value3"},
|
|
|
+ "X-Test-3": {"value4"},
|
|
|
+ "X-Test-4": {"value5"},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ overwrite: true,
|
|
|
+ expected: http.Header{
|
|
|
+ "X-Test-1": {"value1", "value2"},
|
|
|
+ "X-Test-2": {"value3"},
|
|
|
+ "X-Test-3": {"value4"},
|
|
|
+ "X-Test-4": {"value5"},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, tc := range testCases {
|
|
|
+ t.Run(fmt.Sprintf("overwrite=%v", tc.overwrite), func(t *testing.T) {
|
|
|
+ toCopy := to.Clone() // Clone to avoid modifying the original 'to' header
|
|
|
+ CopyAll(from, toCopy, tc.overwrite)
|
|
|
+ require.Equal(t, tc.expected, toCopy)
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestCopyFromRequest(t *testing.T) {
|
|
|
+ req, err := http.NewRequest("GET", "http://example.com", nil)
|
|
|
+ require.NoError(t, err)
|
|
|
+
|
|
|
+ req.Host = "example.com"
|
|
|
+ req.Header = http.Header{
|
|
|
+ "X-Test-1": {"value1", "value2"},
|
|
|
+ "X-Test-2": {"value3"},
|
|
|
+ "X-Test-3": nil,
|
|
|
+ }
|
|
|
+
|
|
|
+ header := http.Header{
|
|
|
+ "X-Test-1": {"oldvalue"},
|
|
|
+ "X-Test-3": {"value4"},
|
|
|
+ "X-Test-4": {"value5"},
|
|
|
+ }
|
|
|
+
|
|
|
+ CopyFromRequest(req, header, []string{"X-Test-1", "x-test-2", "host", "X-Non-Existent"})
|
|
|
+
|
|
|
+ require.Equal(t, []string{"value1", "value2"}, header.Values("X-Test-1"))
|
|
|
+ require.Equal(t, []string{"value3"}, header.Values("X-Test-2"))
|
|
|
+ require.Equal(t, []string{"value4"}, header.Values("X-Test-3"))
|
|
|
+ require.Equal(t, []string{"value5"}, header.Values("X-Test-4"))
|
|
|
+ require.Equal(t, []string{"example.com"}, header.Values("Host"))
|
|
|
+}
|
|
|
+
|
|
|
+func TestCopyToRequest(t *testing.T) {
|
|
|
+ req, err := http.NewRequest("GET", "http://example.com", nil)
|
|
|
+ require.NoError(t, err)
|
|
|
+
|
|
|
+ req.Header = http.Header{
|
|
|
+ "X-Test-1": {"oldvalue"},
|
|
|
+ "X-Test-3": {"value4"},
|
|
|
+ "X-Test-4": {"value5"},
|
|
|
+ }
|
|
|
+
|
|
|
+ header := http.Header{
|
|
|
+ "X-Test-1": {"value1", "value2"},
|
|
|
+ "X-Test-2": {"value3"},
|
|
|
+ "X-Test-3": nil,
|
|
|
+ "Host": {"newhost.com"},
|
|
|
+ }
|
|
|
+
|
|
|
+ CopyToRequest(header, req)
|
|
|
+
|
|
|
+ require.Equal(t, []string{"value1", "value2"}, req.Header.Values("X-Test-1"))
|
|
|
+ require.Equal(t, []string{"value3"}, req.Header.Values("X-Test-2"))
|
|
|
+ require.Equal(t, []string{"value4"}, req.Header.Values("X-Test-3"))
|
|
|
+ require.Equal(t, []string{"value5"}, req.Header.Values("X-Test-4"))
|
|
|
+ require.Equal(t, "newhost.com", req.Host)
|
|
|
+}
|