This commit is contained in:
Marcel Pociot
2020-04-29 22:05:03 +02:00
parent 6cf206e0a2
commit b515a55325
27 changed files with 215 additions and 253 deletions

View File

@@ -0,0 +1,24 @@
<?php
namespace App\Http\Controllers\Concerns;
use Twig\Environment;
use Twig\Loader\ArrayLoader;
use function GuzzleHttp\Psr7\stream_for;
trait LoadsViews
{
protected function getView(string $view, array $data = [])
{
$templatePath = implode(DIRECTORY_SEPARATOR, explode('.', $view));
$twig = new Environment(
new ArrayLoader([
'app' => file_get_contents(base_path('resources/views/server/layouts/app.twig')),
'template' => file_get_contents(base_path('resources/views/'.$templatePath.'.twig')),
])
);
return stream_for($twig->render('template', $data));
}
}

View File

@@ -1,45 +1,16 @@
<?php
namespace App\Http\Controllers;
namespace App\Http\Controllers\Concerns;
use App\Http\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;
use function GuzzleHttp\Psr7\parse_request;
abstract class PostController extends Controller
trait ParsesIncomingRequest
{
protected $keepConnectionOpen = false;
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)
{
if (! isset($from->requestBuffer)) {
$request = parse_request($msg);
$from->contentLength = $this->findContentLength($request->getHeaders());
$from->request = $request;
$from->requestBuffer = (string) $request->getBody();
} else {
$from->requestBuffer .= $msg;
}
$this->checkContentLength($from);
}
protected function findContentLength(array $headers): int
{
return Collection::make($headers)->first(function ($values, $header) {
@@ -47,14 +18,21 @@ abstract class PostController extends Controller
})[0] ?? 0;
}
protected function shouldHandleRequest(Request $request, ConnectionInterface $httpConnection): bool
{
return true;
}
protected function checkContentLength(ConnectionInterface $connection)
{
if (strlen($connection->requestBuffer) === $connection->contentLength) {
$laravelRequest = $this->createLaravelRequest($connection);
$this->handle($laravelRequest, $connection);
if ($this->shouldHandleRequest($laravelRequest, $connection)) {
$this->handle($laravelRequest, $connection);
}
if (! $this->keepConnectionOpen) {
if (!$this->keepConnectionOpen) {
$connection->close();
}
@@ -64,8 +42,6 @@ abstract class PostController extends Controller
}
}
abstract public function handle(Request $request, ConnectionInterface $httpConnection);
protected function createLaravelRequest(ConnectionInterface $connection): Request
{
try {

View File

@@ -2,15 +2,30 @@
namespace App\Http\Controllers;
use Exception;
use App\Http\Controllers\Concerns\LoadsViews;
use App\Http\Controllers\Concerns\ParsesIncomingRequest;
use Illuminate\Http\Request;
use Psr\Http\Message\RequestInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Http\HttpServerInterface;
use Twig\Environment;
use Twig\Loader\ArrayLoader;
use function GuzzleHttp\Psr7\stream_for;
abstract class Controller implements HttpServerInterface
{
use LoadsViews, ParsesIncomingRequest;
protected $keepConnectionOpen = false;
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 onClose(ConnectionInterface $connection)
{
unset($connection->requestBuffer);
@@ -18,25 +33,24 @@ abstract class Controller implements HttpServerInterface
unset($connection->request);
}
public function onError(ConnectionInterface $connection, Exception $e)
{
}
public function onMessage(ConnectionInterface $from, $msg)
{
if (! isset($from->requestBuffer)) {
$request = parse_request($msg);
$from->contentLength = $this->findContentLength($request->getHeaders());
$from->request = $request;
$from->requestBuffer = (string) $request->getBody();
} else {
$from->requestBuffer .= $msg;
}
$this->checkContentLength($from);
}
protected function getView(string $view, array $data = [])
function onError(ConnectionInterface $conn, \Exception $e)
{
$templatePath = implode(DIRECTORY_SEPARATOR, explode('.', $view));
$twig = new Environment(
new ArrayLoader([
'app' => file_get_contents(base_path('resources/views/server/layouts/app.twig')),
'template' => file_get_contents(base_path('resources/views/'.$templatePath.'.twig')),
])
);
return stream_for($twig->render('template', $data));
//
}
abstract public function handle(Request $request, ConnectionInterface $httpConnection);
}