diff --git a/src/RequestParser.php b/src/RequestParser.php index 2a5c2873..3de260a6 100644 --- a/src/RequestParser.php +++ b/src/RequestParser.php @@ -9,7 +9,7 @@ * @event headers * @event error */ -class RequestParser extends EventEmitter +class RequestParser extends EventEmitter implements RequestParserInterface { private $buffer = ''; private $maxSize = 4096; diff --git a/src/RequestParserFactory.php b/src/RequestParserFactory.php new file mode 100644 index 00000000..baafdabb --- /dev/null +++ b/src/RequestParserFactory.php @@ -0,0 +1,12 @@ +io = $io; - $this->io->on('connection', function (ConnectionInterface $conn) { + $this->io->on('connection', function (ConnectionInterface $conn) use ($parserFactory) { // TODO: http 1.1 keep-alive // TODO: chunked transfer encoding (also for outgoing data) - $parser = new RequestParser(); + $parserFactory = $parserFactory ?: new RequestParserFactory(); + $parser = $parserFactory->create(); $parser->on('headers', function (Request $request, $bodyBuffer) use ($conn, $parser) { // attach remote ip to the request as metadata $request->remoteAddress = $conn->getRemoteAddress(); diff --git a/tests/ServerTest.php b/tests/ServerTest.php index 4d4f1c74..570c7255 100644 --- a/tests/ServerTest.php +++ b/tests/ServerTest.php @@ -66,6 +66,24 @@ public function testResponseContainsPoweredByHeader() $this->assertContains("\r\nX-Powered-By: React/alpha\r\n", $conn->getData()); } + public function testServerUsesProvidedRequestParserFactory() + { + $io = new ServerStub(); + + /** @var \React\Http\RequestParser|\PHPUnit_Framework_MockObject_MockObject $parser */ + $parser = $this->getMockBuilder('React\Http\RequestParser')->getMock(); + $parser->expects($this->once())->method('on'); + + /** @var \React\Http\RequestParserFactory | \PHPUnit_Framework_MockObject_MockObject $parserFactory */ + $parserFactory = $this->getMockBuilder('React\Http\RequestParserFactory')->getMock(); + $parserFactory->expects($this->once())->method('create')->willReturn($parser); + + new Server($io, $parserFactory); + + $conn = new ConnectionStub(); + $io->emit('connection', array($conn)); + } + private function createGetRequest() { $data = "GET / HTTP/1.1\r\n";