mirror of
https://github.com/caddyserver/caddy.git
synced 2025-01-14 06:46:27 +03:00
caddyhttp: Fix edgecase with auto HTTP->HTTPS logic (#4243)
This commit is contained in:
parent
46d99aba85
commit
1c6c7714a3
2 changed files with 31 additions and 0 deletions
|
@ -103,3 +103,23 @@ func TestAutoHTTPRedirectsInsertedBeforeUserDefinedCatchAll(t *testing.T) {
|
||||||
tester.AssertGetResponse("http://foo.localhost:9080/", 200, "Foo")
|
tester.AssertGetResponse("http://foo.localhost:9080/", 200, "Foo")
|
||||||
tester.AssertGetResponse("http://baz.localhost:9080/", 200, "Baz")
|
tester.AssertGetResponse("http://baz.localhost:9080/", 200, "Baz")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAutoHTTPRedirectsInsertedBeforeUserDefinedCatchAllWithNoExplicitHTTPSite(t *testing.T) {
|
||||||
|
tester := caddytest.NewTester(t)
|
||||||
|
tester.InitServer(`
|
||||||
|
{
|
||||||
|
http_port 9080
|
||||||
|
https_port 9443
|
||||||
|
local_certs
|
||||||
|
}
|
||||||
|
http://:9080 {
|
||||||
|
respond "Foo"
|
||||||
|
}
|
||||||
|
bar.localhost {
|
||||||
|
respond "Bar"
|
||||||
|
}
|
||||||
|
`, "caddyfile")
|
||||||
|
tester.AssertRedirect("http://bar.localhost:9080/", "https://bar.localhost/", http.StatusPermanentRedirect)
|
||||||
|
tester.AssertGetResponse("http://foo.localhost:9080/", 200, "Foo")
|
||||||
|
tester.AssertGetResponse("http://baz.localhost:9080/", 200, "Foo")
|
||||||
|
}
|
||||||
|
|
|
@ -379,7 +379,9 @@ func (s *Server) hasTLSClientAuth() bool {
|
||||||
// that it is after any other host matcher but before any "catch-all"
|
// that it is after any other host matcher but before any "catch-all"
|
||||||
// route without a host matcher.
|
// route without a host matcher.
|
||||||
func (s *Server) findLastRouteWithHostMatcher() int {
|
func (s *Server) findLastRouteWithHostMatcher() int {
|
||||||
|
foundHostMatcher := false
|
||||||
lastIndex := len(s.Routes)
|
lastIndex := len(s.Routes)
|
||||||
|
|
||||||
for i, route := range s.Routes {
|
for i, route := range s.Routes {
|
||||||
// since we want to break out of an inner loop, use a closure
|
// 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
|
// to allow us to use 'return' when we found a host matcher
|
||||||
|
@ -388,6 +390,7 @@ func (s *Server) findLastRouteWithHostMatcher() int {
|
||||||
for _, matcher := range sets {
|
for _, matcher := range sets {
|
||||||
switch matcher.(type) {
|
switch matcher.(type) {
|
||||||
case *MatchHost:
|
case *MatchHost:
|
||||||
|
foundHostMatcher = true
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -401,6 +404,14 @@ func (s *Server) findLastRouteWithHostMatcher() int {
|
||||||
lastIndex = i + 1
|
lastIndex = i + 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we didn't actually find a host matcher, return 0
|
||||||
|
// because that means every defined route was a "catch-all".
|
||||||
|
// See https://caddy.community/t/how-to-set-priority-in-caddyfile/13002/8
|
||||||
|
if !foundHostMatcher {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
return lastIndex
|
return lastIndex
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue