api/router: avoid unneeded loops and fix path match (#1594)
* api/router: avoid unneeded loops and fix path match * if match found in google api path syntax, not try pcre loop * if path is not ending via $ sign, append it to pcre to avoid matching other strings like /api/account/register can be matched to /api/account * api: add tests and validations Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
parent
930b329310
commit
750283cefd
35
registry.go
35
registry.go
@ -187,10 +187,13 @@ func (r *registryRouter) store(services []*registry.Service) {
|
|||||||
|
|
||||||
for _, p := range ep.Endpoint.Path {
|
for _, p := range ep.Endpoint.Path {
|
||||||
var pcreok bool
|
var pcreok bool
|
||||||
pcrereg, err := regexp.CompilePOSIX(p)
|
|
||||||
if err == nil {
|
if p[0] == '^' && p[len(p)-1] != '$' {
|
||||||
cep.pcreregs = append(cep.pcreregs, pcrereg)
|
pcrereg, err := regexp.CompilePOSIX(p)
|
||||||
pcreok = true
|
if err == nil {
|
||||||
|
cep.pcreregs = append(cep.pcreregs, pcrereg)
|
||||||
|
pcreok = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rule, err := util.Parse(p)
|
rule, err := util.Parse(p)
|
||||||
@ -359,6 +362,9 @@ func (r *registryRouter) Endpoint(req *http.Request) (*api.Service, error) {
|
|||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if logger.V(logger.DebugLevel, logger.DefaultLogger) {
|
||||||
|
logger.Debugf("api gpath match %s = %v", path, pathreg)
|
||||||
|
}
|
||||||
pMatch = true
|
pMatch = true
|
||||||
ctx := req.Context()
|
ctx := req.Context()
|
||||||
md, ok := metadata.FromContext(ctx)
|
md, ok := metadata.FromContext(ctx)
|
||||||
@ -373,16 +379,21 @@ func (r *registryRouter) Endpoint(req *http.Request) (*api.Service, error) {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. try path via pcre path matching
|
if !pMatch {
|
||||||
for _, pathreg := range cep.pcreregs {
|
// 4. try path via pcre path matching
|
||||||
if !pathreg.MatchString(req.URL.Path) {
|
for _, pathreg := range cep.pcreregs {
|
||||||
if logger.V(logger.DebugLevel, logger.DefaultLogger) {
|
if !pathreg.MatchString(req.URL.Path) {
|
||||||
logger.Debugf("api pcre path not match %s != %v", path, pathreg)
|
if logger.V(logger.DebugLevel, logger.DefaultLogger) {
|
||||||
|
logger.Debugf("api pcre path not match %s != %v", path, pathreg)
|
||||||
|
}
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
continue
|
if logger.V(logger.DebugLevel, logger.DefaultLogger) {
|
||||||
|
logger.Debugf("api pcre path match %s != %v", path, pathreg)
|
||||||
|
}
|
||||||
|
pMatch = true
|
||||||
|
break
|
||||||
}
|
}
|
||||||
pMatch = true
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if !pMatch {
|
if !pMatch {
|
||||||
|
Loading…
Reference in New Issue
Block a user