Skip to content

Commit 3e53c2f

Browse files
committed
Only match command output end in last line (fixes #3)
Also make preceding linefeed optional
1 parent 083a962 commit 3e53c2f

2 files changed

Lines changed: 40 additions & 4 deletions

File tree

src/Protocol/Parser.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ class Parser
1111
const EOL = "\r\n";
1212
const LEOL = 2;
1313

14-
const COMMAND_END = "\n--END COMMAND--";
15-
const LCOMMAND_END = 16;
14+
const COMMAND_END = "--END COMMAND--";
15+
const LCOMMAND_END = 15;
1616

1717
private $buffer = '';
1818
private $gotInitial = false;
@@ -40,9 +40,13 @@ public function push($chunk)
4040

4141
private function parseMessage($message)
4242
{
43+
$lines = explode(self::EOL, $message);
44+
$last = count($lines) - 1;
4345
$parts = array();
44-
foreach (explode(self::EOL, $message) as $line) {
45-
if (substr($line, -self::LCOMMAND_END) === self::COMMAND_END) {
46+
47+
foreach ($lines as $i => $line) {
48+
$pos = strlen($line) - self::LCOMMAND_END - 1;
49+
if ($i === $last && substr($line, -self::LCOMMAND_END) === self::COMMAND_END && ($pos < 0 || $line[$pos] === "\n")) {
4650
$key = '_';
4751
$value = $line;
4852
} else {

tests/Protocol/ParserTest.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,38 @@ public function testParsingCommandResponse()
5050
$this->assertEquals("Testing: yes\nAnother Line\n--END COMMAND--", $first->getPart('_'));
5151
}
5252

53+
public function testParsingCommandResponseEmpty()
54+
{
55+
$parser = new Parser();
56+
$this->assertEquals(array(), $parser->push("Asterisk Call Manager/1.3\r\n"));
57+
58+
$ret = $parser->push("Response: Follows\r\n--END COMMAND--\r\n\r\n");
59+
$this->assertCount(1, $ret);
60+
61+
$first = reset($ret);
62+
/* @var $first Clue\React\Ami\Protocol\Response */
63+
64+
$this->assertInstanceOf('Clue\React\Ami\Protocol\Response', $first);
65+
$this->assertEquals('Follows', $first->getPart('Response'));
66+
$this->assertEquals("--END COMMAND--", $first->getPart('_'));
67+
}
68+
69+
public function testParsingResponseIsNotCommandResponse()
70+
{
71+
$parser = new Parser();
72+
$this->assertEquals(array(), $parser->push("Asterisk Call Manager/1.3\r\n"));
73+
74+
$ret = $parser->push("Response: Success\r\nMessage: Some message--END COMMAND--\r\n\r\n");
75+
$this->assertCount(1, $ret);
76+
77+
$first = reset($ret);
78+
/* @var $first Clue\React\Ami\Protocol\Response */
79+
80+
$this->assertInstanceOf('Clue\React\Ami\Protocol\Response', $first);
81+
$this->assertEquals('Success', $first->getPart('Response'));
82+
$this->assertEquals('Some message--END COMMAND--', $first->getPart('Message'));
83+
}
84+
5385
/**
5486
* @expectedException UnexpectedValueException
5587
*/

0 commit comments

Comments
 (0)