summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorFrancis Lavoie <[email protected]>2024-05-23 22:06:16 -0400
committerGitHub <[email protected]>2024-05-23 20:06:16 -0600
commitf6d2c293e752254769efe21c8d06a16ebad4845e (patch)
tree8ae8e566f0bddfe9356d84bf073c2bb63fac99a2
parent2ce5c6526938b604586c987fa3d31117721e40a6 (diff)
downloadcaddy-f6d2c293e752254769efe21c8d06a16ebad4845e.tar.gz
caddy-f6d2c293e752254769efe21c8d06a16ebad4845e.zip
caddyfile: Reject global request matchers earlier (#6339)
-rw-r--r--caddyconfig/caddyfile/parse.go7
-rw-r--r--caddyconfig/caddyfile/parse_test.go23
2 files changed, 29 insertions, 1 deletions
diff --git a/caddyconfig/caddyfile/parse.go b/caddyconfig/caddyfile/parse.go
index a865b70df..17b0ca8e2 100644
--- a/caddyconfig/caddyfile/parse.go
+++ b/caddyconfig/caddyfile/parse.go
@@ -214,7 +214,12 @@ func (p *parser) addresses() error {
value := p.Val()
token := p.Token()
- // special case: import directive replaces tokens during parse-time
+ // Reject request matchers if trying to define them globally
+ if strings.HasPrefix(value, "@") {
+ return p.Errf("request matchers may not be defined globally, they must be in a site block; found %s", value)
+ }
+
+ // Special case: import directive replaces tokens during parse-time
if value == "import" && p.isNewLine() {
err := p.doImport(0)
if err != nil {
diff --git a/caddyconfig/caddyfile/parse_test.go b/caddyconfig/caddyfile/parse_test.go
index 6daded1cf..7157b2b5f 100644
--- a/caddyconfig/caddyfile/parse_test.go
+++ b/caddyconfig/caddyfile/parse_test.go
@@ -857,6 +857,29 @@ func TestSnippetAcrossMultipleFiles(t *testing.T) {
}
}
+func TestRejectsGlobalMatcher(t *testing.T) {
+ p := testParser(`
+ @rejected path /foo
+
+ (common) {
+ gzip foo
+ errors stderr
+ }
+
+ http://example.com {
+ import common
+ }
+ `)
+ _, err := p.parseAll()
+ if err == nil {
+ t.Fatal("Expected an error, but got nil")
+ }
+ expected := "request matchers may not be defined globally, they must be in a site block; found @rejected, at Testfile:2"
+ if err.Error() != expected {
+ t.Errorf("Expected error to be '%s' but got '%v'", expected, err)
+ }
+}
+
func testParser(input string) parser {
return parser{Dispenser: NewTestDispenser(input)}
}