@@ -112,7 +112,7 @@ func (permission *Permission) ValidateForTCP(forTCP bool) error {
112112 }
113113 for _ , constraint := range permission .Constraints {
114114 for k := range constraint {
115- if strings .HasPrefix (k , attrRequestHeader ) {
115+ if strings .HasPrefix (k , attrRequestHeader ) || strings . HasPrefix ( k , attrRequestRegexHeader ) {
116116 return fmt .Errorf ("constraint(%v)" , constraint )
117117 }
118118 }
@@ -207,6 +207,7 @@ func isSupportedPermission(key string) bool {
207207 case key == attrDestPort :
208208 case key == pathHeader || key == methodHeader || key == hostHeader :
209209 case strings .HasPrefix (key , attrRequestHeader ):
210+ case strings .HasPrefix (key , attrRequestRegexHeader ):
210211 case key == attrConnSNI :
211212 case strings .HasPrefix (key , "experimental.envoy.filters." ) && isKeyBinary (key ):
212213 default :
@@ -252,6 +253,16 @@ func (permission *Permission) forKeyValues(key string, values []string) *envoy_r
252253 m := matcher .HeaderMatcher (header , v )
253254 return permissionHeader (m ), nil
254255 }
256+ case strings .HasPrefix (key , attrRequestRegexHeader ):
257+ header , err := extractNameInBrackets (strings .TrimPrefix (key , attrRequestRegexHeader ))
258+ if err != nil {
259+ rbacLog .Errorf ("ignored invalid %s: %v" , attrRequestRegexHeader , err )
260+ return nil
261+ }
262+ converter = func (v string ) (* envoy_rbac.Permission , error ) {
263+ m := matcher .HeaderMatcherRegex (header , v )
264+ return permissionHeader (m ), nil
265+ }
255266 case key == attrConnSNI :
256267 converter = func (v string ) (* envoy_rbac.Permission , error ) {
257268 m := matcher .StringMatcher (v , permission .v1beta1 )
0 commit comments