2015-05-05 01:04:17 +08:00
|
|
|
package setup
|
|
|
|
|
|
|
|
import (
|
2015-09-29 11:16:40 +08:00
|
|
|
"fmt"
|
|
|
|
"net/http"
|
|
|
|
"strings"
|
|
|
|
|
2015-05-05 01:04:17 +08:00
|
|
|
"github.com/mholt/caddy/config/parse"
|
2015-09-29 11:16:40 +08:00
|
|
|
"github.com/mholt/caddy/middleware"
|
2015-05-05 01:04:17 +08:00
|
|
|
"github.com/mholt/caddy/server"
|
|
|
|
)
|
|
|
|
|
2015-09-29 11:16:40 +08:00
|
|
|
// Controller is given to the setup function of middlewares which
|
2015-10-15 14:07:26 +08:00
|
|
|
// gives them access to be able to read tokens and set config. Each
|
|
|
|
// virtualhost gets their own server config and dispenser.
|
2015-05-05 01:04:17 +08:00
|
|
|
type Controller struct {
|
|
|
|
*server.Config
|
|
|
|
parse.Dispenser
|
2015-10-15 14:07:26 +08:00
|
|
|
|
|
|
|
// OncePerServerBlock is a function that executes f
|
|
|
|
// exactly once per server block, no matter how many
|
2015-10-16 01:38:17 +08:00
|
|
|
// hosts are associated with it. If it is the first
|
|
|
|
// time, the function f is executed immediately
|
|
|
|
// (not deferred) and may return an error which is
|
|
|
|
// returned by OncePerServerBlock.
|
|
|
|
OncePerServerBlock func(f func() error) error
|
2015-10-16 13:34:54 +08:00
|
|
|
|
|
|
|
// ServerBlockIndex is the 0-based index of the
|
|
|
|
// server block as it appeared in the input.
|
|
|
|
ServerBlockIndex int
|
|
|
|
|
2015-10-18 04:11:32 +08:00
|
|
|
// ServerBlockHostIndex is the 0-based index of this
|
|
|
|
// host as it appeared in the input at the head of the
|
|
|
|
// server block.
|
|
|
|
ServerBlockHostIndex int
|
|
|
|
|
2015-10-16 13:34:54 +08:00
|
|
|
// ServerBlockHosts is a list of hosts that are
|
|
|
|
// associated with this server block. All these
|
|
|
|
// hosts, consequently, share the same tokens.
|
|
|
|
ServerBlockHosts []string
|
2015-10-18 04:11:32 +08:00
|
|
|
|
|
|
|
// ServerBlockStorage is used by a directive's
|
|
|
|
// setup function to persist state between all
|
|
|
|
// the hosts on a server block.
|
|
|
|
ServerBlockStorage interface{}
|
2015-05-05 01:04:17 +08:00
|
|
|
}
|
2015-09-29 11:16:40 +08:00
|
|
|
|
|
|
|
// NewTestController creates a new *Controller for
|
2015-10-18 04:11:32 +08:00
|
|
|
// the input specified, with a filename of "Testfile".
|
|
|
|
// The Config is bare, consisting only of a Root of cwd.
|
2015-09-29 11:16:40 +08:00
|
|
|
//
|
|
|
|
// Used primarily for testing but needs to be exported so
|
2015-10-18 04:11:32 +08:00
|
|
|
// add-ons can use this as a convenience. Does not initialize
|
|
|
|
// the server-block-related fields.
|
2015-09-29 11:16:40 +08:00
|
|
|
func NewTestController(input string) *Controller {
|
|
|
|
return &Controller{
|
2015-10-14 07:49:53 +08:00
|
|
|
Config: &server.Config{
|
|
|
|
Root: ".",
|
|
|
|
},
|
2015-09-29 11:16:40 +08:00
|
|
|
Dispenser: parse.NewDispenser("Testfile", strings.NewReader(input)),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// EmptyNext is a no-op function that can be passed into
|
|
|
|
// middleware.Middleware functions so that the assignment
|
|
|
|
// to the Next field of the Handler can be tested.
|
|
|
|
//
|
|
|
|
// Used primarily for testing but needs to be exported so
|
|
|
|
// add-ons can use this as a convenience.
|
|
|
|
var EmptyNext = middleware.HandlerFunc(func(w http.ResponseWriter, r *http.Request) (int, error) {
|
|
|
|
return 0, nil
|
|
|
|
})
|
|
|
|
|
|
|
|
// SameNext does a pointer comparison between next1 and next2.
|
|
|
|
//
|
|
|
|
// Used primarily for testing but needs to be exported so
|
|
|
|
// add-ons can use this as a convenience.
|
|
|
|
func SameNext(next1, next2 middleware.Handler) bool {
|
|
|
|
return fmt.Sprintf("%v", next1) == fmt.Sprintf("%v", next2)
|
|
|
|
}
|