From 5bee6fe56c2e8d1fc22b5188d49b6a2500df065f Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 17 Dec 2014 10:46:48 +0000 Subject: [PATCH] Fix syslog transport to follow the spec closer, fixes #476 --- src/Monolog/Handler/SyslogUdp/UdpSocket.php | 26 ++++---------------- tests/Monolog/Handler/UdpSocketTest.php | 27 ++++++--------------- 2 files changed, 13 insertions(+), 40 deletions(-) diff --git a/src/Monolog/Handler/SyslogUdp/UdpSocket.php b/src/Monolog/Handler/SyslogUdp/UdpSocket.php index d87ab9d3..dcf3f1f9 100644 --- a/src/Monolog/Handler/SyslogUdp/UdpSocket.php +++ b/src/Monolog/Handler/SyslogUdp/UdpSocket.php @@ -13,7 +13,7 @@ namespace Monolog\Handler\SyslogUdp; class UdpSocket { - const DATAGRAM_MAX_LENGTH = 2048; + const DATAGRAM_MAX_LENGTH = 65023; public function __construct($ip, $port = 514) { @@ -24,11 +24,7 @@ class UdpSocket public function write($line, $header = "") { - $remaining = $line; - while (!is_null($remaining)) { - list($chunk, $remaining) = $this->splitLineIfNessesary($remaining, $header); - $this->send($chunk); - } + $this->send($this->assembleMessage($line, $header)); } public function close() @@ -41,22 +37,10 @@ class UdpSocket socket_sendto($this->socket, $chunk, strlen($chunk), $flags = 0, $this->ip, $this->port); } - protected function splitLineIfNessesary($line, $header) + protected function assembleMessage($line, $header) { - if ($this->shouldSplitLine($line, $header)) { - $chunkSize = self::DATAGRAM_MAX_LENGTH - strlen($header); - $chunk = $header . substr($line, 0, $chunkSize); - $remaining = substr($line, $chunkSize); - } else { - $chunk = $header . $line; - $remaining = null; - } + $chunkSize = self::DATAGRAM_MAX_LENGTH - strlen($header); - return array($chunk, $remaining); - } - - protected function shouldSplitLine($remaining, $header) - { - return strlen($header.$remaining) > self::DATAGRAM_MAX_LENGTH; + return $header . substr($line, 0, $chunkSize); } } diff --git a/tests/Monolog/Handler/UdpSocketTest.php b/tests/Monolog/Handler/UdpSocketTest.php index b251974e..bcaf52b3 100644 --- a/tests/Monolog/Handler/UdpSocketTest.php +++ b/tests/Monolog/Handler/UdpSocketTest.php @@ -18,7 +18,7 @@ use Monolog\TestCase; */ class UdpSocketTest extends TestCase { - public function testWeDoNotSplitShortMessages() + public function testWeDoNotTruncateShortMessages() { $socket = $this->getMock('\Monolog\Handler\SyslogUdp\UdpSocket', array('send'), array('lol', 'lol')); @@ -29,29 +29,18 @@ class UdpSocketTest extends TestCase $socket->write("The quick brown fox jumps over the lazy dog", "HEADER: "); } - public function testWeSplitLongMessages() + public function testLongMessagesAreTruncated() { $socket = $this->getMock('\Monolog\Handler\SyslogUdp\UdpSocket', array('send'), array('lol', 'lol')); - $socket->expects($this->at(1)) + $truncatedString = str_repeat("derp", 16254).'d'; + + $socket->expects($this->exactly(1)) ->method('send') - ->with("The quick brown fox jumps over the lazy dog"); + ->with("HEADER" . $truncatedString); - $aStringOfLength2048 = str_repeat("derp", 2048/4); + $longString = str_repeat("derp", 20000); - $socket->write($aStringOfLength2048."The quick brown fox jumps over the lazy dog"); - } - - public function testAllSplitMessagesHasAHeader() - { - $socket = $this->getMock('\Monolog\Handler\SyslogUdp\UdpSocket', array('send'), array('lol', 'lol')); - - $socket->expects($this->exactly(5)) - ->method('send') - ->with($this->stringStartsWith("HEADER")); - - $aStringOfLength8192 = str_repeat("derp", 2048); - - $socket->write($aStringOfLength8192, "HEADER"); + $socket->write($longString, "HEADER"); } }