|  | @ -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) | 
			
		
	
		
		
			
				
					|  |  | ) |  |  | ) | 
			
		
	
	
		
		
			
				
					|  | 
 |