diff --git a/src/Server.php b/src/Server.php index e1abfd8e..49535060 100644 --- a/src/Server.php +++ b/src/Server.php @@ -42,7 +42,13 @@ public function __construct(SocketServerInterface $io) }); }); - $conn->on('data', array($parser, 'feed')); + $listener = [$parser, 'feed']; + $conn->on('data', $listener); + $parser->on('error', function() use ($conn, $listener) { + // TODO: return 400 response + $conn->removeListener('data', $listener); + $this->emit('error', func_get_args()); + }); }); } diff --git a/tests/ServerTest.php b/tests/ServerTest.php index 65c13ccb..552b562f 100644 --- a/tests/ServerTest.php +++ b/tests/ServerTest.php @@ -2,6 +2,7 @@ namespace React\Tests\Http; +use React\Http\RequestHeaderParser; use React\Http\Server; class ServerTest extends TestCase @@ -66,6 +67,28 @@ public function testResponseContainsPoweredByHeader() $this->assertContains("\r\nX-Powered-By: React/alpha\r\n", $conn->getData()); } + public function testParserErrorEmitted() + { + $io = new ServerStub(); + + $error = null; + $server = new Server($io); + $server->on('headers', $this->expectCallableNever()); + $server->on('error', function ($message) use (&$error) { + $error = $message; + }); + + $conn = new ConnectionStub(); + $io->emit('connection', [$conn]); + + $data = $this->createGetRequest(); + $data = str_pad($data, 4096 * 4); + $conn->emit('data', [$data]); + + $this->assertInstanceOf('OverflowException', $error); + $this->assertEquals('', $conn->getData()); + } + private function createGetRequest() { $data = "GET / HTTP/1.1\r\n";