From 391b7fa44ef145e7740e2043c0ea6b243209a735 Mon Sep 17 00:00:00 2001 From: loks0n <22452787+loks0n@users.noreply.github.com> Date: Tue, 28 Apr 2026 14:27:44 +0100 Subject: [PATCH] fix: merge path values into requestParams for cache label substitution MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The api shutdown hook substitutes route labels like \`cache.resource = 'file/{request.fileId}'\` against \$requestParams. We were reading those from \$request->getParams(), which only returns body or query params — path params (\`fileId\`, \`bucketId\`) were missing, so cache documents got written with literal \`file/{request.fileId}\` strings and subsequent cache hits 404'd because the placeholder was treated as a real fileId. Merge \$route->getPathValues(\$request) ahead of \$request->getParams() so path params are available for substitution. Replicates the previous behaviour of \$route->getParamsValues(), which was populated by the upstream Hook param writeback that has since been removed. Also rename the per-request container variable to \$context and the loader callable to \$registerContext in app/http.php to match the new upstream terminology. Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/scheduled_tasks.lock | 1 + app/controllers/shared/api.php | 5 ++++- app/http.php | 16 ++++++++-------- 3 files changed, 13 insertions(+), 9 deletions(-) create mode 100644 .claude/scheduled_tasks.lock diff --git a/.claude/scheduled_tasks.lock b/.claude/scheduled_tasks.lock new file mode 100644 index 0000000000..0e587f7493 --- /dev/null +++ b/.claude/scheduled_tasks.lock @@ -0,0 +1 @@ +{"sessionId":"1ce4d4d2-abfa-41e4-b13e-8ea927be2eea","pid":74450,"procStart":"Tue Apr 28 11:38:51 2026","acquiredAt":1777382028727} \ No newline at end of file diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index a2a05d1eab..855caabb5b 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -864,7 +864,10 @@ Http::shutdown() } } - $requestParams = $request->getParams(); + $requestParams = array_merge( + $route?->getPathValues($request) ?? [], + $request->getParams(), + ); /** * Abuse labels diff --git a/app/http.php b/app/http.php index 76e303689c..0a2d8e8936 100644 --- a/app/http.php +++ b/app/http.php @@ -3,7 +3,7 @@ require_once __DIR__ . '/init.php'; require_once __DIR__ . '/init/span.php'; -$registerRequestResources = require __DIR__ . '/init/resources/request.php'; +$registerContext = require __DIR__ . '/init/resources/request.php'; use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; @@ -502,7 +502,7 @@ $http->on(Constant::EVENT_START, function ($http) use ($payloadSize, $totalWorke }); }); -$swooleAdapter->onRequest(function ($utopiaRequest, $utopiaResponse) use ($files, $swooleAdapter, $registerRequestResources) { +$swooleAdapter->onRequest(function ($utopiaRequest, $utopiaResponse) use ($files, $swooleAdapter, $registerContext) { Span::init('http.request'); $request = new Request($utopiaRequest->getSwooleRequest()); @@ -522,15 +522,15 @@ $swooleAdapter->onRequest(function ($utopiaRequest, $utopiaResponse) use ($files return; } - $requestContainer = $swooleAdapter->getContext(); - $requestContainer->set('container', fn () => $requestContainer); - $requestContainer->set('request', fn () => $request); - $requestContainer->set('response', fn () => $response); + $context = $swooleAdapter->getContext(); + $context->set('container', fn () => $context); + $context->set('request', fn () => $request); + $context->set('response', fn () => $response); $app = new Http($swooleAdapter, 'UTC'); - $requestContainer->set('utopia', fn () => $app); + $context->set('utopia', fn () => $app); - $registerRequestResources($requestContainer); + $registerContext($context); $app->setCompression(System::getEnv('_APP_COMPRESSION_ENABLED', 'enabled') === 'enabled'); $app->setCompressionMinSize(intval(System::getEnv('_APP_COMPRESSION_MIN_SIZE_BYTES', '1024'))); // 1KB