This commit is contained in:
Marcel Pociot
2020-04-16 15:30:53 +02:00
parent e49708b290
commit 2778d5a489
22 changed files with 960 additions and 206 deletions

View File

@@ -0,0 +1,22 @@
<?php
namespace App\HttpServer\Controllers;
use Illuminate\Http\Request;
use App\Logger\RequestLogger;
class AttachDataToLogController extends PostController
{
public function handle(Request $request)
{
/** @var RequestLogger $requestLogger */
$requestLogger = app(RequestLogger::class);
$loggedRequest = $requestLogger->findLoggedRequest($request->get('request_id', ''));
if (! is_null($loggedRequest)) {
$loggedRequest->setAdditionalData((array)$request->get('data', []));
$requestLogger->pushLogs();
}
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace App\HttpServer\Controllers;
use App\Client\TunnelConnection;
use App\HttpServer\QueryParameters;
use App\Logger\RequestLogger;
use GuzzleHttp\Psr7\Response;
use Ratchet\ConnectionInterface;
use function GuzzleHttp\Psr7\str;
use Psr\Http\Message\RequestInterface;
class ClearLogsController extends Controller
{
public function onOpen(ConnectionInterface $connection, RequestInterface $request = null)
{
/** @var RequestLogger $logger */
$logger = app(RequestLogger::class);
$logger->clear();
$connection->send(
str(new Response(
200,
['Content-Type' => 'application/json'],
''
))
);
$connection->close();
}
}

View File

@@ -2,6 +2,7 @@
namespace App\HttpServer\Controllers;
use App\Client\Client;
use GuzzleHttp\Psr7\Response;
use function GuzzleHttp\Psr7\str;
use Psr\Http\Message\RequestInterface;
@@ -15,10 +16,19 @@ class DashboardController extends Controller
str(new Response(
200,
['Content-Type' => 'text/html'],
file_get_contents(base_path('resources/views/index.html'))
$this->getView()
))
);
$connection->close();
}
protected function getView(): string
{
$view = file_get_contents(base_path('resources/views/index.html'));
$view = str_replace('%subdomains%', implode(' ', Client::$subdomains), $view);
return $view;
}
}

View File

@@ -0,0 +1,69 @@
<?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));
}
}