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 Illuminate\Http\JsonResponse;
use GuzzleHttp\Psr7\ServerRequest;
use Illuminate\Support\Collection;
use Ratchet\Http\HttpServerInterface;
use Psr\Http\Message\RequestInterface;
use BeyondCode\LaravelWebSockets\Apps\App;
@ -19,6 +20,15 @@ use BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManager;
abstract class Controller implements HttpServerInterface
{
/** @var string */
protected $requestBuffer = '';
/** @var RequestInterface */
protected $request;
/** @var int */
protected $contentLength;
/** @var \BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManager */
protected $channelManager;
@ -29,13 +39,39 @@ abstract class Controller implements HttpServerInterface
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(
$request->getMethod(),
$request->getUri(),
$request->getHeaders(),
$request->getBody(),
$request->getProtocolVersion()
))->withQueryParams(QueryParameters::create($request)->all());
$this->request->getMethod(),
$this->request->getUri(),
$this->request->getHeaders(),
$this->requestBuffer,
$this->request->getProtocolVersion()
))->withQueryParams(QueryParameters::create($this->request)->all());
$laravelRequest = Request::createFromBase((new HttpFoundationFactory)->createRequest($serverRequest));
@ -48,9 +84,6 @@ abstract class Controller implements HttpServerInterface
$connection->send(JsonResponse::create($response));
$connection->close();
}
public function onMessage(ConnectionInterface $from, $msg)
{
}
public function onClose(ConnectionInterface $connection)