From b85b6c64690dc75fd3096e452dbf8881456d0da7 Mon Sep 17 00:00:00 2001 From: Steffen Busch <37350514+steffenbusch@users.noreply.github.com> Date: Wed, 7 Aug 2024 21:39:15 +0200 Subject: [PATCH] replacer: `{file.*}` global placeholder strips trailing newline (#6411) Co-authored-by: Kanashimia --- .../foo_with_multiple_trailing_newlines.txt | 2 ++ .../testdata/foo_with_trailing_newline.txt | 1 + replacer.go | 3 +++ replacer_test.go | 15 +++++++++++++++ 4 files changed, 21 insertions(+) create mode 100644 caddytest/integration/testdata/foo_with_multiple_trailing_newlines.txt create mode 100644 caddytest/integration/testdata/foo_with_trailing_newline.txt diff --git a/caddytest/integration/testdata/foo_with_multiple_trailing_newlines.txt b/caddytest/integration/testdata/foo_with_multiple_trailing_newlines.txt new file mode 100644 index 00000000..75d7bfb8 --- /dev/null +++ b/caddytest/integration/testdata/foo_with_multiple_trailing_newlines.txt @@ -0,0 +1,2 @@ +foo + diff --git a/caddytest/integration/testdata/foo_with_trailing_newline.txt b/caddytest/integration/testdata/foo_with_trailing_newline.txt new file mode 100644 index 00000000..257cc564 --- /dev/null +++ b/caddytest/integration/testdata/foo_with_trailing_newline.txt @@ -0,0 +1 @@ +foo diff --git a/replacer.go b/replacer.go index e5d2913e..65815c92 100644 --- a/replacer.go +++ b/replacer.go @@ -15,6 +15,7 @@ package caddy import ( + "bytes" "fmt" "io" "net/http" @@ -354,6 +355,8 @@ func (f fileReplacementProvider) replace(key string) (any, bool) { zap.Error(err)) return nil, true } + body = bytes.TrimSuffix(body, []byte("\n")) + body = bytes.TrimSuffix(body, []byte("\r")) return string(body), true } diff --git a/replacer_test.go b/replacer_test.go index cf4d321b..1c1a7048 100644 --- a/replacer_test.go +++ b/replacer_test.go @@ -431,6 +431,14 @@ func TestReplacerNew(t *testing.T) { variable: "file.caddytest/integration/testdata/foo.txt", value: "foo", }, + { + variable: "file.caddytest/integration/testdata/foo_with_trailing_newline.txt", + value: "foo", + }, + { + variable: "file.caddytest/integration/testdata/foo_with_multiple_trailing_newlines.txt", + value: "foo" + getEOL(), + }, } { if val, ok := repl.providers[1].replace(tc.variable); ok { if val != tc.value { @@ -442,6 +450,13 @@ func TestReplacerNew(t *testing.T) { } } +func getEOL() string { + if os.PathSeparator == '\\' { + return "\r\n" // Windows EOL + } + return "\n" // Unix and modern macOS EOL +} + func TestReplacerNewWithoutFile(t *testing.T) { repl := NewReplacer().WithoutFile()