common/match.go (78 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package common import ( "fmt" "net" "regexp" "strings" ) import ( "dubbo.apache.org/dubbo-go/v3/common/constant" ) type ParamMatch struct { Key string `yaml:"key" json:"key,omitempty" property:"key"` Value StringMatch `yaml:"value" json:"value,omitempty" property:"value"` } func (p *ParamMatch) IsMatch(url *URL) bool { return p.Value.IsMatch(url.GetParam(p.Key, "")) } type StringMatch struct { Exact string `yaml:"exact" json:"exact,omitempty" property:"exact"` Prefix string `yaml:"prefix" json:"prefix,omitempty" property:"prefix"` Regex string `yaml:"regex" json:"regex,omitempty" property:"regex"` Noempty string `yaml:"noempty" json:"noempty,omitempty" property:"noempty"` Empty string `yaml:"empty" json:"empty,omitempty" property:"empty"` Wildcard string `yaml:"wildcard" json:"wildcard,omitempty" property:"wildcard"` } func (p *StringMatch) IsMatch(value string) bool { if p.Exact != "" { return p.Exact == value } else if p.Prefix != "" { return strings.HasPrefix(value, p.Prefix) } else if p.Regex != "" { match, _ := regexp.MatchString(p.Regex, value) return match } else if p.Wildcard != "" { return value == p.Wildcard || constant.AnyValue == p.Wildcard } else if p.Empty != "" { return value == "" } else if p.Noempty != "" { return value != "" } return false } type AddressMatch struct { Wildcard string `yaml:"wildcard" json:"wildcard,omitempty" property:"wildcard"` Cird string `yaml:"cird" json:"cird,omitempty" property:"cird"` Exact string `yaml:"exact" json:"exact,omitempty" property:"exact"` } func (p *AddressMatch) IsMatch(value string) bool { if p.Cird != "" && value != "" { _, ipnet, err := net.ParseCIDR(p.Cird) if err != nil { fmt.Println("Error", p.Cird, err) return false } return ipnet.Contains(net.ParseIP(value)) } if p.Wildcard != "" && value != "" { if constant.AnyValue == value || constant.AnyHostValue == value { return true } return IsMatchGlobPattern(p.Wildcard, value) } if p.Exact != "" && value != "" { return p.Exact == value } return false } type ListStringMatch struct { Oneof []StringMatch `yaml:"oneof" json:"oneof,omitempty" property:"oneof"` } func (p *ListStringMatch) IsMatch(value string) bool { for _, match := range p.Oneof { if match.IsMatch(value) { return true } } return false }