Files
imgproxy/httpheaders/copy_test.go
2025-08-26 19:27:40 +06:00

131 lines
3.2 KiB
Go

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)
}