diff --git a/app/controllers/api/functions.php b/app/controllers/api/functions.php index b6cd43e709..b8679fcb1d 100644 --- a/app/controllers/api/functions.php +++ b/app/controllers/api/functions.php @@ -1492,7 +1492,7 @@ App::post('/v1/functions/:functionId/executions') $headersFiltered = []; foreach ($executionResponse['headers'] as $key => $value) { if (\in_array($key, FUNCTION_WHITELIST_HEADERS_REQUEST)) { - $headersFiltered[] = [ 'key' => $key, 'value' => $value ]; + $headersFiltered[] = [ 'name' => $key, 'value' => $value ]; } } @@ -1536,8 +1536,13 @@ App::post('/v1/functions/:functionId/executions') $execution->setAttribute('errors', ''); } + $headers = []; + foreach ($executionResponse['headers'] as $key => $value) { + $headers[] = [ 'name' => $key, 'value' => $value ]; + } + $execution->setAttribute('responseBody', $executionResponse['body']); - $execution->setAttribute('responseHeaders', $executionResponse['headers']); + $execution->setAttribute('responseHeaders', $headers); $response ->setStatusCode(Response::STATUS_CODE_CREATED) diff --git a/app/controllers/general.php b/app/controllers/general.php index c0ef0b17c1..c1af8e276f 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -50,7 +50,7 @@ function router(App $utopia, Database $dbForConsole, SwooleRequest $swooleReques $host = $request->getHostname() ?? ''; $route = Authorization::skip( - fn() => $dbForConsole->find('rules', [ + fn () => $dbForConsole->find('rules', [ Query::equal('domain', [$host]), Query::limit(1) ]) @@ -68,7 +68,7 @@ function router(App $utopia, Database $dbForConsole, SwooleRequest $swooleReques $projectId = $route->getAttribute('projectId'); $project = Authorization::skip( - fn() => $dbForConsole->getDocument('projects', $projectId) + fn () => $dbForConsole->getDocument('projects', $projectId) ); if (array_key_exists('proxy', $project->getAttribute('services', []))) { $status = $project->getAttribute('services', [])['proxy']; @@ -78,7 +78,7 @@ function router(App $utopia, Database $dbForConsole, SwooleRequest $swooleReques } // Skip Appwrite Router for ACME challenge. Nessessary for certificate generation - $path = ($swooleRequest->server['request_uri'] ?? ''); + $path = ($swooleRequest->server['request_uri'] ?? '/'); if (\str_starts_with($path, '/.well-known/acme-challenge')) { return false; } @@ -89,7 +89,7 @@ function router(App $utopia, Database $dbForConsole, SwooleRequest $swooleReques $functionId = $route->getAttribute('resourceId'); $projectId = $route->getAttribute('projectId'); - $path = ($swooleRequest->server['request_uri'] ?? ''); + $path = ($swooleRequest->server['request_uri'] ?? '/'); $query = ($swooleRequest->server['query_string'] ?? ''); if (!empty($query)) { $path .= '?' . $query; @@ -137,13 +137,16 @@ function router(App $utopia, Database $dbForConsole, SwooleRequest $swooleReques $execution = \json_decode($executionResponse, true); foreach ($execution['responseHeaders'] as $header) { - $response->setHeader($header['key'], $header['value']); + $response->setHeader($header['name'], $header['value']); } $body = $execution['responseBody'] ?? ''; - if (($execution['responseHeaders']['x-open-runtimes-encoding'] ?? '') === 'base64') { - $body = \base64_decode($body); + $encodingKey = \array_search('x-open-runtimes-encoding', \array_column($execution['responseHeaders'], 'name')); + if (!empty($encodingKey)) { + if (($execution['responseHeaders'][$encodingKey] ?? '') === 'base64') { + $body = \base64_decode($body); + } } $response->setStatusCode($execution['responseStatusCode'] ?? 200)->send($body); @@ -253,7 +256,7 @@ App::init() Config::setParam( 'domainVerification', ($selfDomain->getRegisterable() === $endDomain->getRegisterable()) && - $endDomain->getRegisterable() !== '' + $endDomain->getRegisterable() !== '' ); $isLocalHost = $request->getHostname() === 'localhost' || $request->getHostname() === 'localhost:' . $request->getPort(); @@ -327,8 +330,7 @@ App::init() ->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-SDK-GraphQL, X-Appwrite-ID, X-Appwrite-Timestamp, Content-Range, Range, Cache-Control, Expires, Pragma') ->addHeader('Access-Control-Expose-Headers', 'X-Fallback-Cookies') ->addHeader('Access-Control-Allow-Origin', $refDomain) - ->addHeader('Access-Control-Allow-Credentials', 'true') - ; + ->addHeader('Access-Control-Allow-Credentials', 'true'); /* * Validate Client Domain - Check to avoid CSRF attack @@ -401,7 +403,7 @@ App::init() $expire = $key->getAttribute('expire'); if (!empty($expire) && $expire < DateTime::formatTz(DateTime::now())) { - throw new AppwriteException(AppwriteException:: PROJECT_KEY_EXPIRED); + throw new AppwriteException(AppwriteException::PROJECT_KEY_EXPIRED); } Authorization::setRole(Auth::USER_ROLE_APPS); @@ -643,8 +645,7 @@ App::error() ->addHeader('Cache-Control', 'no-cache, no-store, must-revalidate') ->addHeader('Expires', '0') ->addHeader('Pragma', 'no-cache') - ->setStatusCode($code) - ; + ->setStatusCode($code); $template = ($route) ? $route->getLabel('error', null) : null; @@ -658,8 +659,7 @@ App::error() ->setParam('projectURL', $project->getAttribute('url')) ->setParam('message', $error->getMessage()) ->setParam('code', $code) - ->setParam('trace', $trace) - ; + ->setParam('trace', $trace); $response->html($layout->render()); } @@ -744,6 +744,7 @@ include_once __DIR__ . '/shared/api.php'; include_once __DIR__ . '/shared/api/auth.php'; App::wildcard() + ->groups(['api']) ->action(function () { throw new AppwriteException(AppwriteException::GENERAL_ROUTE_NOT_FOUND); }); diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index 4dfa2d4283..641fc64c04 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -582,8 +582,6 @@ App::shutdown() } } - - if ($project->getId() !== 'console') { if ($mode !== APP_MODE_ADMIN) { $fileSize = 0; diff --git a/app/http.php b/app/http.php index 7903a81d67..6fe39c70dc 100644 --- a/app/http.php +++ b/app/http.php @@ -233,7 +233,6 @@ $http->on('request', function (SwooleRequest $swooleRequest, SwooleResponse $swo $request = new Request($swooleRequest); $response = new Response($swooleResponse); - // Serve static files (console) only for main domain $host = $request->getHostname() ?? ''; $mainDomain = App::getEnv('_APP_DOMAIN', ''); @@ -251,8 +250,6 @@ $http->on('request', function (SwooleRequest $swooleRequest, SwooleResponse $swo } } - - $app = new App('UTC'); $pools = $register->get('pools'); diff --git a/app/workers/functions.php b/app/workers/functions.php index 3bc927e9c8..49f05f04b7 100644 --- a/app/workers/functions.php +++ b/app/workers/functions.php @@ -204,7 +204,7 @@ Server::setResource('execute', function () { $headersFiltered = []; foreach ($executionResponse['headers'] as $key => $value) { if (\in_array($key, FUNCTION_WHITELIST_HEADERS_REQUEST)) { - $headersFiltered[] = [ 'key' => $key, 'value' => $value ]; + $headersFiltered[] = [ 'name' => $key, 'value' => $value ]; } } diff --git a/src/Appwrite/Utopia/Response/Model/Execution.php b/src/Appwrite/Utopia/Response/Model/Execution.php index edf0312d41..549e5572df 100644 --- a/src/Appwrite/Utopia/Response/Model/Execution.php +++ b/src/Appwrite/Utopia/Response/Model/Execution.php @@ -85,7 +85,7 @@ class Execution extends Model 'default' => '', 'example' => 'Developers are awesome.', ]) - ->addRule('responseheaders', [ + ->addRule('responseHeaders', [ 'type' => Response::MODEL_HEADERS, 'description' => 'HTTP response headers as a key-value object. This will return only whitelisted headers. All headers are returned if execution is created as synchronous.', 'default' => [],