Skip to content

Commit

Permalink
Sort the paths in routes to ensure matcher picks nearest regex to req…
Browse files Browse the repository at this point in the history
…uest uri (#687)

* Test only

Signed-off-by: PKhivasra <[email protected]>

* Sort the paths in routes to ensure matcher picks nearest regex to request uri

When the default backend routes are registered, currently it is as per unordered map. This means that the routes can have "" or "\api\v1" before "api\v1\query_range". When the router matches the regex expression (Refs: https://gecgithub01.walmart.com/Telemetry/trickster-v2/blob/main/pkg/router/route.go#L40 https://gecgithub01.walmart.com/Telemetry/trickster-v2/blob/main/pkg/router/regexp.go#L323) with the routes map, if partial routes appears first that will be considered as a match, which causes request to be "Proxy-Only".
Thus, with sorting we will ensure that routes will be a sorted array in the descending order of path lengths, meaning: "\api\v1\query_range" would appear before "api\v1" and "" so that we have appropriate match.
Issue:#594

Signed-off-by: PKhivasra <[email protected]>

---------

Signed-off-by: PKhivasra <[email protected]>
  • Loading branch information
PKhivasra authored Dec 2, 2023
1 parent bb292d1 commit 1e0f322
Showing 1 changed file with 14 additions and 1 deletion.
15 changes: 14 additions & 1 deletion pkg/routing/routing.go
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,20 @@ func RegisterDefaultBackendRoutes(router router.Router, bknds backends.Backends,
}
tl.Info(logger,
"registering default backend handler paths", tl.Pairs{"backendName": o.Name})
for _, p := range o.Paths {

// Sort by key length(Path length) to ensure /api/v1/query_range appear before /api/v1 or / path in regex path matching
keylist := make([]string, 0, len(o.Paths))
for key := range o.Paths {
keylist = append(keylist, key)
}
sort.Sort(ByLen(keylist))
for i := len(keylist)/2 - 1; i >= 0; i-- {
opp := len(keylist) - 1 - i
keylist[i], keylist[opp] = keylist[opp], keylist[i]
}

for _, k := range keylist {
var p = o.Paths[k]
if p.Handler != nil && len(p.Methods) > 0 {
tl.Debug(logger, "registering default backend handler paths",
tl.Pairs{"backendName": o.Name, "path": p.Path, "handlerName": p.HandlerName,
Expand Down

0 comments on commit 1e0f322

Please sign in to comment.