Skip to content

Commit 8b367b2

Browse files
authored
Merge pull request #53 from clue-labs/parse-newlines
Support parsing messages with multiple newlines between messages
2 parents ddba267 + 39b25a9 commit 8b367b2

2 files changed

Lines changed: 20 additions & 2 deletions

File tree

src/Protocol/Parser.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,18 @@ public function push($chunk)
3232
$message = substr($this->buffer, 0, $pos);
3333
$this->buffer = (string)substr($this->buffer, $pos + self::LEOM);
3434

35-
$messages []= $this->parseMessage($message);
35+
$parsed = $this->parseMessage($message);
36+
if ($parsed->getFields()) {
37+
$messages []= $parsed;
38+
}
3639
}
3740

3841
return $messages;
3942
}
4043

4144
private function parseMessage($message)
4245
{
43-
$lines = explode(self::EOL, $message);
46+
$lines = array_filter(explode(self::EOL, $message));
4447
$last = count($lines) - 1;
4548
$fields = array();
4649

tests/Protocol/ParserTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,4 +156,19 @@ public function testParsingMissingSpaceEmptyValue()
156156
$this->assertInstanceOf('Clue\React\Ami\Protocol\Response', $first);
157157
$this->assertEquals('', $first->getFieldValue('Response'));
158158
}
159+
160+
public function testParsingExcessiveNewlines()
161+
{
162+
$parser = new Parser();
163+
$this->assertEquals(array(), $parser->push("Asterisk Call Manager/1.3\r\n"));
164+
165+
$ret = $parser->push("First: 1\r\n\r\nSecond: 2\r\n\r\n\r\nThird: 3\r\n\r\n\r\n\r\nFourth: 4\r\n\r\n");
166+
$this->assertCount(4, $ret);
167+
168+
$last = $ret[count($ret) - 1];
169+
/* @var $last \Clue\React\Ami\Protocol\Response */
170+
171+
$this->assertInstanceOf('Clue\React\Ami\Protocol\Response', $last);
172+
$this->assertEquals('4', $last->getFieldValue('Fourth'));
173+
}
159174
}

0 commit comments

Comments
 (0)