aboutsummaryrefslogtreecommitdiffhomepage
path: root/caddyconfig/caddyfile
diff options
context:
space:
mode:
Diffstat (limited to 'caddyconfig/caddyfile')
-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)}
}