Skip to content

Commit 22165d0

Browse files
Fixed parsing regressions (#339)
1 parent 84f6081 commit 22165d0

File tree

5 files changed

+26
-4
lines changed

5 files changed

+26
-4
lines changed

src/Parser.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ private static function parseValue($value)
108108
return array_reduce(str_split($value), function ($data, $char) use ($value) {
109109
switch ($data[1]) {
110110
case self::INITIAL_STATE:
111-
if ($char === '"') {
111+
if ($char === '"' || $char === '\'') {
112112
return [$data[0], self::QUOTED_STATE];
113113
} elseif ($char === '#') {
114114
return [$data[0], self::COMMENT_STATE];
@@ -124,15 +124,15 @@ private static function parseValue($value)
124124
return [$data[0].$char, self::UNQUOTED_STATE];
125125
}
126126
case self::QUOTED_STATE:
127-
if ($char === '"') {
127+
if ($char === $value[0]) {
128128
return [$data[0], self::WHITESPACE_STATE];
129129
} elseif ($char === '\\') {
130130
return [$data[0], self::ESCAPE_STATE];
131131
} else {
132132
return [$data[0].$char, self::QUOTED_STATE];
133133
}
134134
case self::ESCAPE_STATE:
135-
if ($char === '"' || $char === '\\') {
135+
if ($char === $value[0] || $char === '\\') {
136136
return [$data[0].$char, self::QUOTED_STATE];
137137
} else {
138138
throw new InvalidFileException(

tests/Dotenv/DotenvTest.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,13 @@ public function testQuotedDotenvLoadsEnvironmentVars()
8484
$this->assertSame('baz', getenv('QBAR'));
8585
$this->assertSame('with spaces', getenv('QSPACED'));
8686
$this->assertEmpty(getenv('QNULL'));
87+
8788
$this->assertSame('pgsql:host=localhost;dbname=test', getenv('QEQUALS'));
8889
$this->assertSame('test some escaped characters like a quote (") or maybe a backslash (\\)', getenv('QESCAPED'));
8990
$this->assertSame('iiiiviiiixiiiiviiii\\n', getenv('QSLASH'));
91+
92+
$this->assertSame('test some escaped characters like a quote (\') or maybe a backslash (\\)', getenv('SQESCAPED'));
93+
$this->assertSame('iiiiviiiixiiiiviiii\\n', getenv('SQSLASH'));
9094
}
9195

9296
public function testLargeDotenvLoadsEnvironmentVars()
@@ -274,6 +278,9 @@ public function testDotenvAllowsSpecialCharacters()
274278
$this->assertSame('jdgEB4{QgEC]HL))&GcXxokB+wqoN+j>xkV7K?m$r', getenv('SPVAR3'));
275279
$this->assertSame('22222:22#2^{', getenv('SPVAR4'));
276280
$this->assertSame('test some escaped characters like a quote " or maybe a backslash \\', getenv('SPVAR5'));
281+
$this->assertSame('secret!@', getenv('SPVAR6'));
282+
$this->assertSame('secret!@#', getenv('SPVAR7'));
283+
$this->assertSame('secret!@#', getenv('SPVAR8'));
277284
}
278285

279286
public function testMutlilineLoading()

tests/Dotenv/ParserTest.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,17 @@ public function testParseInvalidName()
6464
* @expectedException \Dotenv\Exception\InvalidFileException
6565
* @expectedExceptionMessage Failed to parse dotenv file due to an unexpected escape sequence. Failed at ["iiiiviiiixiiiiviiii\n"].
6666
*/
67-
public function testParserEscaping()
67+
public function testParserEscapingDouble()
6868
{
6969
Parser::parse('FOO_BAD="iiiiviiiixiiiiviiii\\n"');
7070
}
71+
72+
/**
73+
* @expectedException \Dotenv\Exception\InvalidFileException
74+
* @expectedExceptionMessage Failed to parse dotenv file due to an unexpected escape sequence. Failed at ['iiiiviiiixiiiiviiii\n'].
75+
*/
76+
public function testParserEscapingSingle()
77+
{
78+
Parser::parse('FOO_BAD=\'iiiiviiiixiiiiviiii\\n\'');
79+
}
7180
}

tests/fixtures/env/quoted.env

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,6 @@ QWHITESPACE = "no space"
88

99
QESCAPED="test some escaped characters like a quote (\") or maybe a backslash (\\)"
1010
QSLASH="iiiiviiiixiiiiviiii\\n"
11+
12+
SQESCAPED='test some escaped characters like a quote (\') or maybe a backslash (\\)'
13+
SQSLASH='iiiiviiiixiiiiviiii\\n'

tests/fixtures/env/specialchars.env

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,6 @@ SPVAR2="?BUty3koaV3%GA*hMAwH}B"
33
SPVAR3="jdgEB4{QgEC]HL))&GcXxokB+wqoN+j>xkV7K?m$r"
44
SPVAR4="22222:22#2^{"
55
SPVAR5="test some escaped characters like a quote \" or maybe a backslash \\" # not escaped
6+
SPVAR6=secret!@#
7+
SPVAR7='secret!@#'
8+
SPVAR8="secret!@#"

0 commit comments

Comments
 (0)