Binary support & tests for Router
This commit is contained in:
parent
7bdcd5c436
commit
f87e2bc879
8 changed files with 270 additions and 57 deletions
|
@ -274,8 +274,6 @@ function router(App $utopia, Database $dbForConsole, callable $getProjectDB, Swo
|
||||||
requestTimeout: 30
|
requestTimeout: 30
|
||||||
);
|
);
|
||||||
|
|
||||||
\var_dump($executionResponse);
|
|
||||||
|
|
||||||
$headersFiltered = [];
|
$headersFiltered = [];
|
||||||
foreach ($executionResponse['headers'] as $key => $value) {
|
foreach ($executionResponse['headers'] as $key => $value) {
|
||||||
if (\in_array(\strtolower($key), FUNCTION_ALLOWLIST_HEADERS_RESPONSE)) {
|
if (\in_array(\strtolower($key), FUNCTION_ALLOWLIST_HEADERS_RESPONSE)) {
|
||||||
|
|
95
composer.lock
generated
95
composer.lock
generated
|
@ -1045,16 +1045,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-php80",
|
"name": "symfony/polyfill-php80",
|
||||||
"version": "v1.29.0",
|
"version": "v1.30.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-php80.git",
|
"url": "https://github.com/symfony/polyfill-php80.git",
|
||||||
"reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b"
|
"reference": "77fa7995ac1b21ab60769b7323d600a991a90433"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b",
|
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433",
|
||||||
"reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b",
|
"reference": "77fa7995ac1b21ab60769b7323d600a991a90433",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
@ -1105,7 +1105,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0"
|
"source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
@ -1121,7 +1121,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-01-29T20:11:03+00:00"
|
"time": "2024-05-31T15:07:36+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "thecodingmachine/safe",
|
"name": "thecodingmachine/safe",
|
||||||
|
@ -2730,16 +2730,16 @@
|
||||||
"packages-dev": [
|
"packages-dev": [
|
||||||
{
|
{
|
||||||
"name": "appwrite/sdk-generator",
|
"name": "appwrite/sdk-generator",
|
||||||
"version": "0.38.6",
|
"version": "0.38.8",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/appwrite/sdk-generator.git",
|
"url": "https://github.com/appwrite/sdk-generator.git",
|
||||||
"reference": "d7016d6d72545e84709892faca972eb4bf5bd699"
|
"reference": "6367c57ddbcf7b88cacb900c4fe7ef3f28bf38ef"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/d7016d6d72545e84709892faca972eb4bf5bd699",
|
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/6367c57ddbcf7b88cacb900c4fe7ef3f28bf38ef",
|
||||||
"reference": "d7016d6d72545e84709892faca972eb4bf5bd699",
|
"reference": "6367c57ddbcf7b88cacb900c4fe7ef3f28bf38ef",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
@ -2775,9 +2775,9 @@
|
||||||
"description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms",
|
"description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/appwrite/sdk-generator/issues",
|
"issues": "https://github.com/appwrite/sdk-generator/issues",
|
||||||
"source": "https://github.com/appwrite/sdk-generator/tree/0.38.6"
|
"source": "https://github.com/appwrite/sdk-generator/tree/0.38.8"
|
||||||
},
|
},
|
||||||
"time": "2024-05-20T18:00:16+00:00"
|
"time": "2024-06-17T00:42:27+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "doctrine/deprecations",
|
"name": "doctrine/deprecations",
|
||||||
|
@ -2898,16 +2898,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/pint",
|
"name": "laravel/pint",
|
||||||
"version": "v1.16.0",
|
"version": "v1.16.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/pint.git",
|
"url": "https://github.com/laravel/pint.git",
|
||||||
"reference": "1b3a3dc5bc6a81ff52828ba7277621f1d49d6d98"
|
"reference": "9266a47f1b9231b83e0cfd849009547329d871b1"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/pint/zipball/1b3a3dc5bc6a81ff52828ba7277621f1d49d6d98",
|
"url": "https://api.github.com/repos/laravel/pint/zipball/9266a47f1b9231b83e0cfd849009547329d871b1",
|
||||||
"reference": "1b3a3dc5bc6a81ff52828ba7277621f1d49d6d98",
|
"reference": "9266a47f1b9231b83e0cfd849009547329d871b1",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
@ -2918,13 +2918,13 @@
|
||||||
"php": "^8.1.0"
|
"php": "^8.1.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"friendsofphp/php-cs-fixer": "^3.57.1",
|
"friendsofphp/php-cs-fixer": "^3.59.3",
|
||||||
"illuminate/view": "^10.48.10",
|
"illuminate/view": "^10.48.12",
|
||||||
"larastan/larastan": "^2.9.6",
|
"larastan/larastan": "^2.9.7",
|
||||||
"laravel-zero/framework": "^10.4.0",
|
"laravel-zero/framework": "^10.4.0",
|
||||||
"mockery/mockery": "^1.6.12",
|
"mockery/mockery": "^1.6.12",
|
||||||
"nunomaduro/termwind": "^1.15.1",
|
"nunomaduro/termwind": "^1.15.1",
|
||||||
"pestphp/pest": "^2.34.7"
|
"pestphp/pest": "^2.34.8"
|
||||||
},
|
},
|
||||||
"bin": [
|
"bin": [
|
||||||
"builds/pint"
|
"builds/pint"
|
||||||
|
@ -2960,7 +2960,7 @@
|
||||||
"issues": "https://github.com/laravel/pint/issues",
|
"issues": "https://github.com/laravel/pint/issues",
|
||||||
"source": "https://github.com/laravel/pint"
|
"source": "https://github.com/laravel/pint"
|
||||||
},
|
},
|
||||||
"time": "2024-05-21T18:08:25+00:00"
|
"time": "2024-06-18T16:50:05+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "matthiasmullie/minify",
|
"name": "matthiasmullie/minify",
|
||||||
|
@ -3088,16 +3088,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "myclabs/deep-copy",
|
"name": "myclabs/deep-copy",
|
||||||
"version": "1.11.1",
|
"version": "1.12.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/myclabs/DeepCopy.git",
|
"url": "https://github.com/myclabs/DeepCopy.git",
|
||||||
"reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
|
"reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
|
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
|
||||||
"reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
|
"reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
@ -3105,11 +3105,12 @@
|
||||||
},
|
},
|
||||||
"conflict": {
|
"conflict": {
|
||||||
"doctrine/collections": "<1.6.8",
|
"doctrine/collections": "<1.6.8",
|
||||||
"doctrine/common": "<2.13.3 || >=3,<3.2.2"
|
"doctrine/common": "<2.13.3 || >=3 <3.2.2"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"doctrine/collections": "^1.6.8",
|
"doctrine/collections": "^1.6.8",
|
||||||
"doctrine/common": "^2.13.3 || ^3.2.2",
|
"doctrine/common": "^2.13.3 || ^3.2.2",
|
||||||
|
"phpspec/prophecy": "^1.10",
|
||||||
"phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
|
"phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
|
@ -3135,7 +3136,7 @@
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/myclabs/DeepCopy/issues",
|
"issues": "https://github.com/myclabs/DeepCopy/issues",
|
||||||
"source": "https://github.com/myclabs/DeepCopy/tree/1.11.1"
|
"source": "https://github.com/myclabs/DeepCopy/tree/1.12.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
@ -3143,7 +3144,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2023-03-08T13:26:56+00:00"
|
"time": "2024-06-12T14:39:25+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "nikic/php-parser",
|
"name": "nikic/php-parser",
|
||||||
|
@ -3567,16 +3568,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpdoc-parser",
|
"name": "phpstan/phpdoc-parser",
|
||||||
"version": "1.29.0",
|
"version": "1.29.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phpstan/phpdoc-parser.git",
|
"url": "https://github.com/phpstan/phpdoc-parser.git",
|
||||||
"reference": "536889f2b340489d328f5ffb7b02bb6b183ddedc"
|
"reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/536889f2b340489d328f5ffb7b02bb6b183ddedc",
|
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fcaefacf2d5c417e928405b71b400d4ce10daaf4",
|
||||||
"reference": "536889f2b340489d328f5ffb7b02bb6b183ddedc",
|
"reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
@ -3608,9 +3609,9 @@
|
||||||
"description": "PHPDoc parser with support for nullable, intersection and generic types",
|
"description": "PHPDoc parser with support for nullable, intersection and generic types",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
|
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
|
||||||
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.0"
|
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.1"
|
||||||
},
|
},
|
||||||
"time": "2024-05-06T12:04:23+00:00"
|
"time": "2024-05-31T08:52:43+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/php-code-coverage",
|
"name": "phpunit/php-code-coverage",
|
||||||
|
@ -5081,16 +5082,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-ctype",
|
"name": "symfony/polyfill-ctype",
|
||||||
"version": "v1.29.0",
|
"version": "v1.30.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-ctype.git",
|
"url": "https://github.com/symfony/polyfill-ctype.git",
|
||||||
"reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4"
|
"reference": "0424dff1c58f028c451efff2045f5d92410bd540"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4",
|
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540",
|
||||||
"reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4",
|
"reference": "0424dff1c58f028c451efff2045f5d92410bd540",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
@ -5140,7 +5141,7 @@
|
||||||
"portable"
|
"portable"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0"
|
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
@ -5156,20 +5157,20 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-01-29T20:11:03+00:00"
|
"time": "2024-05-31T15:07:36+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-mbstring",
|
"name": "symfony/polyfill-mbstring",
|
||||||
"version": "v1.29.0",
|
"version": "v1.30.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
||||||
"reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec"
|
"reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
|
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c",
|
||||||
"reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
|
"reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
@ -5220,7 +5221,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0"
|
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
@ -5236,7 +5237,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2024-01-29T20:11:03+00:00"
|
"time": "2024-06-19T12:30:46+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "textalk/websocket",
|
"name": "textalk/websocket",
|
||||||
|
@ -5475,5 +5476,5 @@
|
||||||
"platform-overrides": {
|
"platform-overrides": {
|
||||||
"php": "8.3"
|
"php": "8.3"
|
||||||
},
|
},
|
||||||
"plugin-api-version": "2.3.0"
|
"plugin-api-version": "2.6.0"
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,11 +133,6 @@ class BodyMultipart
|
||||||
if (\is_array($value)) {
|
if (\is_array($value)) {
|
||||||
$query .= $eol . 'Content-Type: application/json';
|
$query .= $eol . 'Content-Type: application/json';
|
||||||
$value = \json_encode($value);
|
$value = \json_encode($value);
|
||||||
} else {
|
|
||||||
$isBinary = ! mb_check_encoding($value, 'UTF-8');
|
|
||||||
if ($isBinary) {
|
|
||||||
$query .= $eol . 'Content-Transfer-Encoding: binary';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$query .= $eol . $eol;
|
$query .= $eol . $eol;
|
||||||
|
|
|
@ -212,7 +212,7 @@ class Executor
|
||||||
$requestTimeout = $timeout + 15;
|
$requestTimeout = $timeout + 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
$response = $this->call(self::METHOD_POST, $route, [ 'x-opr-runtime-id' => $runtimeId ], $params, true, $requestTimeout);
|
$response = $this->call(self::METHOD_POST, $route, [ 'x-opr-runtime-id' => $runtimeId, 'content-type' => 'multipart/form-data', 'accept' => 'multipart/form-data' ], $params, true, $requestTimeout);
|
||||||
|
|
||||||
$status = $response['headers']['status-code'];
|
$status = $response['headers']['status-code'];
|
||||||
if ($status >= 400) {
|
if ($status >= 400) {
|
||||||
|
@ -220,6 +220,11 @@ class Executor
|
||||||
throw new \Exception($message, $status);
|
throw new \Exception($message, $status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$response['body']['headers'] = \json_decode($response['body']['headers'] ?? '{}', true);
|
||||||
|
$response['body']['statusCode'] = \intval($response['body']['statusCode'] ?? 500);
|
||||||
|
$response['body']['duration'] = \intval($response['body']['duration'] ?? 0);
|
||||||
|
$response['body']['startTime'] = \intval($response['body']['startTime'] ?? \microtime(true));
|
||||||
|
|
||||||
return $response['body'];
|
return $response['body'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -163,7 +163,7 @@ class Client
|
||||||
* @return array
|
* @return array
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public function call(string $method, string $path = '', array $headers = [], array $params = [], bool $decode = true): array
|
public function call(string $method, string $path = '', array $headers = [], mixed $params = [], bool $decode = true): array
|
||||||
{
|
{
|
||||||
$headers = array_merge($this->headers, $headers);
|
$headers = array_merge($this->headers, $headers);
|
||||||
$ch = curl_init($this->endpoint . $path . (($method == self::METHOD_GET && !empty($params)) ? '?' . http_build_query($params) : ''));
|
$ch = curl_init($this->endpoint . $path . (($method == self::METHOD_GET && !empty($params)) ? '?' . http_build_query($params) : ''));
|
||||||
|
@ -174,6 +174,7 @@ class Client
|
||||||
'application/json' => json_encode($params),
|
'application/json' => json_encode($params),
|
||||||
'multipart/form-data' => $this->flatten($params),
|
'multipart/form-data' => $this->flatten($params),
|
||||||
'application/graphql' => $params[0],
|
'application/graphql' => $params[0],
|
||||||
|
'text/plain' => $params,
|
||||||
default => http_build_query($params),
|
default => http_build_query($params),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1716,4 +1716,205 @@ class FunctionsCustomServerTest extends Scope
|
||||||
|
|
||||||
$this->assertEquals(204, $response['headers']['status-code']);
|
$this->assertEquals(204, $response['headers']['status-code']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testFunctionsDomainBianryResponse()
|
||||||
|
{
|
||||||
|
$timeout = 15;
|
||||||
|
$code = realpath(__DIR__ . '/../../../resources/functions') . "/php-binary-response/code.tar.gz";
|
||||||
|
$this->packageCode('php-binary-response');
|
||||||
|
|
||||||
|
$function = $this->client->call(Client::METHOD_POST, '/functions', array_merge([
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
], $this->getHeaders()), [
|
||||||
|
'functionId' => ID::unique(),
|
||||||
|
'name' => 'Test PHP Binary executions',
|
||||||
|
'runtime' => 'php-8.0',
|
||||||
|
'entrypoint' => 'index.php',
|
||||||
|
'timeout' => $timeout,
|
||||||
|
'execute' => ['any']
|
||||||
|
]);
|
||||||
|
|
||||||
|
$functionId = $function['body']['$id'] ?? '';
|
||||||
|
|
||||||
|
$this->assertEquals(201, $function['headers']['status-code']);
|
||||||
|
|
||||||
|
$rules = $this->client->call(Client::METHOD_GET, '/proxy/rules', array_merge([
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
], $this->getHeaders()), [
|
||||||
|
'queries' => [
|
||||||
|
Query::equal('resourceId', [$functionId])->toString(),
|
||||||
|
Query::equal('resourceType', ['function'])->toString(),
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(200, $rules['headers']['status-code']);
|
||||||
|
$this->assertEquals(1, $rules['body']['total']);
|
||||||
|
$this->assertCount(1, $rules['body']['rules']);
|
||||||
|
$this->assertNotEmpty($rules['body']['rules'][0]['domain']);
|
||||||
|
|
||||||
|
$domain = $rules['body']['rules'][0]['domain'];
|
||||||
|
|
||||||
|
$deployment = $this->client->call(Client::METHOD_POST, '/functions/' . $functionId . '/deployments', array_merge([
|
||||||
|
'content-type' => 'multipart/form-data',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
], $this->getHeaders()), [
|
||||||
|
'entrypoint' => 'index.php',
|
||||||
|
'code' => new CURLFile($code, 'application/x-gzip', basename($code)),
|
||||||
|
'activate' => true
|
||||||
|
]);
|
||||||
|
|
||||||
|
$deploymentId = $deployment['body']['$id'] ?? '';
|
||||||
|
$this->assertEquals(202, $deployment['headers']['status-code']);
|
||||||
|
|
||||||
|
// Poll until deployment is built
|
||||||
|
while (true) {
|
||||||
|
$deployment = $this->client->call(Client::METHOD_GET, '/functions/' . $function['body']['$id'] . '/deployments/' . $deploymentId, [
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
'x-appwrite-key' => $this->getProject()['apiKey'],
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (
|
||||||
|
$deployment['headers']['status-code'] >= 400
|
||||||
|
|| \in_array($deployment['body']['status'], ['ready', 'failed'])
|
||||||
|
) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
\sleep(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$deployment = $this->client->call(Client::METHOD_PATCH, '/functions/' . $functionId . '/deployments/' . $deploymentId, array_merge([
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
], $this->getHeaders()), []);
|
||||||
|
|
||||||
|
$this->assertEquals(200, $deployment['headers']['status-code']);
|
||||||
|
|
||||||
|
// Wait a little for activation to finish
|
||||||
|
sleep(5);
|
||||||
|
|
||||||
|
$proxyClient = new Client();
|
||||||
|
$proxyClient->setEndpoint('http://' . $domain);
|
||||||
|
|
||||||
|
$response = $proxyClient->call(Client::METHOD_GET, '/', [], [], false);
|
||||||
|
|
||||||
|
$this->assertEquals(200, $response['headers']['status-code']);
|
||||||
|
$this->assertNotEmpty($response['body']);
|
||||||
|
$bytes = unpack('C*byte', $response['body']);
|
||||||
|
$this->assertCount(3, $bytes);
|
||||||
|
$this->assertEquals(0, $bytes['byte1']);
|
||||||
|
$this->assertEquals(10, $bytes['byte2']);
|
||||||
|
$this->assertEquals(255, $bytes['byte3']);
|
||||||
|
|
||||||
|
// Cleanup : Delete function
|
||||||
|
$response = $this->client->call(Client::METHOD_DELETE, '/functions/' . $functionId, [
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
'x-appwrite-key' => $this->getProject()['apiKey'],
|
||||||
|
], []);
|
||||||
|
|
||||||
|
$this->assertEquals(204, $response['headers']['status-code']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testFunctionsDomainBianryRequest()
|
||||||
|
{
|
||||||
|
$timeout = 15;
|
||||||
|
$code = realpath(__DIR__ . '/../../../resources/functions') . "/php-binary-request/code.tar.gz";
|
||||||
|
$this->packageCode('php-binary-request');
|
||||||
|
|
||||||
|
$function = $this->client->call(Client::METHOD_POST, '/functions', array_merge([
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
], $this->getHeaders()), [
|
||||||
|
'functionId' => ID::unique(),
|
||||||
|
'name' => 'Test PHP Binary executions',
|
||||||
|
'runtime' => 'php-8.0',
|
||||||
|
'entrypoint' => 'index.php',
|
||||||
|
'timeout' => $timeout,
|
||||||
|
'execute' => ['any']
|
||||||
|
]);
|
||||||
|
|
||||||
|
$functionId = $function['body']['$id'] ?? '';
|
||||||
|
|
||||||
|
$this->assertEquals(201, $function['headers']['status-code']);
|
||||||
|
|
||||||
|
$rules = $this->client->call(Client::METHOD_GET, '/proxy/rules', array_merge([
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
], $this->getHeaders()), [
|
||||||
|
'queries' => [
|
||||||
|
Query::equal('resourceId', [$functionId])->toString(),
|
||||||
|
Query::equal('resourceType', ['function'])->toString(),
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertEquals(200, $rules['headers']['status-code']);
|
||||||
|
$this->assertEquals(1, $rules['body']['total']);
|
||||||
|
$this->assertCount(1, $rules['body']['rules']);
|
||||||
|
$this->assertNotEmpty($rules['body']['rules'][0]['domain']);
|
||||||
|
|
||||||
|
$domain = $rules['body']['rules'][0]['domain'];
|
||||||
|
|
||||||
|
$deployment = $this->client->call(Client::METHOD_POST, '/functions/' . $functionId . '/deployments', array_merge([
|
||||||
|
'content-type' => 'multipart/form-data',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
], $this->getHeaders()), [
|
||||||
|
'entrypoint' => 'index.php',
|
||||||
|
'code' => new CURLFile($code, 'application/x-gzip', basename($code)),
|
||||||
|
'activate' => true
|
||||||
|
]);
|
||||||
|
|
||||||
|
$deploymentId = $deployment['body']['$id'] ?? '';
|
||||||
|
$this->assertEquals(202, $deployment['headers']['status-code']);
|
||||||
|
|
||||||
|
// Poll until deployment is built
|
||||||
|
while (true) {
|
||||||
|
$deployment = $this->client->call(Client::METHOD_GET, '/functions/' . $function['body']['$id'] . '/deployments/' . $deploymentId, [
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
'x-appwrite-key' => $this->getProject()['apiKey'],
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (
|
||||||
|
$deployment['headers']['status-code'] >= 400
|
||||||
|
|| \in_array($deployment['body']['status'], ['ready', 'failed'])
|
||||||
|
) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
\sleep(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$deployment = $this->client->call(Client::METHOD_PATCH, '/functions/' . $functionId . '/deployments/' . $deploymentId, array_merge([
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
], $this->getHeaders()), []);
|
||||||
|
|
||||||
|
$this->assertEquals(200, $deployment['headers']['status-code']);
|
||||||
|
|
||||||
|
// Wait a little for activation to finish
|
||||||
|
sleep(5);
|
||||||
|
|
||||||
|
$proxyClient = new Client();
|
||||||
|
$proxyClient->setEndpoint('http://' . $domain);
|
||||||
|
|
||||||
|
$bytes = pack('C*', ...[0,20,255]);
|
||||||
|
|
||||||
|
$response = $proxyClient->call(Client::METHOD_POST, '/', [ 'content-type' => 'text/plain' ], $bytes, false);
|
||||||
|
|
||||||
|
$this->assertEquals(200, $response['headers']['status-code']);
|
||||||
|
$this->assertEquals(\md5($bytes), $response['body']);
|
||||||
|
|
||||||
|
// Cleanup : Delete function
|
||||||
|
$response = $this->client->call(Client::METHOD_DELETE, '/functions/' . $functionId, [
|
||||||
|
'content-type' => 'application/json',
|
||||||
|
'x-appwrite-project' => $this->getProject()['$id'],
|
||||||
|
'x-appwrite-key' => $this->getProject()['apiKey'],
|
||||||
|
], []);
|
||||||
|
|
||||||
|
$this->assertEquals(204, $response['headers']['status-code']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
6
tests/resources/functions/php-binary-request/index.php
Normal file
6
tests/resources/functions/php-binary-request/index.php
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
return function ($context) {
|
||||||
|
$hash = md5($context->req->bodyBinary);
|
||||||
|
return $context->res->send($hash);
|
||||||
|
};
|
6
tests/resources/functions/php-binary-response/index.php
Normal file
6
tests/resources/functions/php-binary-response/index.php
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
return function ($context) {
|
||||||
|
$bytes = pack('C*', ...[0, 10, 255]);
|
||||||
|
return $context->res->binary($bytes);
|
||||||
|
};
|
Loading…
Reference in a new issue