Use content length check for requests split into multiple messages
This commit is contained in:
parent
53691ce8a5
commit
15e6b6ae96
|
|
@ -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,28 +39,51 @@ abstract class Controller implements HttpServerInterface
|
||||||
|
|
||||||
public function onOpen(ConnectionInterface $connection, RequestInterface $request = null)
|
public function onOpen(ConnectionInterface $connection, RequestInterface $request = null)
|
||||||
{
|
{
|
||||||
$serverRequest = (new ServerRequest(
|
$this->request = $request;
|
||||||
$request->getMethod(),
|
|
||||||
$request->getUri(),
|
|
||||||
$request->getHeaders(),
|
|
||||||
$request->getBody(),
|
|
||||||
$request->getProtocolVersion()
|
|
||||||
))->withQueryParams(QueryParameters::create($request)->all());
|
|
||||||
|
|
||||||
$laravelRequest = Request::createFromBase((new HttpFoundationFactory)->createRequest($serverRequest));
|
$this->contentLength = $this->findContentLength($request->getHeaders());
|
||||||
|
|
||||||
$this
|
$this->requestBuffer = (string)$request->getBody();
|
||||||
->ensureValidAppId($laravelRequest->appId)
|
|
||||||
->ensureValidSignature($laravelRequest);
|
|
||||||
|
|
||||||
$response = $this($laravelRequest);
|
$this->checkContentLength($connection);
|
||||||
|
}
|
||||||
|
|
||||||
$connection->send(JsonResponse::create($response));
|
protected function findContentLength(array $headers): int
|
||||||
$connection->close();
|
{
|
||||||
|
return Collection::make($headers)->first(function ($values, $header) {
|
||||||
|
return strtolower($header) === 'content-length';
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public function onMessage(ConnectionInterface $from, $msg)
|
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(
|
||||||
|
$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));
|
||||||
|
|
||||||
|
$this
|
||||||
|
->ensureValidAppId($laravelRequest->appId)
|
||||||
|
->ensureValidSignature($laravelRequest);
|
||||||
|
|
||||||
|
$response = $this($laravelRequest);
|
||||||
|
|
||||||
|
$connection->send(JsonResponse::create($response));
|
||||||
|
$connection->close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function onClose(ConnectionInterface $connection)
|
public function onClose(ConnectionInterface $connection)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue