diff options
-rw-r--r-- | modules/caddyhttp/caddyhttp.go | 3 | ||||
-rw-r--r-- | modules/caddyhttp/matchers.go | 3 | ||||
-rw-r--r-- | modules/caddyhttp/matchers_test.go | 52 |
3 files changed, 58 insertions, 0 deletions
diff --git a/modules/caddyhttp/caddyhttp.go b/modules/caddyhttp/caddyhttp.go index 191f803be..5631b300b 100644 --- a/modules/caddyhttp/caddyhttp.go +++ b/modules/caddyhttp/caddyhttp.go @@ -273,6 +273,8 @@ func (app *App) automaticHTTPS() error { // addresses to the routes that do HTTP->HTTPS redirects lnAddrRedirRoutes := make(map[string]Route) + repl := caddy.NewReplacer() + for srvName, srv := range app.Servers { srv.tlsApp = tlsApp @@ -294,6 +296,7 @@ func (app *App) automaticHTTPS() error { for _, m := range matcherSet { if hm, ok := m.(*MatchHost); ok { for _, d := range *hm { + d = repl.ReplaceAll(d, "") if certmagic.HostQualifies(d) && !srv.AutoHTTPS.Skipped(d, srv.AutoHTTPS.Skip) { domainSet[d] = struct{}{} diff --git a/modules/caddyhttp/matchers.go b/modules/caddyhttp/matchers.go index 7c35a3963..23b13dd1f 100644 --- a/modules/caddyhttp/matchers.go +++ b/modules/caddyhttp/matchers.go @@ -118,8 +118,11 @@ func (m MatchHost) Match(r *http.Request) bool { reqHost = strings.TrimSuffix(reqHost, "]") } + repl := r.Context().Value(caddy.ReplacerCtxKey).(caddy.Replacer) + outer: for _, host := range m { + host = repl.ReplaceAll(host, "") if strings.Contains(host, "*") { patternParts := strings.Split(host, ".") incomingParts := strings.Split(reqHost, ".") diff --git a/modules/caddyhttp/matchers_test.go b/modules/caddyhttp/matchers_test.go index 48783aed1..81cb1d097 100644 --- a/modules/caddyhttp/matchers_test.go +++ b/modules/caddyhttp/matchers_test.go @@ -20,12 +20,18 @@ import ( "net/http" "net/http/httptest" "net/url" + "os" "testing" "github.com/caddyserver/caddy/v2" ) func TestHostMatcher(t *testing.T) { + err := os.Setenv("GO_BENCHMARK_DOMAIN", "localhost") + if err != nil { + t.Errorf("error while setting up environment: %v", err) + } + for i, tc := range []struct { match MatchHost input string @@ -106,8 +112,22 @@ func TestHostMatcher(t *testing.T) { input: "example.com:5555", expect: true, }, + { + match: MatchHost{"{env.GO_BENCHMARK_DOMAIN}"}, + input: "localhost", + expect: true, + }, + { + match: MatchHost{"{env.GO_NONEXISTENT}"}, + input: "localhost", + expect: false, + }, } { req := &http.Request{Host: tc.input} + repl := caddy.NewReplacer() + ctx := context.WithValue(req.Context(), caddy.ReplacerCtxKey, repl) + req = req.WithContext(ctx) + actual := tc.match.Match(req) if actual != tc.expect { t.Errorf("Test %d %v: Expected %t, got %t for '%s'", i, tc.match, tc.expect, actual, tc.input) @@ -518,3 +538,35 @@ func TestResponseMatcher(t *testing.T) { } } } + +func BenchmarkHostMatcherWithoutPlaceholder(b *testing.B) { + req := &http.Request{Host: "localhost"} + repl := caddy.NewReplacer() + ctx := context.WithValue(req.Context(), caddy.ReplacerCtxKey, repl) + req = req.WithContext(ctx) + + match := MatchHost{"localhost"} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + match.Match(req) + } +} + +func BenchmarkHostMatcherWithPlaceholder(b *testing.B) { + err := os.Setenv("GO_BENCHMARK_DOMAIN", "localhost") + if err != nil { + b.Errorf("error while setting up environment: %v", err) + } + + req := &http.Request{Host: "localhost"} + repl := caddy.NewReplacer() + ctx := context.WithValue(req.Context(), caddy.ReplacerCtxKey, repl) + req = req.WithContext(ctx) + match := MatchHost{"{env.GO_BENCHMARK_DOMAIN}"} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + match.Match(req) + } +} |