diff options
author | Francis Lavoie <lavofr@gmail.com> | 2021-04-19 21:54:12 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-19 19:54:12 -0600 |
commit | d789596bc0b014c99d75c00fe8e55c40ee3d58e3 (patch) | |
tree | afb7c01838832af81d10df46b0e11ea26ece3a15 /modules/caddyhttp/server.go | |
parent | 96bb3659299ae5ef28ffb3f9a23e16417c570924 (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.go | 31 |
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 { |