From af3c5d9afe58c201cd29cbde75e605e88a734e81 Mon Sep 17 00:00:00 2001 From: Marcel Pociot Date: Mon, 27 Apr 2020 12:47:12 +0200 Subject: [PATCH] wip --- app/Client/Client.php | 13 ++++++++++--- app/Server/Factory.php | 26 +++++++++++++++++++++----- app/Server/Http/RouteGenerator.php | 15 +-------------- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/app/Client/Client.php b/app/Client/Client.php index bd73031..d90ff4f 100644 --- a/app/Client/Client.php +++ b/app/Client/Client.php @@ -41,9 +41,9 @@ class Client { $token = config('expose.auth_token'); - $protocol = $this->configuration->port() === 443 ? "wss" : "ws"; + $wsProtocol = $this->configuration->port() === 443 ? "wss" : "ws"; - connect($protocol."://{$this->configuration->host()}:{$this->configuration->port()}/expose/control?authToken={$token}", [], [ + connect($wsProtocol."://{$this->configuration->host()}:{$this->configuration->port()}/expose/control?authToken={$token}", [], [ 'X-Expose-Control' => 'enabled', ], $this->loop) ->then(function (WebSocket $clientConnection) use ($sharedUrl, $subdomain) { @@ -67,7 +67,14 @@ class Client }); $connection->on('authenticated', function ($data) { - $this->logger->info("Connected to http://$data->subdomain.{$this->configuration->host()}:{$this->configuration->port()}"); + $httpProtocol = $this->configuration->port() === 443 ? "https" : "http"; + $host = $this->configuration->host(); + + if ($httpProtocol !== 'https') { + $host .= ":{$this->configuration->port()}"; + } + + $this->logger->info("Connected to {$httpProtocol}://{$data->subdomain}.{$host}"); static::$subdomains[] = "$data->subdomain.{$this->configuration->host()}:{$this->configuration->port()}"; }); diff --git a/app/Server/Factory.php b/app/Server/Factory.php index e7414d6..a150756 100644 --- a/app/Server/Factory.php +++ b/app/Server/Factory.php @@ -82,10 +82,8 @@ class Factory return $this; } - protected function addExposeRoutes() + protected function addTunnelRoute() { - $this->router->get('/expose/control', ControlMessageController::class, 'request.headers.get("x-expose-control") matches "/enabled/i"'); - $this->router->addSymfonyRoute('tunnel', new Route('/{__catchall__}', [ '_controller' => app(TunnelMessageController::class), @@ -94,6 +92,18 @@ class Factory ])); } + protected function addControlConnectionRoute(): WsServer + { + $wsServer = new WsServer(app(ControlMessageController::class)); + + $this->router->addSymfonyRoute('expose-control', + new Route('/expose/control', [ + '_controller' => $wsServer, + ], [], [], '', [], [], 'request.headers.get("x-expose-control") matches "/enabled/i"')); + + return $wsServer; + } + protected function addAdminRoutes() { $adminCondition = 'request.headers.get("Host") matches "/'.config('expose.dashboard_subdomain').'./i"'; @@ -143,7 +153,9 @@ class Factory $this->addAdminRoutes(); - $this->addExposeRoutes(); + $this->addTunnelRoute(); + + $controlConnection = $this->addControlConnectionRoute(); $urlMatcher = new UrlMatcher($this->router->getRoutes(), new RequestContext); @@ -151,7 +163,11 @@ class Factory $http = new HttpServer($router); - return new IoServer($http, $socket, $this->loop); + $server = new IoServer($http, $socket, $this->loop); + + $controlConnection->enableKeepAlive($this->loop); + + return $server; } protected function bindDatabase() diff --git a/app/Server/Http/RouteGenerator.php b/app/Server/Http/RouteGenerator.php index 9afa336..83c5482 100644 --- a/app/Server/Http/RouteGenerator.php +++ b/app/Server/Http/RouteGenerator.php @@ -60,19 +60,6 @@ class RouteGenerator protected function getRoute(string $method, string $uri, $action, string $condition = ''): Route { - $action = is_subclass_of($action, MessageComponentInterface::class) - ? $this->createWebSocketsServer($action) - : app($action); - - return new Route($uri, ['_controller' => $action], [], [], null, [], [$method], $condition); - } - - protected function createWebSocketsServer(string $action): WsServer - { - $wServer = new WsServer(app($action)); - - $wServer->enableKeepAlive(app(LoopInterface::class)); - - return $wServer; + return new Route($uri, ['_controller' => app($action)], [], [], null, [], [$method], $condition); } }