Commit 4c93ab8c authored by Matthew Holt's avatar Matthew Holt

Merge branch 'configfix' into letsencrypt

parents cc1ff932 c0ebe315
...@@ -47,8 +47,9 @@ func Load(filename string, input io.Reader) (Group, error) { ...@@ -47,8 +47,9 @@ func Load(filename string, input io.Reader) (Group, error) {
// executing the directives that were parsed. // executing the directives that were parsed.
for i, sb := range serverBlocks { for i, sb := range serverBlocks {
onces := makeOnces() onces := makeOnces()
storages := makeStorages()
for _, addr := range sb.Addresses { for j, addr := range sb.Addresses {
config := server.Config{ config := server.Config{
Host: addr.Host, Host: addr.Host,
Port: addr.Port, Port: addr.Port,
...@@ -76,8 +77,10 @@ func Load(filename string, input io.Reader) (Group, error) { ...@@ -76,8 +77,10 @@ func Load(filename string, input io.Reader) (Group, error) {
}) })
return err return err
}, },
ServerBlockIndex: i, ServerBlockIndex: i,
ServerBlockHosts: sb.HostList(), ServerBlockHostIndex: j,
ServerBlockHosts: sb.HostList(),
ServerBlockStorage: storages[dir.name],
} }
midware, err := dir.setup(controller) midware, err := dir.setup(controller)
...@@ -88,6 +91,7 @@ func Load(filename string, input io.Reader) (Group, error) { ...@@ -88,6 +91,7 @@ func Load(filename string, input io.Reader) (Group, error) {
// TODO: For now, we only support the default path scope / // TODO: For now, we only support the default path scope /
config.Middleware["/"] = append(config.Middleware["/"], midware) 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 { ...@@ -129,6 +133,18 @@ func makeOnces() map[string]*sync.Once {
return onces 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, // arrangeBindings groups configurations by their bind address. For example,
// a server that should listen on localhost and another on 127.0.0.1 will // 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 // be grouped into the same address: 127.0.0.1. It will return an error
......
...@@ -29,17 +29,29 @@ type Controller struct { ...@@ -29,17 +29,29 @@ type Controller struct {
// server block as it appeared in the input. // server block as it appeared in the input.
ServerBlockIndex int 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 // ServerBlockHosts is a list of hosts that are
// associated with this server block. All these // associated with this server block. All these
// hosts, consequently, share the same tokens. // hosts, consequently, share the same tokens.
ServerBlockHosts []string 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 // 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 // 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 { func NewTestController(input string) *Controller {
return &Controller{ return &Controller{
Config: &server.Config{ Config: &server.Config{
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment