diff --git a/app/controllers/general.php b/app/controllers/general.php index 70bd323fb5..c12199148e 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -856,14 +856,14 @@ Http::init() // Only run Router when external domain if (!\in_array($hostname, $platformHostnames) || !empty($previewHostname)) { if (router($utopia, $dbForPlatform, $getProjectDB, $swooleRequest, $request, $response, $log, $queueForEvents, $bus, $executor, $geodb, $isResourceBlocked, $platform, $previewHostname, $authorization, $apiKey, $queueForDeletes, $executionsRetentionCount)) { - $utopia->getRoute()?->label('router', true); + $utopia->getResource('route')?->label('router', true); } } /* * Request format */ - $route = $utopia->getRoute(); + $route = $utopia->getResource('route'); $request->setRoute($route); if ($route === null) { @@ -1148,7 +1148,7 @@ Http::options() // Only run Router when external domain if (!in_array($request->getHostname(), $platformHostnames) || !empty($previewHostname)) { if (router($utopia, $dbForPlatform, $getProjectDB, $swooleRequest, $request, $response, $log, $queueForEvents, $bus, $executor, $geodb, $isResourceBlocked, $platform, $previewHostname, $authorization, $apiKey, $queueForDeletes, $executionsRetentionCount)) { - $utopia->getRoute()?->label('router', true); + $utopia->getResource('route')?->label('router', true); } } @@ -1183,7 +1183,11 @@ Http::error() ->inject('authorization') ->action(function (Throwable $error, Http $utopia, Request $request, Response $response, Document $project, ?Logger $logger, Log $log, Bus $bus, Document $devKey, Authorization $authorization) { $version = System::getEnv('_APP_VERSION', 'UNKNOWN'); - $route = $utopia->getRoute(); + try { + $route = $utopia->getResource('route'); + } catch (\Throwable $_th) { + $route = null; + } $class = \get_class($error); $code = $error->getCode(); $message = $error->getMessage(); @@ -1549,7 +1553,7 @@ Http::get('/robots.txt') $response->text($template->render(false)); } else { if (router($utopia, $dbForPlatform, $getProjectDB, $swooleRequest, $request, $response, $log, $queueForEvents, $bus, $executor, $geodb, $isResourceBlocked, $platform, $previewHostname, $authorization, $apiKey, $queueForDeletes, $executionsRetentionCount)) { - $utopia->getRoute()?->label('router', true); + $utopia->getResource('route')?->label('router', true); } } }); @@ -1583,7 +1587,7 @@ Http::get('/humans.txt') $response->text($template->render(false)); } else { if (router($utopia, $dbForPlatform, $getProjectDB, $swooleRequest, $request, $response, $log, $queueForEvents, $bus, $executor, $geodb, $isResourceBlocked, $platform, $previewHostname, $authorization, $apiKey, $queueForDeletes, $executionsRetentionCount)) { - $utopia->getRoute()?->label('router', true); + $utopia->getResource('route')?->label('router', true); } } }); diff --git a/app/controllers/mock.php b/app/controllers/mock.php index 4e92b3482d..715f2a77b2 100644 --- a/app/controllers/mock.php +++ b/app/controllers/mock.php @@ -289,7 +289,7 @@ Http::shutdown() ->action(function (Http $utopia, Response $response, Request $request) { $result = []; - $route = $utopia->getRoute(); + $route = $utopia->getResource('route'); $path = APP_STORAGE_CACHE . '/tests.json'; $tests = (\file_exists($path)) ? \json_decode(\file_get_contents($path), true) : []; diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index 7c2f527ccf..846d4c0736 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -101,7 +101,7 @@ Http::init() ->inject('apiKey') ->inject('authorization') ->action(function (Http $utopia, Request $request, Database $dbForPlatform, Database $dbForProject, AuditContext $auditContext, Document $project, User $user, ?Document $session, array $servers, string $mode, Document $team, ?Key $apiKey, Authorization $authorization) { - $route = $utopia->getRoute(); + $route = $utopia->getResource('route'); if ($route === null) { throw new AppwriteException(AppwriteException::GENERAL_ROUTE_NOT_FOUND); } @@ -507,12 +507,12 @@ Http::init() $response->setUser($user); $request->setUser($user); - $route = $utopia->getRoute(); + $route = $utopia->getResource('route'); if ($route === null) { throw new AppwriteException(AppwriteException::GENERAL_ROUTE_NOT_FOUND); } - $path = $route->getMatchedPath(); + $path = $utopia->getResource('matchedPath'); $databaseType = match (true) { str_contains($path, '/documentsdb') => DATABASE_TYPE_DOCUMENTSDB, str_contains($path, '/vectorsdb') => DATABASE_TYPE_VECTORSDB, @@ -861,8 +861,8 @@ Http::shutdown() } } - $route = $utopia->getRoute(); - $requestParams = $route->getParamsValues(); + $route = $utopia->getResource('route'); + $requestParams = $request->getParams(); /** * Abuse labels diff --git a/app/http.php b/app/http.php index b72f3b7f34..7f089a21b7 100644 --- a/app/http.php +++ b/app/http.php @@ -522,7 +522,7 @@ $swooleAdapter->onRequest(function ($utopiaRequest, $utopiaResponse) use ($files return; } - $requestContainer = $swooleAdapter->getContainer(); + $requestContainer = $swooleAdapter->getContext(); $requestContainer->set('container', fn () => $requestContainer); $requestContainer->set('request', fn () => $request); $requestContainer->set('response', fn () => $response); @@ -545,7 +545,7 @@ $swooleAdapter->onRequest(function ($utopiaRequest, $utopiaResponse) use ($files $app->run($request, $response); - $route = $app->getRoute(); + $route = $app->getResource('route'); Span::add('http.path', $route?->getPath() ?? 'unknown'); } catch (\Throwable $th) { Span::error($th); @@ -561,7 +561,11 @@ $swooleAdapter->onRequest(function ($utopiaRequest, $utopiaResponse) use ($files // All good, user is optional information for logger } - $route = $app->getRoute(); + try { + $route = $app->getResource('route'); + } catch (\Throwable $_th) { + $route = null; + } $log = $app->getResource("log"); diff --git a/composer.json b/composer.json index b5ca436c3f..91cac30412 100644 --- a/composer.json +++ b/composer.json @@ -67,7 +67,7 @@ "utopia-php/emails": "0.6.*", "utopia-php/dns": "1.6.*", "utopia-php/dsn": "0.2.1", - "utopia-php/http": "0.34.*", + "utopia-php/http": "dev-fix/concurrency-shared-state as 0.34.99", "utopia-php/fetch": "0.5.*", "utopia-php/validators": "0.2.*", "utopia-php/image": "0.8.*", diff --git a/composer.lock b/composer.lock index 2cf57b95a3..044d594977 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": "805802552f7482eaeae4bdaa505ae982", + "content-hash": "4fe55bdcb4efe2a8e4394e3a504bd94e", "packages": [ { "name": "adhocore/jwt", @@ -4271,16 +4271,16 @@ }, { "name": "utopia-php/http", - "version": "0.34.24", + "version": "dev-fix/concurrency-shared-state", "source": { "type": "git", "url": "https://github.com/utopia-php/http.git", - "reference": "d1eced0627c5a9fceddf53992ed97d664b810d33" + "reference": "0707b7caff4ec0561027eba12ed045940e7b1b0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/http/zipball/d1eced0627c5a9fceddf53992ed97d664b810d33", - "reference": "d1eced0627c5a9fceddf53992ed97d664b810d33", + "url": "https://api.github.com/repos/utopia-php/http/zipball/0707b7caff4ec0561027eba12ed045940e7b1b0d", + "reference": "0707b7caff4ec0561027eba12ed045940e7b1b0d", "shasum": "" }, "require": { @@ -4321,9 +4321,9 @@ ], "support": { "issues": "https://github.com/utopia-php/http/issues", - "source": "https://github.com/utopia-php/http/tree/0.34.24" + "source": "https://github.com/utopia-php/http/tree/fix/concurrency-shared-state" }, - "time": "2026-04-24T12:16:53+00:00" + "time": "2026-04-28T10:30:40+00:00" }, { "name": "utopia-php/image", @@ -8443,9 +8443,18 @@ "time": "2024-11-07T12:36:22+00:00" } ], - "aliases": [], + "aliases": [ + { + "package": "utopia-php/http", + "version": "dev-fix/concurrency-shared-state", + "alias": "0.34.99", + "alias_normalized": "0.34.99.0" + } + ], "minimum-stability": "dev", - "stability-flags": {}, + "stability-flags": { + "utopia-php/http": 20 + }, "prefer-stable": true, "prefer-lowest": false, "platform": { diff --git a/src/Appwrite/GraphQL/Resolvers.php b/src/Appwrite/GraphQL/Resolvers.php index cabb357607..bea1004e24 100644 --- a/src/Appwrite/GraphQL/Resolvers.php +++ b/src/Appwrite/GraphQL/Resolvers.php @@ -359,7 +359,11 @@ class Resolvers $lock->acquire(); - $original = $utopia->getRoute(); + try { + $original = $utopia->getResource('route'); + } catch (\Throwable $_th) { + $original = null; + } try { $request = clone $request; @@ -403,7 +407,8 @@ class Resolvers return; } finally { if ($original !== null) { - $utopia->setRoute($original); + $container = self::getResolverContainer($utopia); + $container->set('route', static fn () => $original); } $lock->release(); diff --git a/src/Appwrite/Promises/Swoole.php b/src/Appwrite/Promises/Swoole.php index 9c06fbda2f..f80cdd5d85 100644 --- a/src/Appwrite/Promises/Swoole.php +++ b/src/Appwrite/Promises/Swoole.php @@ -8,7 +8,7 @@ use Utopia\DI\Container; class Swoole extends Promise { - private const REQUEST_CONTAINER_CONTEXT_KEY = '__utopia_http_request_container'; + private const REQUEST_CONTAINER_CONTEXT_KEY = '__utopia_http_context'; public function __construct(?callable $executor = null) {