From 6804bb2cdad07b96b36d862a0ebb352fed529098 Mon Sep 17 00:00:00 2001 From: Savio Resende Date: Sat, 2 Mar 2024 21:57:23 -0600 Subject: [PATCH] Added hooks for customization. --- composer.json | 3 +- composer.lock | 2 +- src/Services/Server.php | 78 ++++++++++++++++++++++++++--- src/Services/Traits/HttpSupport.php | 34 +++++++++++-- 4 files changed, 103 insertions(+), 14 deletions(-) diff --git a/composer.json b/composer.json index 3c2bc6f..53032cb 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,8 @@ "kanata-php/socket-conveyor": "^2.1", "textalk/websocket": "^1.5", "kanata-php/conveyor-laravel-broadcaster": "^0.0", - "laravel/sanctum": "^3.3" + "laravel/sanctum": "^3.3", + "lotharthesavior/hook": "^0.0.1" }, "extra": { "laravel": { diff --git a/composer.lock b/composer.lock index 12d39fc..0bdc556 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3a6d1dfae030726563766b770755611b", + "content-hash": "c565aed735c32d479929b79ac1578a5d", "packages": [ { "name": "adoy/fastcgi-client", diff --git a/src/Services/Server.php b/src/Services/Server.php index d1e9bad..1130800 100644 --- a/src/Services/Server.php +++ b/src/Services/Server.php @@ -2,7 +2,6 @@ namespace JackedPhp\JackedServer\Services; -use Conveyor\Constants; use Conveyor\Conveyor; use Conveyor\ConveyorServer; use Conveyor\Constants as ConveyorConstants; @@ -11,6 +10,7 @@ use Conveyor\Events\ServerStartedEvent; use Conveyor\Persistence\Abstracts\GenericPersistence; use Exception; +use Hook\Filter; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Console\OutputStyle; use Illuminate\Database\Capsule\Manager; @@ -92,6 +92,9 @@ public function __construct( } } + /** + * @throws Exception + */ public function run(): void { $ssl = config('jacked-server.ssl-enabled', false); @@ -160,7 +163,10 @@ public function handleWsHandshake(Request $request, Response $response): bool // check for authorization try { - $broadcaster = rescue(fn() => Broadcast::driver('conveyor')); + $broadcaster = rescue( + callback: fn() => Broadcast::driver('conveyor'), + report: false, + ); $wsAuth = config('jacked-server.websocket.broadcaster'); parse_str(Arr::get($request->server, 'query_string') ?? '', $query); @@ -244,15 +250,71 @@ public function handleStart(OpenSwooleServer $server): void public function handleRequest(Request $request, Response $response): void { - if (config('jacked-server.proxy.enabled', false)) { + /** + * Description: This is a filter for requests proxy. + * Name: jacked_proxy_request + * Params: + * - $proxyRequest: bool + * - $request: Request + * Returns: bool + */ + $proxyRequest = Filter::applyFilters( + 'jacked_proxy_request', + config('jacked-server.proxy.enabled', false), + $request, + ); + + if ($proxyRequest) { + /** + * Description: This is a filter for proxy host. + * Name: jacked_proxy_host + * Params: + * - $proxyHost: string + * - $request: Request + * Returns: string + */ + $proxyHost = Filter::applyFilters( + 'jacked_proxy_host', + config('jacked-server.proxy.host', '127.0.0.1'), + $request, + ); + + /** + * Description: This is a filter for proxy port. + * Name: jacked_proxy_port + * Params: + * - $proxyPort: int + * - $request: Request + * Returns: int + */ + $proxyPort = Filter::applyFilters( + 'jacked_proxy_port', + config('jacked-server.proxy.port', 3000), + $request, + ); + + /** + * Description: This is a filter for proxy allowed headers. + * Name: jacked_proxy_allowed_headers + * Params: + * - $proxyAllowedHeaders: array + * - $request: Request + * Returns: array + */ + $proxyAllowedHeaders = Filter::applyFilters( + 'jacked_proxy_allowed_headers', + config('jacked-server.proxy.allowed-headers', [ + 'content-type', + ]), + $request, + ); + $this->proxyRequest( request: $request, response: $response, - host: config('jacked-server.proxy.host', '127.0.0.1'), - port: config('jacked-server.proxy.port', 3000), - allowedHeaders: config('jacked-server.proxy.allowed-headers', [ - 'content-type', - ]), + host: $proxyHost, + port: $proxyPort, + allowedHeaders: $proxyAllowedHeaders, ); return; } diff --git a/src/Services/Traits/HttpSupport.php b/src/Services/Traits/HttpSupport.php index b684e54..9027346 100644 --- a/src/Services/Traits/HttpSupport.php +++ b/src/Services/Traits/HttpSupport.php @@ -4,6 +4,7 @@ use Adoy\FastCGI\Client; use Exception; +use Hook\Filter; use Illuminate\Support\Arr; use Illuminate\Support\Carbon; use JackedPhp\JackedServer\Events\JackedRequestReceived; @@ -90,6 +91,14 @@ protected function checkPathTrailingSlash(array $requestOptions): void } } + /** + * @param Request $request + * @param Response $response + * @param string $host + * @param int $port + * @param array $allowedHeaders + * @return void + */ protected function proxyRequest( Request $request, Response $response, @@ -229,7 +238,11 @@ private function prepareRequestOptions( 'script_name' => $this->getScriptName($requestUri), 'script_filename' => $this->getScriptFilename($requestUri), 'content_length' => $contentLength, - 'server_protocol' => Arr::get($serverInfo, 'server_protocol', config('jacked-server.server-protocol', 'HTTP/1.1')), + 'server_protocol' => Arr::get( + $serverInfo, + 'server_protocol', + config('jacked-server.server-protocol', 'HTTP/1.1'), + ), 'server_name' => Arr::get($requestOptions, 'http_host'), ])), CASE_UPPER); } @@ -266,9 +279,22 @@ private function getInputFile(): string */ private function getDocumentRoot(string $requestUri): string { - $documentRoot = $this->documentRoot - ?? config('jacked-server.openswoole-server-settings.document_root') - ?? public_path(); + /** + * Description: This is a filter for the server's document root. + * Name: jacked_document_root + * Params: + * - $documentRoot: string + * - $requestUri: string + * Returns: string + */ + $documentRoot = $this->documentRoot ?? Filter::applyFilters( + 'jacked_document_root', + config( + 'jacked-server.openswoole-server-settings.document_root', + public_path(), + ), + $requestUri, + ); if (is_dir($documentRoot . $requestUri)) { return $documentRoot . $requestUri;