mirror of
https://github.com/caddyserver/caddy.git
synced 2024-11-22 14:11:50 +08:00
matchers: support null
value in expression matcher
This commit is contained in:
parent
44860482d2
commit
e8f8fc2948
|
@ -37,6 +37,7 @@ import (
|
||||||
"github.com/google/cel-go/interpreter/functions"
|
"github.com/google/cel-go/interpreter/functions"
|
||||||
"github.com/google/cel-go/parser"
|
"github.com/google/cel-go/parser"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
"google.golang.org/protobuf/types/known/structpb"
|
||||||
|
|
||||||
"github.com/caddyserver/caddy/v2"
|
"github.com/caddyserver/caddy/v2"
|
||||||
"github.com/caddyserver/caddy/v2/caddyconfig/caddyfile"
|
"github.com/caddyserver/caddy/v2/caddyconfig/caddyfile"
|
||||||
|
@ -566,8 +567,9 @@ func celMatcherJSONMacroExpander(funcName string) parser.MacroExpander {
|
||||||
if !isStringPlaceholder {
|
if !isStringPlaceholder {
|
||||||
return nil, eh.NewError(entry.ID(), "matcher map keys must be string literals")
|
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()) ||
|
isStringListPlaceholder := isCELStringExpr(entry.AsMapEntry().Value()) ||
|
||||||
isCELStringListLiteral(entry.AsMapEntry().Value())
|
isCELStringListLiteral(entry.AsMapEntry().Value()) || isNull
|
||||||
if !isStringListPlaceholder {
|
if !isStringListPlaceholder {
|
||||||
return nil, eh.NewError(entry.AsMapEntry().Value().ID(), "matcher map values must be string or list literals")
|
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))
|
mapStrListStr := make(map[string][]string, len(mapStrIface))
|
||||||
for k, v := range mapStrIface {
|
for k, v := range mapStrIface {
|
||||||
switch val := v.(type) {
|
switch val := v.(type) {
|
||||||
|
case structpb.NullValue:
|
||||||
|
mapStrListStr[k] = nil
|
||||||
case string:
|
case string:
|
||||||
mapStrListStr[k] = []string{val}
|
mapStrListStr[k] = []string{val}
|
||||||
case types.String:
|
case types.String:
|
||||||
|
@ -704,7 +708,7 @@ var (
|
||||||
placeholderRegexp = regexp.MustCompile(`{([a-zA-Z][\w.-]+)}`)
|
placeholderRegexp = regexp.MustCompile(`{([a-zA-Z][\w.-]+)}`)
|
||||||
placeholderExpansion = `caddyPlaceholder(request, "${1}")`
|
placeholderExpansion = `caddyPlaceholder(request, "${1}")`
|
||||||
|
|
||||||
CELTypeJSON = cel.MapType(cel.StringType, cel.DynType)
|
CELTypeJSON = cel.MapType(cel.StringType, cel.AnyType)
|
||||||
)
|
)
|
||||||
|
|
||||||
var httpRequestObjectType = cel.ObjectType("http.Request")
|
var httpRequestObjectType = cel.ObjectType("http.Request")
|
||||||
|
|
Loading…
Reference in New Issue
Block a user