diff --git a/config/config.go b/config/config.go index 117593510..97b66ea0f 100644 --- a/config/config.go +++ b/config/config.go @@ -47,8 +47,9 @@ func Load(filename string, input io.Reader) (Group, error) { // executing the directives that were parsed. for i, sb := range serverBlocks { onces := makeOnces() + storages := makeStorages() - for _, addr := range sb.Addresses { + for j, addr := range sb.Addresses { config := server.Config{ Host: addr.Host, Port: addr.Port, @@ -76,8 +77,10 @@ func Load(filename string, input io.Reader) (Group, error) { }) return err }, - ServerBlockIndex: i, - ServerBlockHosts: sb.HostList(), + ServerBlockIndex: i, + ServerBlockHostIndex: j, + ServerBlockHosts: sb.HostList(), + ServerBlockStorage: storages[dir.name], } midware, err := dir.setup(controller) @@ -88,6 +91,7 @@ func Load(filename string, input io.Reader) (Group, error) { // TODO: For now, we only support the default path scope / config.Middleware["/"] = append(config.Middleware["/"], midware) } + storages[dir.name] = controller.ServerBlockStorage // persist for this server block } } @@ -129,6 +133,18 @@ func makeOnces() map[string]*sync.Once { return onces } +// makeStorages makes a map of directive name to interface{} +// so that directives' setup functions can persist state +// between different hosts on the same server block during the +// setup phase. +func makeStorages() map[string]interface{} { + storages := make(map[string]interface{}) + for _, dir := range directiveOrder { + storages[dir.name] = nil + } + return storages +} + // arrangeBindings groups configurations by their bind address. For example, // a server that should listen on localhost and another on 127.0.0.1 will // be grouped into the same address: 127.0.0.1. It will return an error diff --git a/config/setup/controller.go b/config/setup/controller.go index eb9b90cfc..04873082b 100644 --- a/config/setup/controller.go +++ b/config/setup/controller.go @@ -29,17 +29,29 @@ type Controller struct { // server block as it appeared in the input. ServerBlockIndex int + // ServerBlockHostIndex is the 0-based index of this + // host as it appeared in the input at the head of the + // server block. + ServerBlockHostIndex int + // ServerBlockHosts is a list of hosts that are // associated with this server block. All these // hosts, consequently, share the same tokens. ServerBlockHosts []string + + // ServerBlockStorage is used by a directive's + // setup function to persist state between all + // the hosts on a server block. + ServerBlockStorage interface{} } // NewTestController creates a new *Controller for -// the input specified, with a filename of "Testfile" +// the input specified, with a filename of "Testfile". +// The Config is bare, consisting only of a Root of cwd. // // Used primarily for testing but needs to be exported so -// add-ons can use this as a convenience. +// add-ons can use this as a convenience. Does not initialize +// the server-block-related fields. func NewTestController(input string) *Controller { return &Controller{ Config: &server.Config{