From 483e31b9788f57b0a1adc153574878d0c7c4feb0 Mon Sep 17 00:00:00 2001 From: Thorkild Gregersen Date: Mon, 18 May 2020 21:01:04 +0200 Subject: [PATCH] templates: trim windows whitespace in SplitFrontMatter; fix #3386 (#3387) * add test case for SplitFrontMatter showing issue with windows newline * fix issue with windows newline when using SplitFrontMatter * Update modules/caddyhttp/templates/frontmatter.go Co-authored-by: Francis Lavoie * make it mere explicit what is trimmed from firstLine * Update modules/caddyhttp/templates/frontmatter.go Co-authored-by: Francis Lavoie Co-authored-by: Matt Holt --- modules/caddyhttp/templates/frontmatter.go | 3 ++ .../caddyhttp/templates/tplcontext_test.go | 45 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/modules/caddyhttp/templates/frontmatter.go b/modules/caddyhttp/templates/frontmatter.go index d6b6d0e9..d781c7bb 100644 --- a/modules/caddyhttp/templates/frontmatter.go +++ b/modules/caddyhttp/templates/frontmatter.go @@ -30,6 +30,9 @@ func extractFrontMatter(input string) (map[string]interface{}, string, error) { } firstLine := input[firstLineStart:firstLineEnd] + // ensure residue windows carriage return byte is removed + firstLine = strings.TrimSpace(firstLine) + // see what kind of front matter there is, if any var closingFence string var fmParser func([]byte) (map[string]interface{}, error) diff --git a/modules/caddyhttp/templates/tplcontext_test.go b/modules/caddyhttp/templates/tplcontext_test.go index dbf2172e..4c3da033 100644 --- a/modules/caddyhttp/templates/tplcontext_test.go +++ b/modules/caddyhttp/templates/tplcontext_test.go @@ -284,6 +284,51 @@ func TestFileListing(t *testing.T) { } } +func TestSplitFrontMatter(t *testing.T) { + context := getContextOrFail(t) + + for i, test := range []struct { + input string + expect string + }{ + { + // yaml with windows newline + input: "---\r\ntitle: Welcome\r\n---\r\n# Test\\r\\n", + expect: `Welcome`, + }, + { + // yaml + input: `--- +title: Welcome +--- +### Test`, + expect: `Welcome`, + }, + { + // toml + input: `+++ +title = "Welcome" ++++ +### Test`, + expect: `Welcome`, + }, + { + // json + input: `{ + "title": "Welcome" +} +### Test`, + expect: `Welcome`, + }, + } { + result, _ := context.funcSplitFrontMatter(test.input) + if result.Meta["title"] != test.expect { + t.Errorf("Test %d: Expected %s, found %s. Input was SplitFrontMatter(%s)", i, test.expect, result.Meta["title"], test.input) + } + } + +} + func getContextOrFail(t *testing.T) templateContext { context, err := initTestContext() if err != nil {