diff options
author | Francis Lavoie <[email protected]> | 2024-05-23 22:06:16 -0400 |
---|---|---|
committer | GitHub <[email protected]> | 2024-05-23 20:06:16 -0600 |
commit | f6d2c293e752254769efe21c8d06a16ebad4845e (patch) | |
tree | 8ae8e566f0bddfe9356d84bf073c2bb63fac99a2 /caddyconfig | |
parent | 2ce5c6526938b604586c987fa3d31117721e40a6 (diff) | |
download | caddy-f6d2c293e752254769efe21c8d06a16ebad4845e.tar.gz caddy-f6d2c293e752254769efe21c8d06a16ebad4845e.zip |
caddyfile: Reject global request matchers earlier (#6339)
Diffstat (limited to 'caddyconfig')
-rw-r--r-- | caddyconfig/caddyfile/parse.go | 7 | ||||
-rw-r--r-- | caddyconfig/caddyfile/parse_test.go | 23 |
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)} } |