laravel-websockets/src/HttpApi/Controllers/Controller.php

108 lines
3.3 KiB
PHP
Raw Normal View History

2018-11-20 13:50:37 +00:00
<?php
2018-11-27 15:42:19 +00:00
namespace BeyondCode\LaravelWebSockets\HttpApi\Controllers;
2018-11-20 13:50:37 +00:00
2018-11-24 00:53:20 +00:00
use BeyondCode\LaravelWebSockets\ClientProviders\Client;
2018-11-29 10:59:17 +00:00
use BeyondCode\LaravelWebSockets\Dashboard\DashboardLogger;
2018-11-26 22:15:03 +00:00
use BeyondCode\LaravelWebSockets\Events\ExceptionThrown;
2018-11-25 23:42:45 +00:00
use BeyondCode\LaravelWebSockets\QueryParameters;
2018-11-22 20:36:25 +00:00
use Exception;
2018-11-21 11:13:40 +00:00
use Illuminate\Http\Request;
2018-11-22 20:36:25 +00:00
use GuzzleHttp\Psr7\Response;
2018-11-20 13:50:37 +00:00
use Ratchet\ConnectionInterface;
use Illuminate\Http\JsonResponse;
2018-11-21 11:13:40 +00:00
use GuzzleHttp\Psr7\ServerRequest;
2018-11-20 13:50:37 +00:00
use Ratchet\Http\HttpServerInterface;
use Psr\Http\Message\RequestInterface;
2018-11-22 20:36:25 +00:00
use Symfony\Component\HttpKernel\Exception\HttpException;
2018-11-21 11:13:40 +00:00
use Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory;
2018-11-27 15:35:28 +00:00
use BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManager;
2018-11-20 13:50:37 +00:00
2018-11-27 14:59:02 +00:00
abstract class Controller implements HttpServerInterface
2018-11-20 13:50:37 +00:00
{
2018-11-27 15:43:59 +00:00
/** @var \BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManager */
2018-11-22 23:24:40 +00:00
protected $channelManager;
public function __construct(ChannelManager $channelManager)
{
$this->channelManager = $channelManager;
}
2018-11-22 20:36:25 +00:00
public function onOpen(ConnectionInterface $connection, RequestInterface $request = null)
2018-11-20 13:50:37 +00:00
{
2018-11-21 11:13:40 +00:00
$serverRequest = (new ServerRequest(
$request->getMethod(),
$request->getUri(),
$request->getHeaders(),
$request->getBody(),
$request->getProtocolVersion()
2018-11-25 23:42:45 +00:00
))->withQueryParams(QueryParameters::create($request)->all());
2018-11-21 11:13:40 +00:00
2018-11-22 20:36:25 +00:00
$laravelRequest = Request::createFromBase((new HttpFoundationFactory)->createRequest($serverRequest));
2018-11-26 08:03:04 +00:00
$this
->ensureValidAppId($laravelRequest->appId)
->ensureValidSignature($laravelRequest);
2018-11-22 20:36:25 +00:00
$response = $this($laravelRequest);
2018-11-29 08:27:43 +00:00
$connection->send(JsonResponse::create($response));
2018-11-22 20:36:25 +00:00
$connection->close();
2018-11-20 13:50:37 +00:00
}
function onMessage(ConnectionInterface $from, $msg)
{
2018-11-21 23:10:47 +00:00
}
2018-11-22 20:36:25 +00:00
function onClose(ConnectionInterface $connection)
2018-11-21 23:10:47 +00:00
{
}
2018-11-22 20:36:25 +00:00
function onError(ConnectionInterface $connection, Exception $exception)
{
2018-11-26 22:04:20 +00:00
if (! $exception instanceof HttpException) {
return;
2018-11-22 20:36:25 +00:00
}
2018-11-26 22:04:20 +00:00
$response = new Response($exception->getStatusCode(), [
'Content-Type' => 'application/json'
], json_encode([
'error' => $exception->getMessage()
]));
2018-11-28 21:37:10 +00:00
$connection->send(\GuzzleHttp\Psr7\str($response));
2018-11-26 22:15:03 +00:00
2018-11-26 22:04:20 +00:00
$connection->close();
2018-11-22 20:36:25 +00:00
}
2018-11-26 08:03:04 +00:00
public function ensureValidAppId(string $appId)
2018-11-21 23:10:47 +00:00
{
2018-11-26 22:04:20 +00:00
if (!$client = Client::findByAppId($appId)) {
2018-11-26 08:03:04 +00:00
throw new HttpException(401, "Unknown app id `{$appId}` provided.");
2018-11-22 20:36:25 +00:00
}
2018-11-24 00:53:20 +00:00
2018-11-26 19:50:02 +00:00
return $this;
2018-11-20 13:50:37 +00:00
}
2018-11-26 08:03:04 +00:00
protected function ensureValidSignature(Request $request)
2018-11-24 14:36:13 +00:00
{
$bodyMd5 = md5($request->getContent());
$signature =
2018-11-26 22:04:20 +00:00
"{$request->getMethod()}\n/{$request->path()}\n" .
"auth_key={$request->get('auth_key')}" .
"&auth_timestamp={$request->get('auth_timestamp')}" .
"&auth_version={$request->get('auth_version')}" .
2018-11-24 14:36:13 +00:00
"&body_md5={$bodyMd5}";
$authSignature = hash_hmac('sha256', $signature, Client::findByAppId($request->get('appId'))->appSecret);
if ($authSignature !== $request->get('auth_signature')) {
throw new HttpException(401, 'Invalid auth signature provided.');
}
2018-11-26 08:03:04 +00:00
return $this;
2018-11-24 14:36:13 +00:00
}
2018-11-21 11:13:40 +00:00
abstract public function __invoke(Request $request);
2018-11-20 13:50:37 +00:00
}