From 6a1233b2f650ab427ea90f1970eed5d368a0238e Mon Sep 17 00:00:00 2001 From: Matias Anaya Date: Tue, 21 Mar 2017 18:35:16 +1100 Subject: [PATCH] Fix quoted values check --- godotenv.go | 10 ++++++---- godotenv_test.go | 16 ++++++++-------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/godotenv.go b/godotenv.go index a098dd2..2551048 100644 --- a/godotenv.go +++ b/godotenv.go @@ -216,14 +216,16 @@ func parseLine(line string) (key string, value string, err error) { value = strings.Trim(value, " ") // check if we've got quoted values - if strings.Count(value, "\"") == 2 || strings.Count(value, "'") == 2 { + first := string(value[0:1]) + last := string(value[len(value)-1:]) + if first == last && strings.ContainsAny(first, `"'`) { // pull the quotes off the edges - value = strings.Trim(value, "\"'") + value = strings.Trim(value, `"'`) // expand quotes - value = strings.Replace(value, "\\\"", "\"", -1) + value = strings.Replace(value, `\"`, `"`, -1) // expand newlines - value = strings.Replace(value, "\\n", "\n", -1) + value = strings.Replace(value, `\n`, "\n", -1) } return diff --git a/godotenv_test.go b/godotenv_test.go index 2d26ee4..ea22da3 100644 --- a/godotenv_test.go +++ b/godotenv_test.go @@ -187,24 +187,24 @@ func TestParsing(t *testing.T) { parseAndCompare(t, "FOO= bar", "FOO", "bar") // parses double quoted values - parseAndCompare(t, "FOO=\"bar\"", "FOO", "bar") + parseAndCompare(t, `FOO="bar"`, "FOO", "bar") // parses single quoted values parseAndCompare(t, "FOO='bar'", "FOO", "bar") // parses escaped double quotes - parseAndCompare(t, "FOO=escaped\\\"bar\"", "FOO", "escaped\"bar") + parseAndCompare(t, `FOO="escaped\"bar"`, "FOO", `escaped"bar`) // parses yaml style options parseAndCompare(t, "OPTION_A: 1", "OPTION_A", "1") // parses export keyword parseAndCompare(t, "export OPTION_A=2", "OPTION_A", "2") - parseAndCompare(t, "export OPTION_B='\\n'", "OPTION_B", "\n") + parseAndCompare(t, `export OPTION_B='\n'`, "OPTION_B", "\n") // it 'expands newlines in quoted strings' do // expect(env('FOO="bar\nbaz"')).to eql('FOO' => "bar\nbaz") - parseAndCompare(t, "FOO=\"bar\\nbaz\"", "FOO", "bar\nbaz") + parseAndCompare(t, `FOO="bar\nbaz"`, "FOO", "bar\nbaz") // it 'parses varibales with "." in the name' do // expect(env('FOO.BAR=foobar')).to eql('FOO.BAR' => 'foobar') @@ -224,14 +224,14 @@ func TestParsing(t *testing.T) { // it 'allows # in quoted value' do // expect(env('foo="bar#baz" # comment')).to eql('foo' => 'bar#baz') - parseAndCompare(t, "FOO=\"bar#baz\" # comment", "FOO", "bar#baz") + parseAndCompare(t, `FOO="bar#baz" # comment`, "FOO", "bar#baz") parseAndCompare(t, "FOO='bar#baz' # comment", "FOO", "bar#baz") - parseAndCompare(t, "FOO=\"bar#baz#bang\" # comment", "FOO", "bar#baz#bang") + parseAndCompare(t, `FOO="bar#baz#bang" # comment`, "FOO", "bar#baz#bang") // it 'parses # in quoted values' do // expect(env('foo="ba#r"')).to eql('foo' => 'ba#r') // expect(env("foo='ba#r'")).to eql('foo' => 'ba#r') - parseAndCompare(t, "FOO=\"ba#r\"", "FOO", "ba#r") + parseAndCompare(t, `FOO="ba#r"`, "FOO", "ba#r") parseAndCompare(t, "FOO='ba#r'", "FOO", "ba#r") // it 'throws an error if line format is incorrect' do @@ -265,7 +265,7 @@ func TestLinesToIgnore(t *testing.T) { } // make sure we're not getting false positives - if isIgnoredLine("export OPTION_B='\\n'") { + if isIgnoredLine(`export OPTION_B='\n'`) { t.Error("ignoring a perfectly valid line to parse") } }