Merge branch 'router-race-fix'

This commit is contained in:
Chris Boden 2017-12-11 19:37:52 -05:00
commit 5dbbbbeb75
3 changed files with 46 additions and 3 deletions

View File

@ -0,0 +1,18 @@
<?php
namespace Ratchet\Http;
use Ratchet\ConnectionInterface;
use Psr\Http\Message\RequestInterface;
class NoOpHttpServerController implements HttpServerInterface {
public function onOpen(ConnectionInterface $conn, RequestInterface $request = null) {
}
public function onMessage(ConnectionInterface $from, $msg) {
}
public function onClose(ConnectionInterface $conn) {
}
public function onError(ConnectionInterface $conn, \Exception $e) {
}
}

View File

@ -15,8 +15,11 @@ class Router implements HttpServerInterface {
*/ */
protected $_matcher; protected $_matcher;
private $_noopController;
public function __construct(UrlMatcherInterface $matcher) { public function __construct(UrlMatcherInterface $matcher) {
$this->_matcher = $matcher; $this->_matcher = $matcher;
$this->_noopController = new NoOpHttpServerController;
} }
/** /**
@ -28,6 +31,8 @@ class Router implements HttpServerInterface {
throw new \UnexpectedValueException('$request can not be null'); throw new \UnexpectedValueException('$request can not be null');
} }
$conn->controller = $this->_noopController;
$uri = $request->getUri(); $uri = $request->getUri();
$context = $this->_matcher->getContext(); $context = $this->_matcher->getContext();
@ -67,14 +72,14 @@ class Router implements HttpServerInterface {
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
function onMessage(ConnectionInterface $from, $msg) { public function onMessage(ConnectionInterface $from, $msg) {
$from->controller->onMessage($from, $msg); $from->controller->onMessage($from, $msg);
} }
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
function onClose(ConnectionInterface $conn) { public function onClose(ConnectionInterface $conn) {
if (isset($conn->controller)) { if (isset($conn->controller)) {
$conn->controller->onClose($conn); $conn->controller->onClose($conn);
} }
@ -83,7 +88,7 @@ class Router implements HttpServerInterface {
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
function onError(ConnectionInterface $conn, \Exception $e) { public function onError(ConnectionInterface $conn, \Exception $e) {
if (isset($conn->controller)) { if (isset($conn->controller)) {
$conn->controller->onError($conn, $e); $conn->controller->onError($conn, $e);
} }

View File

@ -3,6 +3,10 @@ namespace Ratchet\Http;
use Ratchet\WebSocket\WsServerInterface; use Ratchet\WebSocket\WsServerInterface;
use Symfony\Component\Routing\Exception\ResourceNotFoundException; use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Routing\Matcher\UrlMatcherInterface; use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Matcher\UrlMatcher;
/** /**
* @covers Ratchet\Http\Router * @covers Ratchet\Http\Router
@ -142,4 +146,20 @@ class RouterTest extends \PHPUnit_Framework_TestCase {
$this->assertEquals('ws', $request->getUri()->getScheme()); $this->assertEquals('ws', $request->getUri()->getScheme());
$this->assertEquals('doesnt.matter', $request->getUri()->getHost()); $this->assertEquals('doesnt.matter', $request->getUri()->getHost());
} }
public function testImpatientClientOverflow() {
$this->_conn->expects($this->once())->method('close');
$header = "GET /nope HTTP/1.1
Upgrade: websocket
Connection: upgrade
Host: localhost
Origin: http://localhost
Sec-WebSocket-Version: 13\r\n\r\n";
$app = new HttpServer(new Router(new UrlMatcher(new RouteCollection, new RequestContext)));
$app->onOpen($this->_conn);
$app->onMessage($this->_conn, $header);
$app->onMessage($this->_conn, 'Silly body');
}
} }