mirror of
				https://github.com/caddyserver/caddy.git
				synced 2025-10-31 02:27:19 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			77 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package config
 | |
| 
 | |
| import (
 | |
| 	"github.com/mholt/caddy/middleware"
 | |
| 	"github.com/mholt/caddy/middleware/browse"
 | |
| 	"github.com/mholt/caddy/middleware/errors"
 | |
| 	"github.com/mholt/caddy/middleware/extensionless"
 | |
| 	"github.com/mholt/caddy/middleware/fastcgi"
 | |
| 	"github.com/mholt/caddy/middleware/gzip"
 | |
| 	"github.com/mholt/caddy/middleware/headers"
 | |
| 	"github.com/mholt/caddy/middleware/log"
 | |
| 	"github.com/mholt/caddy/middleware/markdown"
 | |
| 	"github.com/mholt/caddy/middleware/proxy"
 | |
| 	"github.com/mholt/caddy/middleware/redirect"
 | |
| 	"github.com/mholt/caddy/middleware/rewrite"
 | |
| 	"github.com/mholt/caddy/middleware/websockets"
 | |
| )
 | |
| 
 | |
| // This init function registers middleware. Register
 | |
| // middleware in the order they should be executed
 | |
| // during a request (A, B, C...). Middleware execute
 | |
| // in the order A-B-C-*-C-B-A, assuming they call
 | |
| // the Next handler in the chain.
 | |
| //
 | |
| // Note: Ordering is VERY important. Every middleware
 | |
| // will feel the effects of all other middleware below
 | |
| // (after) them, but must not care what middleware above
 | |
| // them are doing.
 | |
| //
 | |
| // For example, log needs to know the status code and exactly
 | |
| // how many bytes were written to the client, which every
 | |
| // other middleware can affect, so it gets registered first.
 | |
| // The errors middleware does not care if gzip or log modifies
 | |
| // its response, so it gets registered below them. Gzip, on the
 | |
| // other hand, DOES care what errors does to the response since
 | |
| // it must compress every output to the client, even error pages,
 | |
| // so it must be registered before the errors middleware and any
 | |
| // others that would write to the response.
 | |
| func init() {
 | |
| 	register("log", log.New)
 | |
| 	register("gzip", gzip.New)
 | |
| 	register("errors", errors.New)
 | |
| 	register("header", headers.New)
 | |
| 	register("rewrite", rewrite.New)
 | |
| 	register("redirect", redirect.New)
 | |
| 	register("ext", extensionless.New)
 | |
| 	register("proxy", proxy.New)
 | |
| 	register("fastcgi", fastcgi.New)
 | |
| 	register("websocket", websockets.New)
 | |
| 	register("markdown", markdown.New)
 | |
| 	register("browse", browse.New)
 | |
| }
 | |
| 
 | |
| // registry stores the registered middleware:
 | |
| // both the order and the directives to which they
 | |
| // are bound.
 | |
| var registry = struct {
 | |
| 	directiveMap map[string]middleware.Generator
 | |
| 	ordered      []string
 | |
| }{
 | |
| 	directiveMap: make(map[string]middleware.Generator),
 | |
| }
 | |
| 
 | |
| // register binds a middleware generator (outer function)
 | |
| // to a directive. Upon each request, middleware will be
 | |
| // executed in the order they are registered.
 | |
| func register(directive string, generator middleware.Generator) {
 | |
| 	registry.directiveMap[directive] = generator
 | |
| 	registry.ordered = append(registry.ordered, directive)
 | |
| }
 | |
| 
 | |
| // middlewareRegistered returns whether or not a directive is registered.
 | |
| func middlewareRegistered(directive string) bool {
 | |
| 	_, ok := registry.directiveMap[directive]
 | |
| 	return ok
 | |
| }
 |