@@ -453,28 +453,19 @@ func (t *Translator) processRequestHeaderModifierFilter(
453
453
for _ , addHeader := range headersToAdd {
454
454
emptyFilterConfig = false
455
455
if addHeader .Name == "" {
456
- routeStatus := GetRouteStatus (filterContext .Route )
457
- status .SetRouteStatusCondition (routeStatus ,
458
- filterContext .ParentRef .routeParentStatusIdx ,
459
- filterContext .Route .GetGeneration (),
460
- gwapiv1 .RouteConditionAccepted ,
461
- metav1 .ConditionFalse ,
462
- gwapiv1 .RouteReasonUnsupportedValue ,
456
+ updateRouteStatusForRHMFilter (
457
+ filterContext ,
463
458
"RequestHeaderModifier Filter cannot add a header with an empty name" ,
464
459
)
465
460
// try to process the rest of the headers and produce a valid config.
466
461
continue
467
462
}
468
- // Per Gateway API specification on HTTPHeaderName, : and / are invalid characters in header names
469
- if strings .Contains (string (addHeader .Name ), "/" ) || strings .Contains (string (addHeader .Name ), ":" ) {
470
- routeStatus := GetRouteStatus (filterContext .Route )
471
- status .SetRouteStatusCondition (routeStatus ,
472
- filterContext .ParentRef .routeParentStatusIdx ,
473
- filterContext .Route .GetGeneration (),
474
- gwapiv1 .RouteConditionAccepted ,
475
- metav1 .ConditionFalse ,
476
- gwapiv1 .RouteReasonUnsupportedValue ,
477
- fmt .Sprintf ("RequestHeaderModifier Filter cannot set headers with a '/' or ':' character in them. Header: %q" , string (addHeader .Name )),
463
+ if ! isModifiableHeader (string (addHeader .Name )) {
464
+ updateRouteStatusForRHMFilter (
465
+ filterContext ,
466
+ fmt .Sprintf (
467
+ "RequestHeaderModifier Filter cannot set headers with a '/' or ':' character in them, or the host header. Header: %q" ,
468
+ string (addHeader .Name )),
478
469
)
479
470
continue
480
471
}
@@ -510,27 +501,19 @@ func (t *Translator) processRequestHeaderModifierFilter(
510
501
for _ , setHeader := range headersToSet {
511
502
512
503
if setHeader .Name == "" {
513
- routeStatus := GetRouteStatus (filterContext .Route )
514
- status .SetRouteStatusCondition (routeStatus ,
515
- filterContext .ParentRef .routeParentStatusIdx ,
516
- filterContext .Route .GetGeneration (),
517
- gwapiv1 .RouteConditionAccepted ,
518
- metav1 .ConditionFalse ,
519
- gwapiv1 .RouteReasonUnsupportedValue ,
504
+ updateRouteStatusForRHMFilter (
505
+ filterContext ,
520
506
"RequestHeaderModifier Filter cannot set a header with an empty name" ,
521
507
)
522
508
continue
523
509
}
524
- // Per Gateway API specification on HTTPHeaderName, : and / are invalid characters in header names
525
- if strings .Contains (string (setHeader .Name ), "/" ) || strings .Contains (string (setHeader .Name ), ":" ) {
526
- routeStatus := GetRouteStatus (filterContext .Route )
527
- status .SetRouteStatusCondition (routeStatus ,
528
- filterContext .ParentRef .routeParentStatusIdx ,
529
- filterContext .Route .GetGeneration (),
530
- gwapiv1 .RouteConditionAccepted ,
531
- metav1 .ConditionFalse ,
532
- gwapiv1 .RouteReasonUnsupportedValue ,
533
- fmt .Sprintf ("RequestHeaderModifier Filter cannot set headers with a '/' or ':' character in them. Header: '%s'" , string (setHeader .Name )),
510
+
511
+ if ! isModifiableHeader (string (setHeader .Name )) {
512
+ updateRouteStatusForRHMFilter (
513
+ filterContext ,
514
+ fmt .Sprintf (
515
+ "RequestHeaderModifier Filter cannot set headers with a '/' or ':' character in them, or the host header. Header: %q" ,
516
+ string (setHeader .Name )),
534
517
)
535
518
continue
536
519
}
@@ -566,18 +549,23 @@ func (t *Translator) processRequestHeaderModifierFilter(
566
549
}
567
550
for _ , removedHeader := range headersToRemove {
568
551
if removedHeader == "" {
569
- routeStatus := GetRouteStatus (filterContext .Route )
570
- status .SetRouteStatusCondition (routeStatus ,
571
- filterContext .ParentRef .routeParentStatusIdx ,
572
- filterContext .Route .GetGeneration (),
573
- gwapiv1 .RouteConditionAccepted ,
574
- metav1 .ConditionFalse ,
575
- gwapiv1 .RouteReasonUnsupportedValue ,
552
+ updateRouteStatusForRHMFilter (
553
+ filterContext ,
576
554
"RequestHeaderModifier Filter cannot remove a header with an empty name" ,
577
555
)
578
556
continue
579
557
}
580
558
559
+ if ! isModifiableHeader (removedHeader ) {
560
+ updateRouteStatusForRHMFilter (
561
+ filterContext ,
562
+ fmt .Sprintf (
563
+ "RequestHeaderModifier Filter cannot remove headers with a '/' or ':' character in them, or the host header. Header: %q" ,
564
+ removedHeader ),
565
+ )
566
+ continue
567
+ }
568
+
581
569
canRemHeader := true
582
570
for _ , h := range filterContext .RemoveRequestHeaders {
583
571
if strings .EqualFold (h , removedHeader ) {
@@ -595,18 +583,31 @@ func (t *Translator) processRequestHeaderModifierFilter(
595
583
596
584
// Update the status if the filter failed to configure any valid headers to add/remove
597
585
if len (filterContext .AddRequestHeaders ) == 0 && len (filterContext .RemoveRequestHeaders ) == 0 && ! emptyFilterConfig {
598
- routeStatus := GetRouteStatus (filterContext .Route )
599
- status .SetRouteStatusCondition (routeStatus ,
600
- filterContext .ParentRef .routeParentStatusIdx ,
601
- filterContext .Route .GetGeneration (),
602
- gwapiv1 .RouteConditionAccepted ,
603
- metav1 .ConditionFalse ,
604
- gwapiv1 .RouteReasonUnsupportedValue ,
586
+ updateRouteStatusForRHMFilter (
587
+ filterContext ,
605
588
"RequestHeaderModifier Filter did not provide valid configuration to add/set/remove any headers" ,
606
589
)
607
590
}
608
591
}
609
592
593
+ func updateRouteStatusForRHMFilter (filterContext * HTTPFiltersContext , message string ) {
594
+ routeStatus := GetRouteStatus (filterContext .Route )
595
+ status .SetRouteStatusCondition (routeStatus ,
596
+ filterContext .ParentRef .routeParentStatusIdx ,
597
+ filterContext .Route .GetGeneration (),
598
+ gwapiv1 .RouteConditionAccepted ,
599
+ metav1 .ConditionFalse ,
600
+ gwapiv1 .RouteReasonUnsupportedValue ,
601
+ message ,
602
+ )
603
+ }
604
+
605
+ func isModifiableHeader (headerName string ) bool {
606
+ // Per Gateway API specification on HTTPHeaderName, : and / are invalid characters in header names
607
+ // And Envoy does not allow modification the pseudo headers and the host header
608
+ return ! strings .Contains (headerName , "/" ) && ! strings .Contains (headerName , ":" ) && ! strings .EqualFold (headerName , "host" )
609
+ }
610
+
610
611
func (t * Translator ) processResponseHeaderModifierFilter (
611
612
headerModifier * gwapiv1.HTTPHeaderFilter ,
612
613
filterContext * HTTPFiltersContext ,
@@ -625,28 +626,18 @@ func (t *Translator) processResponseHeaderModifierFilter(
625
626
for _ , addHeader := range headersToAdd {
626
627
emptyFilterConfig = false
627
628
if addHeader .Name == "" {
628
- routeStatus := GetRouteStatus (filterContext .Route )
629
- status .SetRouteStatusCondition (routeStatus ,
630
- filterContext .ParentRef .routeParentStatusIdx ,
631
- filterContext .Route .GetGeneration (),
632
- gwapiv1 .RouteConditionAccepted ,
633
- metav1 .ConditionFalse ,
634
- gwapiv1 .RouteReasonUnsupportedValue ,
629
+ updateRouteStatusForRHMFilter (
630
+ filterContext ,
635
631
"ResponseHeaderModifier Filter cannot add a header with an empty name" ,
636
632
)
637
633
// try to process the rest of the headers and produce a valid config.
638
634
continue
639
635
}
640
- // Per Gateway API specification on HTTPHeaderName, : and / are invalid characters in header names
641
- if strings .Contains (string (addHeader .Name ), "/" ) || strings .Contains (string (addHeader .Name ), ":" ) {
642
- routeStatus := GetRouteStatus (filterContext .Route )
643
- status .SetRouteStatusCondition (routeStatus ,
644
- filterContext .ParentRef .routeParentStatusIdx ,
645
- filterContext .Route .GetGeneration (),
646
- gwapiv1 .RouteConditionAccepted ,
647
- metav1 .ConditionFalse ,
648
- gwapiv1 .RouteReasonUnsupportedValue ,
649
- fmt .Sprintf ("ResponseHeaderModifier Filter cannot set headers with a '/' or ':' character in them. Header: %q" , string (addHeader .Name )),
636
+ if ! isModifiableHeader (string (addHeader .Name )) {
637
+ updateRouteStatusForRHMFilter (
638
+ filterContext ,
639
+ fmt .Sprintf ("ResponseHeaderModifier Filter cannot set headers with a '/' or ':' character in them, or the host header. Header: %q" ,
640
+ string (addHeader .Name )),
650
641
)
651
642
continue
652
643
}
@@ -682,27 +673,18 @@ func (t *Translator) processResponseHeaderModifierFilter(
682
673
for _ , setHeader := range headersToSet {
683
674
684
675
if setHeader .Name == "" {
685
- routeStatus := GetRouteStatus (filterContext .Route )
686
- status .SetRouteStatusCondition (routeStatus ,
687
- filterContext .ParentRef .routeParentStatusIdx ,
688
- filterContext .Route .GetGeneration (),
689
- gwapiv1 .RouteConditionAccepted ,
690
- metav1 .ConditionFalse ,
691
- gwapiv1 .RouteReasonUnsupportedValue ,
676
+ updateRouteStatusForRHMFilter (
677
+ filterContext ,
692
678
"ResponseHeaderModifier Filter cannot set a header with an empty name" ,
693
679
)
694
680
continue
695
681
}
696
- // Per Gateway API specification on HTTPHeaderName, : and / are invalid characters in header names
697
- if strings .Contains (string (setHeader .Name ), "/" ) || strings .Contains (string (setHeader .Name ), ":" ) {
698
- routeStatus := GetRouteStatus (filterContext .Route )
699
- status .SetRouteStatusCondition (routeStatus ,
700
- filterContext .ParentRef .routeParentStatusIdx ,
701
- filterContext .Route .GetGeneration (),
702
- gwapiv1 .RouteConditionAccepted ,
703
- metav1 .ConditionFalse ,
704
- gwapiv1 .RouteReasonUnsupportedValue ,
705
- fmt .Sprintf ("ResponseHeaderModifier Filter cannot set headers with a '/' or ':' character in them. Header: '%s'" , string (setHeader .Name )),
682
+
683
+ if ! isModifiableHeader (string (setHeader .Name )) {
684
+ updateRouteStatusForRHMFilter (
685
+ filterContext ,
686
+ fmt .Sprintf ("ResponseHeaderModifier Filter cannot set headers with a '/' or ':' character in them, or the host header. Header: %q" ,
687
+ string (setHeader .Name )),
706
688
)
707
689
continue
708
690
}
@@ -738,17 +720,21 @@ func (t *Translator) processResponseHeaderModifierFilter(
738
720
}
739
721
for _ , removedHeader := range headersToRemove {
740
722
if removedHeader == "" {
741
- routeStatus := GetRouteStatus (filterContext .Route )
742
- status .SetRouteStatusCondition (routeStatus ,
743
- filterContext .ParentRef .routeParentStatusIdx ,
744
- filterContext .Route .GetGeneration (),
745
- gwapiv1 .RouteConditionAccepted ,
746
- metav1 .ConditionFalse ,
747
- gwapiv1 .RouteReasonUnsupportedValue ,
723
+ updateRouteStatusForRHMFilter (
724
+ filterContext ,
748
725
"ResponseHeaderModifier Filter cannot remove a header with an empty name" ,
749
726
)
750
727
continue
751
728
}
729
+ if ! isModifiableHeader (removedHeader ) {
730
+ updateRouteStatusForRHMFilter (
731
+ filterContext ,
732
+ fmt .Sprintf (
733
+ "ResponseHeaderModifier Filter cannot remove headers with a '/' or ':' character in them, or the host header. Header: %q" ,
734
+ removedHeader ),
735
+ )
736
+ continue
737
+ }
752
738
753
739
canRemHeader := true
754
740
for _ , h := range filterContext .RemoveResponseHeaders {
@@ -768,13 +754,8 @@ func (t *Translator) processResponseHeaderModifierFilter(
768
754
769
755
// Update the status if the filter failed to configure any valid headers to add/remove
770
756
if len (filterContext .AddResponseHeaders ) == 0 && len (filterContext .RemoveResponseHeaders ) == 0 && ! emptyFilterConfig {
771
- routeStatus := GetRouteStatus (filterContext .Route )
772
- status .SetRouteStatusCondition (routeStatus ,
773
- filterContext .ParentRef .routeParentStatusIdx ,
774
- filterContext .Route .GetGeneration (),
775
- gwapiv1 .RouteConditionAccepted ,
776
- metav1 .ConditionFalse ,
777
- gwapiv1 .RouteReasonUnsupportedValue ,
757
+ updateRouteStatusForRHMFilter (
758
+ filterContext ,
778
759
"ResponseHeaderModifier Filter did not provide valid configuration to add/set/remove any headers" ,
779
760
)
780
761
}
0 commit comments