@@ -836,6 +836,20 @@ func validateFilterHeaderModifierFields(
836
836
) field.ErrorList {
837
837
var allErrs field.ErrorList
838
838
839
+ // Ensure that the header names are case-insensitive unique
840
+ allErrs = append (allErrs , validateRequestHeadersCaseInsensitiveUnique (
841
+ headerModifier .Add ,
842
+ headerModifierPath .Child ("add" ))... ,
843
+ )
844
+ allErrs = append (allErrs , validateRequestHeadersCaseInsensitiveUnique (
845
+ headerModifier .Set ,
846
+ headerModifierPath .Child ("set" ))... ,
847
+ )
848
+ allErrs = append (allErrs , validateRequestHeaderStringCaseInsensitiveUnique (
849
+ headerModifier .Remove ,
850
+ headerModifierPath .Child ("remove" ))... ,
851
+ )
852
+
839
853
for _ , h := range headerModifier .Add {
840
854
if err := validator .ValidateRequestHeaderName (string (h .Name )); err != nil {
841
855
valErr := field .Invalid (headerModifierPath .Child ("add" ), h , err .Error ())
@@ -865,3 +879,40 @@ func validateFilterHeaderModifierFields(
865
879
866
880
return allErrs
867
881
}
882
+
883
+ func validateRequestHeadersCaseInsensitiveUnique (
884
+ headers []v1.HTTPHeader ,
885
+ path * field.Path ,
886
+ ) field.ErrorList {
887
+ var allErrs field.ErrorList
888
+
889
+ seen := make (map [string ]struct {})
890
+
891
+ for _ , h := range headers {
892
+ name := strings .ToLower (string (h .Name ))
893
+ if _ , exists := seen [name ]; exists {
894
+ valErr := field .Invalid (path , h , "header name is not unique" )
895
+ allErrs = append (allErrs , valErr )
896
+ }
897
+ seen [name ] = struct {}{}
898
+ }
899
+
900
+ return allErrs
901
+ }
902
+
903
+ func validateRequestHeaderStringCaseInsensitiveUnique (headers []string , path * field.Path ) field.ErrorList {
904
+ var allErrs field.ErrorList
905
+
906
+ seen := make (map [string ]struct {})
907
+
908
+ for _ , h := range headers {
909
+ name := strings .ToLower (h )
910
+ if _ , exists := seen [name ]; exists {
911
+ valErr := field .Invalid (path , h , "header name is not unique" )
912
+ allErrs = append (allErrs , valErr )
913
+ }
914
+ seen [name ] = struct {}{}
915
+ }
916
+
917
+ return allErrs
918
+ }
0 commit comments