Skip to content

Commit d1de6c7

Browse files
committed
Merge branch 'command-end'
Conflicts: src/Protocol/Parser.php
2 parents c5531a1 + 3e53c2f commit d1de6c7

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
$fields = 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
@@ -81,6 +81,38 @@ public function testParsingCommandResponse()
8181
$this->assertEquals("Testing: yes\nAnother Line\n--END COMMAND--", $first->getFieldValue('_'));
8282
}
8383

84+
public function testParsingCommandResponseEmpty()
85+
{
86+
$parser = new Parser();
87+
$this->assertEquals(array(), $parser->push("Asterisk Call Manager/1.3\r\n"));
88+
89+
$ret = $parser->push("Response: Follows\r\n--END COMMAND--\r\n\r\n");
90+
$this->assertCount(1, $ret);
91+
92+
$first = reset($ret);
93+
/* @var $first Clue\React\Ami\Protocol\Response */
94+
95+
$this->assertInstanceOf('Clue\React\Ami\Protocol\Response', $first);
96+
$this->assertEquals('Follows', $first->getFieldValue('Response'));
97+
$this->assertEquals("--END COMMAND--", $first->getFieldValue('_'));
98+
}
99+
100+
public function testParsingResponseIsNotCommandResponse()
101+
{
102+
$parser = new Parser();
103+
$this->assertEquals(array(), $parser->push("Asterisk Call Manager/1.3\r\n"));
104+
105+
$ret = $parser->push("Response: Success\r\nMessage: Some message--END COMMAND--\r\n\r\n");
106+
$this->assertCount(1, $ret);
107+
108+
$first = reset($ret);
109+
/* @var $first Clue\React\Ami\Protocol\Response */
110+
111+
$this->assertInstanceOf('Clue\React\Ami\Protocol\Response', $first);
112+
$this->assertEquals('Success', $first->getFieldValue('Response'));
113+
$this->assertEquals('Some message--END COMMAND--', $first->getFieldValue('Message'));
114+
}
115+
84116
/**
85117
* @expectedException UnexpectedValueException
86118
*/

0 commit comments

Comments
 (0)