in pkg/providers/apisix/translation/apisix_route.go [330:424]
func (t *translator) TranslateRouteMatchExprs(nginxVars []configv2.ApisixRouteHTTPMatchExpr) ([][]apisixv1.StringOrSlice, error) {
var (
vars [][]apisixv1.StringOrSlice
op string
)
for _, expr := range nginxVars {
var (
invert bool
subj string
this []apisixv1.StringOrSlice
)
if expr.Subject.Name == "" && expr.Subject.Scope != _const.ScopePath {
return nil, errors.New("empty subject name")
}
switch expr.Subject.Scope {
case _const.ScopeQuery:
subj = "arg_" + expr.Subject.Name
case _const.ScopeHeader:
name := strings.ToLower(expr.Subject.Name)
name = strings.ReplaceAll(name, "-", "_")
subj = "http_" + name
case _const.ScopeCookie:
subj = "cookie_" + expr.Subject.Name
case _const.ScopePath:
subj = "uri"
case _const.ScopeVariable:
subj = expr.Subject.Name
default:
return nil, errors.New("bad subject name")
}
if expr.Subject.Scope == "" {
return nil, errors.New("empty nginxVar subject")
}
this = append(this, apisixv1.StringOrSlice{
StrVal: subj,
})
switch expr.Op {
case _const.OpEqual:
op = "=="
case _const.OpGreaterThan:
op = ">"
case _const.OpGreaterThanEqual:
op = ">="
case _const.OpIn:
op = "in"
case _const.OpLessThan:
op = "<"
case _const.OpLessThanEqual:
op = "<="
case _const.OpNotEqual:
op = "~="
case _const.OpNotIn:
invert = true
op = "in"
case _const.OpRegexMatch:
op = "~~"
case _const.OpRegexMatchCaseInsensitive:
op = "~*"
case _const.OpRegexNotMatch:
invert = true
op = "~~"
case _const.OpRegexNotMatchCaseInsensitive:
invert = true
op = "~*"
default:
return nil, errors.New("unknown operator")
}
if invert {
this = append(this, apisixv1.StringOrSlice{
StrVal: "!",
})
}
this = append(this, apisixv1.StringOrSlice{
StrVal: op,
})
if expr.Op == _const.OpIn || expr.Op == _const.OpNotIn {
if expr.Set == nil {
return nil, errors.New("empty set value")
}
this = append(this, apisixv1.StringOrSlice{
SliceVal: expr.Set,
})
} else if expr.Value != nil {
this = append(this, apisixv1.StringOrSlice{
StrVal: *expr.Value,
})
} else {
return nil, errors.New("neither set nor value is provided")
}
vars = append(vars, this)
}
return vars, nil
}