Use content length check for requests split into multiple messages

This commit is contained in:
Marcel Pociot 2019-02-27 15:24:00 +01:00
parent 53691ce8a5
commit 15e6b6ae96
1 changed files with 47 additions and 14 deletions

View File

@ -9,6 +9,7 @@ use GuzzleHttp\Psr7\Response;
use Ratchet\ConnectionInterface; use Ratchet\ConnectionInterface;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use GuzzleHttp\Psr7\ServerRequest; use GuzzleHttp\Psr7\ServerRequest;
use Illuminate\Support\Collection;
use Ratchet\Http\HttpServerInterface; use Ratchet\Http\HttpServerInterface;
use Psr\Http\Message\RequestInterface; use Psr\Http\Message\RequestInterface;
use BeyondCode\LaravelWebSockets\Apps\App; use BeyondCode\LaravelWebSockets\Apps\App;
@ -19,6 +20,15 @@ use BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManager;
abstract class Controller implements HttpServerInterface abstract class Controller implements HttpServerInterface
{ {
/** @var string */
protected $requestBuffer = '';
/** @var RequestInterface */
protected $request;
/** @var int */
protected $contentLength;
/** @var \BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManager */ /** @var \BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManager */
protected $channelManager; protected $channelManager;
@ -29,13 +39,39 @@ abstract class Controller implements HttpServerInterface
public function onOpen(ConnectionInterface $connection, RequestInterface $request = null) public function onOpen(ConnectionInterface $connection, RequestInterface $request = null)
{ {
$this->request = $request;
$this->contentLength = $this->findContentLength($request->getHeaders());
$this->requestBuffer = (string)$request->getBody();
$this->checkContentLength($connection);
}
protected function findContentLength(array $headers): int
{
return Collection::make($headers)->first(function ($values, $header) {
return strtolower($header) === 'content-length';
});
}
public function onMessage(ConnectionInterface $from, $msg)
{
$this->requestBuffer .= $msg;
$this->checkContentLength();
}
protected function checkContentLength(ConnectionInterface $connection)
{
if (strlen($this->requestBuffer) === $this->contentLength) {
$serverRequest = (new ServerRequest( $serverRequest = (new ServerRequest(
$request->getMethod(), $this->request->getMethod(),
$request->getUri(), $this->request->getUri(),
$request->getHeaders(), $this->request->getHeaders(),
$request->getBody(), $this->requestBuffer,
$request->getProtocolVersion() $this->request->getProtocolVersion()
))->withQueryParams(QueryParameters::create($request)->all()); ))->withQueryParams(QueryParameters::create($this->request)->all());
$laravelRequest = Request::createFromBase((new HttpFoundationFactory)->createRequest($serverRequest)); $laravelRequest = Request::createFromBase((new HttpFoundationFactory)->createRequest($serverRequest));
@ -48,9 +84,6 @@ abstract class Controller implements HttpServerInterface
$connection->send(JsonResponse::create($response)); $connection->send(JsonResponse::create($response));
$connection->close(); $connection->close();
} }
public function onMessage(ConnectionInterface $from, $msg)
{
} }
public function onClose(ConnectionInterface $connection) public function onClose(ConnectionInterface $connection)