From e8f8fc2948734c83f7aecc31b1dd39af169355f1 Mon Sep 17 00:00:00 2001 From: Mohammed Al Sahaf Date: Fri, 17 May 2024 01:11:21 +0300 Subject: [PATCH] matchers: support `null` value in expression matcher --- modules/caddyhttp/celmatcher.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/caddyhttp/celmatcher.go b/modules/caddyhttp/celmatcher.go index d4016478e..2ea28acbb 100644 --- a/modules/caddyhttp/celmatcher.go +++ b/modules/caddyhttp/celmatcher.go @@ -37,6 +37,7 @@ import ( "github.com/google/cel-go/interpreter/functions" "github.com/google/cel-go/parser" "go.uber.org/zap" + "google.golang.org/protobuf/types/known/structpb" "github.com/caddyserver/caddy/v2" "github.com/caddyserver/caddy/v2/caddyconfig/caddyfile" @@ -566,8 +567,9 @@ func celMatcherJSONMacroExpander(funcName string) parser.MacroExpander { if !isStringPlaceholder { return nil, eh.NewError(entry.ID(), "matcher map keys must be string literals") } + isNull := entry.AsMapEntry().Value().AsLiteral().Type() == types.NullType isStringListPlaceholder := isCELStringExpr(entry.AsMapEntry().Value()) || - isCELStringListLiteral(entry.AsMapEntry().Value()) + isCELStringListLiteral(entry.AsMapEntry().Value()) || isNull if !isStringListPlaceholder { return nil, eh.NewError(entry.AsMapEntry().Value().ID(), "matcher map values must be string or list literals") } @@ -598,6 +600,8 @@ func CELValueToMapStrList(data ref.Val) (map[string][]string, error) { mapStrListStr := make(map[string][]string, len(mapStrIface)) for k, v := range mapStrIface { switch val := v.(type) { + case structpb.NullValue: + mapStrListStr[k] = nil case string: mapStrListStr[k] = []string{val} case types.String: @@ -704,7 +708,7 @@ var ( placeholderRegexp = regexp.MustCompile(`{([a-zA-Z][\w.-]+)}`) placeholderExpansion = `caddyPlaceholder(request, "${1}")` - CELTypeJSON = cel.MapType(cel.StringType, cel.DynType) + CELTypeJSON = cel.MapType(cel.StringType, cel.AnyType) ) var httpRequestObjectType = cel.ObjectType("http.Request")