|
@ -66,9 +66,9 @@ type ( |
|
|
|
|
|
|
|
|
// MatchNegate matches requests by negating its matchers' results.
|
|
|
// MatchNegate matches requests by negating its matchers' results.
|
|
|
MatchNegate struct { |
|
|
MatchNegate struct { |
|
|
matchersRaw map[string]json.RawMessage |
|
|
MatchersRaw map[string]json.RawMessage `json:"-"` |
|
|
|
|
|
|
|
|
matchers MatcherSet |
|
|
Matchers MatcherSet `json:"-"` |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// MatchStarlarkExpr matches requests by evaluating a Starlark expression.
|
|
|
// MatchStarlarkExpr matches requests by evaluating a Starlark expression.
|
|
@ -400,7 +400,12 @@ func (MatchNegate) CaddyModule() caddy.ModuleInfo { |
|
|
// the struct, but we need a struct because we need another
|
|
|
// the struct, but we need a struct because we need another
|
|
|
// field just for the provisioned modules.
|
|
|
// field just for the provisioned modules.
|
|
|
func (m *MatchNegate) UnmarshalJSON(data []byte) error { |
|
|
func (m *MatchNegate) UnmarshalJSON(data []byte) error { |
|
|
return json.Unmarshal(data, &m.matchersRaw) |
|
|
return json.Unmarshal(data, &m.MatchersRaw) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// MarshalJSON marshals m's matchers.
|
|
|
|
|
|
func (m MatchNegate) MarshalJSON() ([]byte, error) { |
|
|
|
|
|
return json.Marshal(m.MatchersRaw) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// UnmarshalCaddyfile implements caddyfile.Unmarshaler.
|
|
|
// UnmarshalCaddyfile implements caddyfile.Unmarshaler.
|
|
@ -411,21 +416,21 @@ func (m *MatchNegate) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { |
|
|
|
|
|
|
|
|
// Provision loads the matcher modules to be negated.
|
|
|
// Provision loads the matcher modules to be negated.
|
|
|
func (m *MatchNegate) Provision(ctx caddy.Context) error { |
|
|
func (m *MatchNegate) Provision(ctx caddy.Context) error { |
|
|
for modName, rawMsg := range m.matchersRaw { |
|
|
for modName, rawMsg := range m.MatchersRaw { |
|
|
val, err := ctx.LoadModule("http.matchers."+modName, rawMsg) |
|
|
val, err := ctx.LoadModule("http.matchers."+modName, rawMsg) |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
return fmt.Errorf("loading matcher module '%s': %v", modName, err) |
|
|
return fmt.Errorf("loading matcher module '%s': %v", modName, err) |
|
|
} |
|
|
} |
|
|
m.matchers = append(m.matchers, val.(RequestMatcher)) |
|
|
m.Matchers = append(m.Matchers, val.(RequestMatcher)) |
|
|
} |
|
|
} |
|
|
m.matchersRaw = nil // allow GC to deallocate
|
|
|
m.MatchersRaw = nil // allow GC to deallocate
|
|
|
return nil |
|
|
return nil |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Match returns true if r matches m. Since this matcher negates the
|
|
|
// Match returns true if r matches m. Since this matcher negates the
|
|
|
// embedded matchers, false is returned if any of its matchers match.
|
|
|
// embedded matchers, false is returned if any of its matchers match.
|
|
|
func (m MatchNegate) Match(r *http.Request) bool { |
|
|
func (m MatchNegate) Match(r *http.Request) bool { |
|
|
return !m.matchers.Match(r) |
|
|
return !m.Matchers.Match(r) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// CaddyModule returns the Caddy module information.
|
|
|
// CaddyModule returns the Caddy module information.
|
|
@ -686,4 +691,7 @@ var ( |
|
|
_ caddyfile.Unmarshaler = (*MatchHeaderRE)(nil) |
|
|
_ caddyfile.Unmarshaler = (*MatchHeaderRE)(nil) |
|
|
_ caddyfile.Unmarshaler = (*MatchProtocol)(nil) |
|
|
_ caddyfile.Unmarshaler = (*MatchProtocol)(nil) |
|
|
_ caddyfile.Unmarshaler = (*MatchRemoteIP)(nil) |
|
|
_ caddyfile.Unmarshaler = (*MatchRemoteIP)(nil) |
|
|
|
|
|
|
|
|
|
|
|
_ json.Marshaler = (*MatchNegate)(nil) |
|
|
|
|
|
_ json.Unmarshaler = (*MatchNegate)(nil) |
|
|
) |
|
|
) |
|
|