mirror of
https://github.com/bitinflow/expose.git
synced 2026-03-13 13:35:54 +00:00
wip
This commit is contained in:
@@ -3,15 +3,16 @@
|
||||
namespace App\Contracts;
|
||||
|
||||
use App\Server\Connections\ControlConnection;
|
||||
use App\Server\Connections\HttpConnection;
|
||||
use Ratchet\ConnectionInterface;
|
||||
|
||||
interface ConnectionManager
|
||||
{
|
||||
public function storeConnection(string $host, ?string $subdomain, ConnectionInterface $connection): ControlConnection;
|
||||
|
||||
public function storeHttpConnection(ConnectionInterface $httpConnection, $requestId): ConnectionInterface;
|
||||
public function storeHttpConnection(ConnectionInterface $httpConnection, $requestId): HttpConnection;
|
||||
|
||||
public function getHttpConnectionForRequestId(string $requestId): ?ConnectionInterface;
|
||||
public function getHttpConnectionForRequestId(string $requestId): ?HttpConnection;
|
||||
|
||||
public function removeControlConnection($connection);
|
||||
|
||||
|
||||
11
app/Contracts/RequestModifier.php
Normal file
11
app/Contracts/RequestModifier.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace App\Contracts;
|
||||
|
||||
use App\Server\Connections\HttpConnection;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
interface RequestModifier
|
||||
{
|
||||
public function handle(Request $request, HttpConnection $httpConnection): ?Request;
|
||||
}
|
||||
@@ -8,6 +8,7 @@ use Illuminate\Http\Request;
|
||||
use Psr\Http\Message\RequestInterface;
|
||||
use Ratchet\ConnectionInterface;
|
||||
use Ratchet\Http\HttpServerInterface;
|
||||
use React\Promise\PromiseInterface;
|
||||
use function GuzzleHttp\Psr7\parse_request;
|
||||
|
||||
abstract class Controller implements HttpServerInterface
|
||||
|
||||
@@ -65,7 +65,7 @@ class LoggedRequest implements \JsonSerializable
|
||||
'headers' => $this->parsedRequest->getHeaders()->toArray(),
|
||||
'body' => $this->isBinary($this->rawRequest) ? 'BINARY' : $this->parsedRequest->getContent(),
|
||||
'query' => $this->parsedRequest->getQuery()->toArray(),
|
||||
'post' => $this->getPost(),
|
||||
'post' => $this->getPostData(),
|
||||
'curl' => '', //(new CurlFormatter())->format(parse_request($this->rawRequest)),
|
||||
'additional_data' => $this->additionalData,
|
||||
],
|
||||
@@ -142,7 +142,7 @@ class LoggedRequest implements \JsonSerializable
|
||||
return $this->parsedResponse;
|
||||
}
|
||||
|
||||
protected function getPost()
|
||||
public function getPostData()
|
||||
{
|
||||
$postData = [];
|
||||
|
||||
@@ -151,7 +151,7 @@ class LoggedRequest implements \JsonSerializable
|
||||
switch ($contentType) {
|
||||
case 'application/x-www-form-urlencoded':
|
||||
parse_str($this->parsedRequest->getContent(), $postData);
|
||||
$postData = collect($postData)->map(function ($key, $value) {
|
||||
$postData = collect($postData)->map(function ($value, $key) {
|
||||
return [
|
||||
'name' => $key,
|
||||
'value' => $value,
|
||||
@@ -159,12 +159,12 @@ class LoggedRequest implements \JsonSerializable
|
||||
})->toArray();
|
||||
break;
|
||||
case 'application/json':
|
||||
$postData = collect(json_decode($this->parsedRequest->getContent(), true))->map(function ($key, $value) {
|
||||
$postData = collect(json_decode($this->parsedRequest->getContent(), true))->map(function ($value, $key) {
|
||||
return [
|
||||
'name' => $key,
|
||||
'value' => $value,
|
||||
];
|
||||
})->toArray();
|
||||
})->values()->toArray();
|
||||
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -35,14 +35,14 @@ class ConnectionManager implements ConnectionManagerContract
|
||||
return $storedConnection;
|
||||
}
|
||||
|
||||
public function storeHttpConnection(ConnectionInterface $httpConnection, $requestId): ConnectionInterface
|
||||
public function storeHttpConnection(ConnectionInterface $httpConnection, $requestId): HttpConnection
|
||||
{
|
||||
$this->httpConnections[$requestId] = $httpConnection;
|
||||
$this->httpConnections[$requestId] = new HttpConnection($httpConnection);
|
||||
|
||||
return $httpConnection;
|
||||
return $this->httpConnections[$requestId];
|
||||
}
|
||||
|
||||
public function getHttpConnectionForRequestId(string $requestId): ?ConnectionInterface
|
||||
public function getHttpConnectionForRequestId(string $requestId): ?HttpConnection
|
||||
{
|
||||
return $this->httpConnections[$requestId] ?? null;
|
||||
}
|
||||
|
||||
32
app/Server/Connections/HttpConnection.php
Normal file
32
app/Server/Connections/HttpConnection.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace App\Server\Connections;
|
||||
|
||||
use Evenement\EventEmitterTrait;
|
||||
use Ratchet\ConnectionInterface;
|
||||
|
||||
class HttpConnection
|
||||
{
|
||||
use EventEmitterTrait;
|
||||
|
||||
/** @var ConnectionInterface */
|
||||
public $socket;
|
||||
|
||||
public function __construct(ConnectionInterface $socket)
|
||||
{
|
||||
$this->socket = $socket;
|
||||
}
|
||||
|
||||
public function send($data)
|
||||
{
|
||||
$this->emit('data', [$data]);
|
||||
$this->socket->send($data);
|
||||
}
|
||||
|
||||
public function close()
|
||||
{
|
||||
$this->emit('close');
|
||||
|
||||
$this->socket->close();
|
||||
}
|
||||
}
|
||||
@@ -9,12 +9,10 @@ use App\Server\Connections\ConnectionManager;
|
||||
use App\Server\Http\Controllers\Admin\DeleteUsersController;
|
||||
use App\Server\Http\Controllers\Admin\ListSitesController;
|
||||
use App\Server\Http\Controllers\Admin\ListUsersController;
|
||||
use App\Server\Http\Controllers\Admin\LoginController;
|
||||
use App\Server\Http\Controllers\Admin\RedirectToUsersController;
|
||||
use App\Server\Http\Controllers\Admin\SaveSettingsController;
|
||||
use App\Server\Http\Controllers\Admin\ShowSettingsController;
|
||||
use App\Server\Http\Controllers\Admin\StoreUsersController;
|
||||
use App\Server\Http\Controllers\Admin\VerifyLoginController;
|
||||
use App\Server\Http\Controllers\ControlMessageController;
|
||||
use App\Server\Http\Controllers\TunnelMessageController;
|
||||
use App\Http\RouteGenerator;
|
||||
|
||||
@@ -51,7 +51,7 @@ class ControlMessageController implements MessageComponentInterface
|
||||
function onMessage(ConnectionInterface $connection, $msg)
|
||||
{
|
||||
if (isset($connection->request_id)) {
|
||||
return $this->sendRequestToHttpConnection($connection->request_id, $msg);
|
||||
return $this->sendResponseToHttpConnection($connection->request_id, $msg);
|
||||
}
|
||||
|
||||
try {
|
||||
@@ -66,10 +66,11 @@ class ControlMessageController implements MessageComponentInterface
|
||||
}
|
||||
}
|
||||
|
||||
protected function sendRequestToHttpConnection(string $requestId, $request)
|
||||
protected function sendResponseToHttpConnection(string $requestId, $response)
|
||||
{
|
||||
$httpConnection = $this->connectionManager->getHttpConnectionForRequestId($requestId);
|
||||
$httpConnection->send($request);
|
||||
|
||||
$httpConnection->send($response);
|
||||
}
|
||||
|
||||
protected function authenticate(ConnectionInterface $connection, $data)
|
||||
|
||||
@@ -6,6 +6,7 @@ use App\Contracts\ConnectionManager;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Server\Configuration;
|
||||
use App\Server\Connections\ControlConnection;
|
||||
use App\Server\Connections\HttpConnection;
|
||||
use GuzzleHttp\Psr7\Response;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Pipeline\Pipeline;
|
||||
@@ -13,6 +14,7 @@ use Illuminate\Support\Str;
|
||||
use Nyholm\Psr7\Factory\Psr17Factory;
|
||||
use Ratchet\ConnectionInterface;
|
||||
use Ratchet\RFC6455\Messaging\Frame;
|
||||
use React\Promise\Deferred;
|
||||
use Symfony\Bridge\PsrHttpMessage\Factory\PsrHttpFactory;
|
||||
use function GuzzleHttp\Psr7\str;
|
||||
|
||||
@@ -22,13 +24,11 @@ class TunnelMessageController extends Controller
|
||||
protected $connectionManager;
|
||||
|
||||
/** @var Configuration */
|
||||
private $configuration;
|
||||
protected $configuration;
|
||||
|
||||
protected $keepConnectionOpen = true;
|
||||
|
||||
protected $middleware = [
|
||||
|
||||
];
|
||||
protected $modifiers = [];
|
||||
|
||||
public function __construct(ConnectionManager $connectionManager, Configuration $configuration)
|
||||
{
|
||||
@@ -62,26 +62,38 @@ class TunnelMessageController extends Controller
|
||||
|
||||
protected function sendRequestToClient(Request $request, ControlConnection $controlConnection, ConnectionInterface $httpConnection)
|
||||
{
|
||||
(new Pipeline(app()))
|
||||
->send($this->prepareRequest($request, $controlConnection))
|
||||
->through($this->middleware)
|
||||
->then(function ($request) use ($controlConnection, $httpConnection) {
|
||||
$requestId = $request->header('X-Expose-Request-ID');
|
||||
$request = $this->prepareRequest($request, $controlConnection);
|
||||
|
||||
$this->connectionManager->storeHttpConnection($httpConnection, $requestId);
|
||||
$requestId = $request->header('X-Expose-Request-ID');
|
||||
|
||||
$controlConnection->once('proxy_ready_' . $requestId, function (ConnectionInterface $proxy) use ($request) {
|
||||
// Convert the Laravel request into a PSR7 request
|
||||
$psr17Factory = new Psr17Factory();
|
||||
$psrHttpFactory = new PsrHttpFactory($psr17Factory, $psr17Factory, $psr17Factory, $psr17Factory);
|
||||
$request = $psrHttpFactory->createRequest($request);
|
||||
$httpConnection = $this->connectionManager->storeHttpConnection($httpConnection, $requestId);
|
||||
|
||||
$binaryMsg = new Frame(str($request), true, Frame::OP_BINARY);
|
||||
$proxy->send($binaryMsg);
|
||||
});
|
||||
transform($this->passRequestThroughModifiers($request, $httpConnection), function (Request $request) use ($controlConnection, $httpConnection, $requestId) {
|
||||
$controlConnection->once('proxy_ready_' . $requestId, function (ConnectionInterface $proxy) use ($request) {
|
||||
// Convert the Laravel request into a PSR7 request
|
||||
$psr17Factory = new Psr17Factory();
|
||||
$psrHttpFactory = new PsrHttpFactory($psr17Factory, $psr17Factory, $psr17Factory, $psr17Factory);
|
||||
$request = $psrHttpFactory->createRequest($request);
|
||||
|
||||
$controlConnection->registerProxy($requestId);
|
||||
$binaryMsg = new Frame(str($request), true, Frame::OP_BINARY);
|
||||
$proxy->send($binaryMsg);
|
||||
});
|
||||
|
||||
$controlConnection->registerProxy($requestId);
|
||||
});
|
||||
}
|
||||
|
||||
protected function passRequestThroughModifiers(Request $request, HttpConnection $httpConnection): ?Request
|
||||
{
|
||||
foreach ($this->modifiers as $modifier) {
|
||||
$request = app($modifier)->handle($request, $httpConnection);
|
||||
|
||||
if (is_null($request)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return $request;
|
||||
}
|
||||
|
||||
protected function prepareRequest(Request $request, ControlConnection $controlConnection): Request
|
||||
|
||||
Reference in New Issue
Block a user