Skip to content

Commit

Permalink
fix: skip already seen routes after a match
Browse files Browse the repository at this point in the history
This is done to be backwards compatible with the old matching behavior see #192 (comment)
  • Loading branch information
ydylla committed Jun 2, 2024
1 parent 6a8be7c commit bb73dc3
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion layer4/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ func (routes RouteList) Provision(ctx caddy.Context) error {
func (routes RouteList) Compile(logger *zap.Logger, matchingTimeout time.Duration, next NextHandler) Handler {
return HandlerFunc(func(cx *Connection) error {
deadline := time.Now().Add(matchingTimeout)
lastMatchedRouteIdx := -1
router:
// timeout matching to protect against malicious or very slow clients
err := cx.Conn.SetReadDeadline(deadline)
Expand All @@ -127,7 +128,14 @@ func (routes RouteList) Compile(logger *zap.Logger, matchingTimeout time.Duratio
}
}

for _, route := range routes {
for i, route := range routes {
// After a match continue with the routes after the matched one, instead of starting at the beginning.
// This is done for backwards compatibility with configs written before the "Non blocking matchers & matching timeout" rewrite.
// See https://github.com/mholt/caddy-l4/pull/192 and https://github.com/mholt/caddy-l4/pull/192#issuecomment-2143681952.
if i <= lastMatchedRouteIdx {
continue
}

// A route must match at least one of the matcher sets
matched, err := route.matcherSets.AnyMatch(cx)
if errors.Is(err, ErrConsumedAllPrefetchedBytes) {
Expand All @@ -138,6 +146,8 @@ func (routes RouteList) Compile(logger *zap.Logger, matchingTimeout time.Duratio
return nil
}
if matched {
lastMatchedRouteIdx = i

// remove deadline after we matched
err = cx.Conn.SetReadDeadline(time.Time{})
if err != nil {
Expand Down

0 comments on commit bb73dc3

Please sign in to comment.