Skip to content

Commit 95cb0fa

Browse files
Merge pull request #368 from vlucas/escape
Handle additional quoted escape sequences such as "\n"
2 parents d320ce5 + 92ba1f6 commit 95cb0fa

File tree

5 files changed

+43
-4
lines changed

5 files changed

+43
-4
lines changed

src/Parser.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ private static function parseValue($value)
134134
case self::ESCAPE_STATE:
135135
if ($char === $value[0] || $char === '\\') {
136136
return [$data[0].$char, self::QUOTED_STATE];
137+
} elseif (in_array($char, ['f', 'n', 'r', 't', 'v'], true)) {
138+
return [$data[0].stripcslashes('\\' . $char), self::QUOTED_STATE];
137139
} else {
138140
throw new InvalidFileException(
139141
self::getErrorMessage('an unexpected escape sequence', $value)

tests/Dotenv/DotenvTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,9 @@ public function testMutlilineLoading()
229229
$dotenv = Dotenv::create($this->fixturesFolder, 'multiline.env');
230230
$dotenv->load();
231231
$this->assertSame("test\n test\"test\"\n test", getenv('TEST'));
232+
$this->assertSame("test\ntest", getenv('TEST_ND'));
233+
$this->assertSame("test\ntest", getenv('TEST_NS'));
234+
232235
$this->assertSame('https://vision.googleapis.com/v1/images:annotate?key=', getenv('TEST_EQD'));
233236
$this->assertSame('https://vision.googleapis.com/v1/images:annotate?key=', getenv('TEST_EQS'));
234237
}

tests/Dotenv/LinesTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public function testProcessQuotes()
3030

3131
$expected = [
3232
"TEST=\"test\n test\\\"test\\\"\n test\"",
33+
"TEST_ND=\"test\\ntest\"",
34+
'TEST_NS=\'test\\ntest\'',
3335
'TEST_EQD="https://vision.googleapis.com/v1/images:annotate?key="',
3436
'TEST_EQS=\'https://vision.googleapis.com/v1/images:annotate?key=\'',
3537
];

tests/Dotenv/ParserTest.php

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,35 @@ public function testQuotesParse()
1515
$this->assertSame(['FOO', "BAR \n"], Parser::parse("FOO=\"BAR \n\""));
1616
}
1717

18+
public function testNewlineParse()
19+
{
20+
$this->assertSame(['FOO', "\n"], Parser::parse('FOO="\n"'));
21+
}
22+
23+
public function testTabParse()
24+
{
25+
$this->assertSame(['FOO', "\t"], Parser::parse('FOO=\'\t\''));
26+
}
27+
28+
public function testNonEscapeParse1()
29+
{
30+
$this->assertSame(['FOO', '\n\v'], Parser::parse('FOO=\n\v'));
31+
}
32+
33+
public function testNonEscapeParse2()
34+
{
35+
$this->assertSame(['FOO', '\q'], Parser::parse('FOO=\q'));
36+
}
37+
38+
/**
39+
* @expectedException \Dotenv\Exception\InvalidFileException
40+
* @expectedExceptionMessage Failed to parse dotenv file due to an unexpected escape sequence. Failed at ["\q"].
41+
*/
42+
public function testBadEscapeParse()
43+
{
44+
Parser::parse('FOO="\q"');
45+
}
46+
1847
public function testWhitespaceParse()
1948
{
2049
$this->assertSame(['FOO', "\n"], Parser::parse("FOO=\"\n\""));
@@ -62,19 +91,19 @@ public function testParseInvalidName()
6291

6392
/**
6493
* @expectedException \Dotenv\Exception\InvalidFileException
65-
* @expectedExceptionMessage Failed to parse dotenv file due to an unexpected escape sequence. Failed at ["iiiiviiiixiiiiviiii\n"].
94+
* @expectedExceptionMessage Failed to parse dotenv file due to an unexpected escape sequence. Failed at ["iiiiviiiixiiiiviiii\a"].
6695
*/
6796
public function testParserEscapingDouble()
6897
{
69-
Parser::parse('FOO_BAD="iiiiviiiixiiiiviiii\\n"');
98+
Parser::parse('FOO_BAD="iiiiviiiixiiiiviiii\\a"');
7099
}
71100

72101
/**
73102
* @expectedException \Dotenv\Exception\InvalidFileException
74-
* @expectedExceptionMessage Failed to parse dotenv file due to an unexpected escape sequence. Failed at ['iiiiviiiixiiiiviiii\n'].
103+
* @expectedExceptionMessage Failed to parse dotenv file due to an unexpected escape sequence. Failed at ['iiiiviiiixiiiiviiii\a'].
75104
*/
76105
public function testParserEscapingSingle()
77106
{
78-
Parser::parse('FOO_BAD=\'iiiiviiiixiiiiviiii\\n\'');
107+
Parser::parse('FOO_BAD=\'iiiiviiiixiiiiviiii\\a\'');
79108
}
80109
}

tests/fixtures/env/multiline.env

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,8 @@ TEST="test
22
test\"test\"
33
test"
44

5+
TEST_ND="test\ntest"
6+
TEST_NS='test\ntest'
7+
58
TEST_EQD="https://vision.googleapis.com/v1/images:annotate?key="
69
TEST_EQS='https://vision.googleapis.com/v1/images:annotate?key='

0 commit comments

Comments
 (0)