From 3a3ed1296bf31c34bc0a8f80d707cabff2b02f6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Mon, 22 May 2023 13:29:36 +0000 Subject: [PATCH] Fix wildcards for OPTIONS --- src/App.php | 33 +++++++++++++++++++++++++++++++++ tests/AppTest.php | 42 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/src/App.php b/src/App.php index 58924a9b..5581d03c 100755 --- a/src/App.php +++ b/src/App.php @@ -733,8 +733,41 @@ public function run(Request $request, Response $response): static $response->disablePayload(); } + if(self::REQUEST_METHOD_OPTIONS == $method) { + try { + foreach ($groups as $group) { + foreach (self::$options as $option) { // Group options hooks + /** @var Hook $option */ + if (in_array($group, $option->getGroups())) { + \call_user_func_array($option->getAction(), $this->getArguments($option, [], $request->getParams())); + } + } + } + + foreach (self::$options as $option) { // Global options hooks + /** @var Hook $option */ + if (in_array('*', $option->getGroups())) { + \call_user_func_array($option->getAction(), $this->getArguments($option, [], $request->getParams())); + } + } + } catch (\Throwable $e) { + foreach (self::$errors as $error) { // Global error hooks + /** @var Hook $error */ + if (in_array('*', $error->getGroups())) { + self::setResource('error', function () use ($e) { + return $e; + }); + \call_user_func_array($error->getAction(), $this->getArguments($error, [], $request->getParams())); + } + } + } + + return $this; + } + if (null === $route && null !== self::$wildcardRoute) { $route = self::$wildcardRoute; + $this->route = $route; $path = \parse_url($request->getURI(), PHP_URL_PATH); $route->path($path); } diff --git a/tests/AppTest.php b/tests/AppTest.php index 21e47372..00b3fef4 100755 --- a/tests/AppTest.php +++ b/tests/AppTest.php @@ -575,10 +575,36 @@ public function testWildcardRoute(): void $_SERVER['REQUEST_METHOD'] = 'GET'; $_SERVER['REQUEST_URI'] = '/unknown_path'; + App::init() + ->action(function () { + $route = $this->app->getRoute(); + App::setResource('myRoute', fn () => $route); + }); + + App::options() + ->inject('request') + ->inject('response') + ->action(function (Request $request, Response $response) { + $origin = $request->getOrigin(); + $response + ->addHeader('Server', 'Appwrite') + ->addHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE') + ->addHeader('Access-Control-Allow-Headers', 'Origin, Cookie, Set-Cookie, X-Requested-With, Content-Type, Access-Control-Allow-Origin, Access-Control-Request-Headers, Accept, X-Appwrite-Project, X-Appwrite-Key, X-Appwrite-Locale, X-Appwrite-Mode, X-Appwrite-JWT, X-Appwrite-Response-Format, X-SDK-Version, X-SDK-Name, X-SDK-Language, X-SDK-Platform, X-Appwrite-ID, Content-Range, Range, Cache-Control, Expires, Pragma, X-Fallback-Cookies') + ->addHeader('Access-Control-Expose-Headers', 'X-Fallback-Cookies') + ->addHeader('Access-Control-Allow-Origin', $origin) + ->addHeader('Access-Control-Allow-Credentials', 'true') + ->noContent(); + }); + App::wildcard() + ->inject('myRoute') ->inject('response') - ->action(function ($response) { - $response->send('HELLO'); + ->action(function (mixed $myRoute, $response) { + if($myRoute == null) { + $response->send('ROUTE IS NULL!'); + } else { + $response->send('HELLO'); + } }); \ob_start(); @@ -586,9 +612,19 @@ public function testWildcardRoute(): void $result = \ob_get_contents(); \ob_end_clean(); + $this->assertEquals('HELLO', $result); + + \ob_start(); + $req = new Request(); + $req = $req->setMethod('OPTIONS'); + @$this->app->run($req, new Response()); + $result = \ob_get_contents(); + \ob_end_clean(); + + $this->assertEquals('', $result); + $_SERVER['REQUEST_METHOD'] = $method; $_SERVER['REQUEST_URI'] = $uri; - $this->assertEquals('HELLO', $result); } }