From a8d45277ca387ca4769fb4e881d242a5896cca5a Mon Sep 17 00:00:00 2001 From: Francis Lavoie Date: Thu, 22 Apr 2021 20:29:04 -0400 Subject: [PATCH] caddyfile: Fix `import` replacing unrelated placeholders (#4129) * caddyfile: Fix `import` replacing unrelated placeholders See https://caddy.community/t/snippet-issue-works-outside-snippet/12231 So it turns out that `NewReplacer()` gives a replacer with some global defaults (like `{env.*}` and some system and time placeholders), which is not ideal when running `import` because we just want to replace `{args.*}` only, and nothing else. * caddyfile: Add test --- caddyconfig/caddyfile/parse.go | 2 +- .../import_args_snippet_env_placeholder.txt | 31 +++++++++++++++++++ replacer.go | 12 +++++++ 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 caddytest/integration/caddyfile_adapt/import_args_snippet_env_placeholder.txt diff --git a/caddyconfig/caddyfile/parse.go b/caddyconfig/caddyfile/parse.go index 52abf4786..96491bb30 100755 --- a/caddyconfig/caddyfile/parse.go +++ b/caddyconfig/caddyfile/parse.go @@ -321,7 +321,7 @@ func (p *parser) doImport() error { args := p.RemainingArgs() // add args to the replacer - repl := caddy.NewReplacer() + repl := caddy.NewEmptyReplacer() for index, arg := range args { repl.Set("args."+strconv.Itoa(index), arg) } diff --git a/caddytest/integration/caddyfile_adapt/import_args_snippet_env_placeholder.txt b/caddytest/integration/caddyfile_adapt/import_args_snippet_env_placeholder.txt new file mode 100644 index 000000000..1bc907e51 --- /dev/null +++ b/caddytest/integration/caddyfile_adapt/import_args_snippet_env_placeholder.txt @@ -0,0 +1,31 @@ +(foo) { + respond {env.FOO} +} + +:80 { + import foo +} +---------- +{ + "apps": { + "http": { + "servers": { + "srv0": { + "listen": [ + ":80" + ], + "routes": [ + { + "handle": [ + { + "body": "{env.FOO}", + "handler": "static_response" + } + ] + } + ] + } + } + } + } +} \ No newline at end of file diff --git a/replacer.go b/replacer.go index 29d8e26a7..e6cfdede7 100644 --- a/replacer.go +++ b/replacer.go @@ -36,6 +36,18 @@ func NewReplacer() *Replacer { return rep } +// NewEmptyReplacer returns a new Replacer, +// without the global default replacements. +func NewEmptyReplacer() *Replacer { + rep := &Replacer{ + static: make(map[string]interface{}), + } + rep.providers = []ReplacerFunc{ + rep.fromStatic, + } + return rep +} + // Replacer can replace values in strings. // A default/empty Replacer is not valid; // use NewReplacer to make one.