summaryrefslogtreecommitdiff
path: root/modules/caddyhttp/server.go
diff options
context:
space:
mode:
authorFrancis Lavoie <lavofr@gmail.com>2021-04-19 21:54:12 -0400
committerGitHub <noreply@github.com>2021-04-19 19:54:12 -0600
commitd789596bc0b014c99d75c00fe8e55c40ee3d58e3 (patch)
treeafb7c01838832af81d10df46b0e11ea26ece3a15 /modules/caddyhttp/server.go
parent96bb3659299ae5ef28ffb3f9a23e16417c570924 (diff)
caddyhttp: Implement better logic for inserting the HTTP->HTTPS redirs (#4033)
* caddyhttp: Implement better logic for inserting the HTTP->HTTPS redirs * caddyhttp: Add integration test
Diffstat (limited to 'modules/caddyhttp/server.go')
-rw-r--r--modules/caddyhttp/server.go31
1 files changed, 31 insertions, 0 deletions
diff --git a/modules/caddyhttp/server.go b/modules/caddyhttp/server.go
index 27a1ca8..294ee6a 100644
--- a/modules/caddyhttp/server.go
+++ b/modules/caddyhttp/server.go
@@ -373,6 +373,37 @@ func (s *Server) hasTLSClientAuth() bool {
return false
}
+// findLastRouteWithHostMatcher returns the index of the last route
+// in the server which has a host matcher. Used during Automatic HTTPS
+// to determine where to insert the HTTP->HTTPS redirect route, such
+// that it is after any other host matcher but before any "catch-all"
+// route without a host matcher.
+func (s *Server) findLastRouteWithHostMatcher() int {
+ lastIndex := len(s.Routes)
+ for i, route := range s.Routes {
+ // since we want to break out of an inner loop, use a closure
+ // to allow us to use 'return' when we found a host matcher
+ found := (func() bool {
+ for _, sets := range route.MatcherSets {
+ for _, matcher := range sets {
+ switch matcher.(type) {
+ case *MatchHost:
+ return true
+ }
+ }
+ }
+ return false
+ })()
+
+ // if we found the host matcher, change the lastIndex to
+ // just after the current route
+ if found {
+ lastIndex = i + 1
+ }
+ }
+ return lastIndex
+}
+
// HTTPErrorConfig determines how to handle errors
// from the HTTP handlers.
type HTTPErrorConfig struct {