Files
expose/app/HttpServer/Controllers/PostController.php
Marcel Pociot 2778d5a489 wip
2020-04-16 15:30:53 +02:00

70 lines
2.2 KiB
PHP

<?php
namespace App\HttpServer\Controllers;
use App\HttpServer\QueryParameters;
use GuzzleHttp\Psr7\ServerRequest;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Psr\Http\Message\RequestInterface;
use Ratchet\ConnectionInterface;
use Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory;
abstract class PostController extends Controller
{
public function onOpen(ConnectionInterface $connection, RequestInterface $request = null)
{
$connection->contentLength = $this->findContentLength($request->getHeaders());
$connection->requestBuffer = (string) $request->getBody();
$connection->request = $request;
$this->checkContentLength($connection);
}
public function onMessage(ConnectionInterface $from, $msg)
{
$from->requestBuffer .= $msg;
$this->checkContentLength($from);
}
protected function findContentLength(array $headers): int
{
return Collection::make($headers)->first(function ($values, $header) {
return strtolower($header) === 'content-length';
})[0] ?? 0;
}
protected function checkContentLength(ConnectionInterface $connection)
{
if (strlen($connection->requestBuffer) === $connection->contentLength) {
$laravelRequest = $this->createLaravelRequest($connection);
$this->handle($laravelRequest);
$connection->close();
unset($connection->requestBuffer);
unset($connection->contentLength);
unset($connection->request);
}
}
abstract public function handle(Request $request);
protected function createLaravelRequest(ConnectionInterface $connection): Request
{
$serverRequest = (new ServerRequest(
$connection->request->getMethod(),
$connection->request->getUri(),
$connection->request->getHeaders(),
$connection->requestBuffer,
$connection->request->getProtocolVersion()
))->withQueryParams(QueryParameters::create($connection->request)->all());
return Request::createFromBase((new HttpFoundationFactory)->createRequest($serverRequest));
}
}