From e34ff21a7183969afb4150f1f7a1f71b9a1dd0d6 Mon Sep 17 00:00:00 2001 From: Matthew Holt Date: Thu, 22 Aug 2019 14:26:33 -0600 Subject: caddyfile: Allow handler order to be customized --- caddyconfig/httpcaddyfile/httptype.go | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) (limited to 'caddyconfig/httpcaddyfile/httptype.go') diff --git a/caddyconfig/httpcaddyfile/httptype.go b/caddyconfig/httpcaddyfile/httptype.go index 047d559..ecf6e94 100644 --- a/caddyconfig/httpcaddyfile/httptype.go +++ b/caddyconfig/httpcaddyfile/httptype.go @@ -66,6 +66,8 @@ func (st ServerType) Setup(originalServerBlocks []caddyfile.ServerBlock, val, err = parseHTTPPort(caddyfile.NewDispenser(segment)) case "https_port": val, err = parseHTTPSPort(caddyfile.NewDispenser(segment)) + case "handler_order": + val, err = parseHandlerOrder(caddyfile.NewDispenser(segment)) default: return nil, warnings, fmt.Errorf("unrecognized parameter name: %s", dir) } @@ -148,7 +150,7 @@ func (st ServerType) Setup(originalServerBlocks []caddyfile.ServerBlock, // each pairing of listener addresses to list of server // blocks is basically a server definition - servers, err := st.serversFromPairings(pairings, &warnings) + servers, err := st.serversFromPairings(pairings, options, &warnings) if err != nil { return nil, warnings, err } @@ -230,7 +232,11 @@ func (st *ServerType) hostsFromServerBlockKeys(sb caddyfile.ServerBlock) ([]stri // serversFromPairings creates the servers for each pairing of addresses // to server blocks. Each pairing is essentially a server definition. -func (st *ServerType) serversFromPairings(pairings []sbAddrAssociation, warnings *[]caddyconfig.Warning) (map[string]*caddyhttp.Server, error) { +func (st *ServerType) serversFromPairings( + pairings []sbAddrAssociation, + options map[string]interface{}, + warnings *[]caddyconfig.Warning, +) (map[string]*caddyhttp.Server, error) { servers := make(map[string]*caddyhttp.Server) for i, p := range pairings { @@ -289,16 +295,19 @@ func (st *ServerType) serversFromPairings(pairings []sbAddrAssociation, warnings siteVarSubroute.Routes = append(siteVarSubroute.Routes, cfgVal.Value.(caddyhttp.Route)) } - // set up each handler directive + // set up each handler directive - the order of the handlers + // as they are added to the routes depends on user preference dirRoutes := sblock.pile["route"] - // TODO: The ordering here depends on... if there is a list of - // directives to use, then sort by that, otherwise just use in - // the order they appear in the slice (which is the order they - // appeared in the Caddyfile) - sortByList := true - if sortByList { + handlerOrder, ok := options["handler_order"].([]string) + if !ok { + handlerOrder = defaultDirectiveOrder + } + if len(handlerOrder) == 1 && handlerOrder[0] == "appearance" { + handlerOrder = nil + } + if handlerOrder != nil { dirPositions := make(map[string]int) - for i, dir := range defaultDirectiveOrder { + for i, dir := range handlerOrder { dirPositions[dir] = i } sort.SliceStable(dirRoutes, func(i, j int) bool { -- cgit v1.2.3