redir: Do not count multiple rules with if statements as duplicates

This allows you to have multiple redir directives conditioned solely
upon if statements, without regard to path.
This commit is contained in:
Matthew Holt 2017-09-28 11:41:11 -06:00
parent baf6db5b57
commit f9cba03d25
No known key found for this signature in database
GPG key ID: 2A349DD577D586A5
2 changed files with 10 additions and 5 deletions

View file

@ -40,6 +40,7 @@ func SetupIfMatcher(controller *caddy.Controller) (RequestMatcher, error) {
return matcher, err
}
matcher.ifs = append(matcher.ifs, ifc)
matcher.Enabled = true
case "if_op":
if !c.NextArg() {
return matcher, c.ArgErr()
@ -155,8 +156,9 @@ func (i ifCond) True(r *http.Request) bool {
// IfMatcher is a RequestMatcher for 'if' conditions.
type IfMatcher struct {
ifs []ifCond // list of If
isOr bool // if true, conditions are 'or' instead of 'and'
Enabled bool // if true, matcher has been configured; otherwise it's no-op
ifs []ifCond // list of If
isOr bool // if true, conditions are 'or' instead of 'and'
}
// Match satisfies RequestMatcher interface.

View file

@ -101,9 +101,12 @@ func redirParse(c *caddy.Controller) ([]Rule, error) {
return c.Err("'from' and 'to' values of redirect rule cannot be the same")
}
for _, otherRule := range redirects {
if otherRule.FromPath == rule.FromPath {
return c.Errf("rule with duplicate 'from' value: %s -> %s", otherRule.FromPath, otherRule.To)
// prevent obvious duplicates (rules with if statements exempt)
if ifm, ok := rule.RequestMatcher.(httpserver.IfMatcher); !ok || !ifm.Enabled {
for _, otherRule := range redirects {
if otherRule.FromPath == rule.FromPath {
return c.Errf("rule with duplicate 'from' value: %s -> %s", otherRule.FromPath, otherRule.To)
}
}
}