aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorPascal <[email protected]>2019-10-14 19:29:36 +0200
committerMatt Holt <[email protected]>2019-10-14 11:29:36 -0600
commitbc738991b6234bf334855e1396919e79ef9791b8 (patch)
tree62777f65ca331cf5125708f7200d381585e74ee3
parentfcd8869f51b78f260e3c3aed53d7d87c2051ffe9 (diff)
downloadcaddy-bc738991b6234bf334855e1396919e79ef9791b8.tar.gz
caddy-bc738991b6234bf334855e1396919e79ef9791b8.zip
caddyhttp: Support placeholders in MatchHost (#2810)v2.0.0-beta6
* Replace global placeholders in host matcher * caddyhttp: Fix panic on MatchHost tests
-rw-r--r--modules/caddyhttp/caddyhttp.go3
-rw-r--r--modules/caddyhttp/matchers.go3
-rw-r--r--modules/caddyhttp/matchers_test.go52
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)
+ }
+}