diff --git a/src/Messaging/MessageBuffer.php b/src/Messaging/MessageBuffer.php index 07ff4f1..22f247c 100644 --- a/src/Messaging/MessageBuffer.php +++ b/src/Messaging/MessageBuffer.php @@ -98,13 +98,15 @@ class MessageBuffer { if ($this->messageBuffer->isCoalesced()) { $msgCheck = $this->checkMessage($this->messageBuffer); + + $msgBuffer = $this->messageBuffer; + $this->messageBuffer = null; + if (true !== $msgCheck) { $onControl($this->newCloseFrame($msgCheck, 'Ratchet detected an invalid UTF-8 payload')); } else { - $onMessage($this->messageBuffer); + $onMessage($msgBuffer); } - - $this->messageBuffer = null; } return $overflow; diff --git a/tests/unit/Messaging/MessageBufferTest.php b/tests/unit/Messaging/MessageBufferTest.php index c33ff0c..567afa2 100644 --- a/tests/unit/Messaging/MessageBufferTest.php +++ b/tests/unit/Messaging/MessageBufferTest.php @@ -6,6 +6,7 @@ use Ratchet\RFC6455\Messaging\CloseFrameChecker; use Ratchet\RFC6455\Messaging\Frame; use Ratchet\RFC6455\Messaging\Message; use Ratchet\RFC6455\Messaging\MessageBuffer; +use React\EventLoop\Factory; class MessageBufferTest extends \PHPUnit_Framework_TestCase { @@ -36,4 +37,36 @@ class MessageBufferTest extends \PHPUnit_Framework_TestCase $this->assertEquals(1000, $messageCount); } + + public function testProcessingMessagesAsynchronouslyWhileBlockingInMessageHandler() { + $loop = Factory::create(); + + $frameA = new Frame('a', true, Frame::OP_TEXT); + $frameB = new Frame('b', true, Frame::OP_TEXT); + + $bReceived = false; + + $messageBuffer = new MessageBuffer( + new CloseFrameChecker(), + function (Message $message) use (&$messageCount, &$bReceived, $loop) { + $payload = $message->getPayload(); + $bReceived = $payload === 'b'; + + if (!$bReceived) { + $loop->run(); + } + }, + null, + false + ); + + $loop->addPeriodicTimer(0.1, function () use ($messageBuffer, $frameB, $loop) { + $loop->stop(); + $messageBuffer->onData($frameB->getContents()); + }); + + $messageBuffer->onData($frameA->getContents()); + + $this->assertTrue($bReceived); + } } \ No newline at end of file