summaryrefslogtreecommitdiff
path: root/modules/caddyhttp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/caddyhttp')
-rw-r--r--modules/caddyhttp/caddyhttp.go13
-rw-r--r--modules/caddyhttp/matchers.go2
-rwxr-xr-xmodules/caddyhttp/reverseproxy/upstream.go29
3 files changed, 34 insertions, 10 deletions
diff --git a/modules/caddyhttp/caddyhttp.go b/modules/caddyhttp/caddyhttp.go
index 449d07f..379c8f2 100644
--- a/modules/caddyhttp/caddyhttp.go
+++ b/modules/caddyhttp/caddyhttp.go
@@ -24,6 +24,7 @@ func init() {
Name: "http",
New: func() (interface{}, error) { return new(App), nil },
})
+
if err != nil {
log.Fatal(err)
}
@@ -94,11 +95,21 @@ func (app *App) Validate() error {
return nil
}
+// AutomaticHTTPSError represents an error received when attempting to enable automatic https.
+type AutomaticHTTPSError struct {
+ internal error
+}
+
+// Error returns the error string for automaticHTTPSError.
+func (a AutomaticHTTPSError) Error() string {
+ return fmt.Sprintf("enabling automatic HTTPS: %v", a.internal.Error())
+}
+
// Start runs the app. It sets up automatic HTTPS if enabled.
func (app *App) Start() error {
err := app.automaticHTTPS()
if err != nil {
- return fmt.Errorf("enabling automatic HTTPS: %v", err)
+ return &AutomaticHTTPSError{internal: err}
}
for srvName, srv := range app.Servers {
diff --git a/modules/caddyhttp/matchers.go b/modules/caddyhttp/matchers.go
index e467c84..5eb0837 100644
--- a/modules/caddyhttp/matchers.go
+++ b/modules/caddyhttp/matchers.go
@@ -12,7 +12,7 @@ import (
"strings"
"bitbucket.org/lightcodelabs/caddy2"
- "bitbucket.org/lightcodelabs/caddy2/internal/caddyscript"
+ "bitbucket.org/lightcodelabs/caddy2/pkg/caddyscript"
"go.starlark.net/starlark"
)
diff --git a/modules/caddyhttp/reverseproxy/upstream.go b/modules/caddyhttp/reverseproxy/upstream.go
index 7e429f9..1217861 100755
--- a/modules/caddyhttp/reverseproxy/upstream.go
+++ b/modules/caddyhttp/reverseproxy/upstream.go
@@ -17,12 +17,6 @@ import (
"bitbucket.org/lightcodelabs/caddy2"
)
-// State represents the global state of a loadbalancer. It is used to store
-// references to health checkers.
-type State struct {
- HealthCheckers []*HealthChecker
-}
-
// CircuitBreaker defines the functionality of a circuit breaker module.
type CircuitBreaker interface {
Ok() bool
@@ -76,7 +70,7 @@ var (
)
// NewLoadBalancedReverseProxy returns a collection of Upstreams that are to be loadbalanced.
-func NewLoadBalancedReverseProxy(lb *LoadBalanced, state *State, ctx caddy2.Context) error {
+func NewLoadBalancedReverseProxy(lb *LoadBalanced, ctx caddy2.Context) error {
// set defaults
if lb.NoHealthyUpstreamsMessage == "" {
lb.NoHealthyUpstreamsMessage = msgNoHealthyUpstreams
@@ -145,7 +139,7 @@ func NewLoadBalancedReverseProxy(lb *LoadBalanced, state *State, ctx caddy2.Cont
// nu.Target.Path = uc.HealthCheckPath
go nu.healthChecker.ScheduleChecks(nu.Target.String())
- state.HealthCheckers = append(state.HealthCheckers, nu.healthChecker)
+ lb.HealthCheckers = append(lb.HealthCheckers, nu.healthChecker)
us = append(us, nu)
}
@@ -178,6 +172,25 @@ type LoadBalanced struct {
// NoHealthyUpstreamsMessage is returned as a response when there are no healthy upstreams to loadbalance to.
NoHealthyUpstreamsMessage string `json:"no_healthy_upstreams_message"`
+
+ // TODO :- store healthcheckers as package level state where each upstream gets a single healthchecker
+ // currently a healthchecker is created for each upstream defined, even if a healthchecker was previously created
+ // for that upstream
+ HealthCheckers []*HealthChecker
+}
+
+// Cleanup stops all health checkers on a loadbalanced reverse proxy.
+func (lb *LoadBalanced) Cleanup() error {
+ for _, hc := range lb.HealthCheckers {
+ hc.Stop()
+ }
+
+ return nil
+}
+
+// Provision sets up a new loadbalanced reverse proxy.
+func (lb *LoadBalanced) Provision(ctx caddy2.Context) error {
+ return NewLoadBalancedReverseProxy(lb, ctx)
}
// ServeHTTP implements the http.Handler interface to dispatch an http request to the proper