2020-06-26 21:54:37 +12:00
|
|
|
<?php
|
|
|
|
|
|
|
|
require_once __DIR__.'/../vendor/autoload.php';
|
|
|
|
|
2020-11-19 19:56:14 +13:00
|
|
|
use Appwrite\Database\Validator\Authorization;
|
2020-10-30 02:07:56 +13:00
|
|
|
use Appwrite\Utopia\Response;
|
2020-06-27 00:27:58 +12:00
|
|
|
use Swoole\Process;
|
|
|
|
use Swoole\Http\Server;
|
2020-06-26 21:54:37 +12:00
|
|
|
use Swoole\Http\Request as SwooleRequest;
|
|
|
|
use Swoole\Http\Response as SwooleResponse;
|
2020-06-27 00:27:58 +12:00
|
|
|
use Utopia\App;
|
|
|
|
use Utopia\CLI\Console;
|
2021-12-22 04:01:40 +13:00
|
|
|
use Utopia\Logger\Log;
|
|
|
|
use Utopia\Logger\Log\User;
|
2021-06-28 19:19:33 +12:00
|
|
|
use Utopia\Swoole\Files;
|
|
|
|
use Utopia\Swoole\Request;
|
2020-06-26 21:54:37 +12:00
|
|
|
|
2021-01-21 00:49:36 +13:00
|
|
|
$http = new Server("0.0.0.0", App::getEnv('PORT', 80));
|
2020-07-01 20:55:14 +12:00
|
|
|
|
2020-10-28 08:56:37 +13:00
|
|
|
$payloadSize = max(4000000 /* 4mb */, App::getEnv('_APP_STORAGE_LIMIT', 10000000 /* 10mb */));
|
2020-07-20 03:17:57 +12:00
|
|
|
|
2020-06-27 00:27:58 +12:00
|
|
|
$http
|
2020-06-26 21:54:37 +12:00
|
|
|
->set([
|
|
|
|
'open_http2_protocol' => true,
|
2020-07-07 07:29:13 +12:00
|
|
|
// 'document_root' => __DIR__.'/../public',
|
|
|
|
// 'enable_static_handler' => true,
|
2020-07-02 18:44:16 +12:00
|
|
|
'http_compression' => true,
|
|
|
|
'http_compression_level' => 6,
|
2020-07-20 03:17:57 +12:00
|
|
|
'package_max_length' => $payloadSize,
|
2021-05-25 22:19:49 +12:00
|
|
|
'buffer_output_size' => $payloadSize,
|
2020-06-26 21:54:37 +12:00
|
|
|
])
|
|
|
|
;
|
|
|
|
|
2020-06-27 00:27:58 +12:00
|
|
|
$http->on('WorkerStart', function($serv, $workerId) {
|
2020-07-08 05:59:42 +12:00
|
|
|
Console::success('Worker '.++$workerId.' started succefully');
|
2020-06-26 21:54:37 +12:00
|
|
|
});
|
|
|
|
|
2020-06-27 00:27:58 +12:00
|
|
|
$http->on('BeforeReload', function($serv, $workerId) {
|
2020-06-26 21:54:37 +12:00
|
|
|
Console::success('Starting reload...');
|
|
|
|
});
|
|
|
|
|
2020-06-27 00:27:58 +12:00
|
|
|
$http->on('AfterReload', function($serv, $workerId) {
|
2020-06-26 21:54:37 +12:00
|
|
|
Console::success('Reload completed...');
|
|
|
|
});
|
|
|
|
|
2020-07-20 03:17:57 +12:00
|
|
|
$http->on('start', function (Server $http) use ($payloadSize) {
|
2020-12-30 07:42:03 +13:00
|
|
|
|
2020-10-28 08:56:37 +13:00
|
|
|
Console::success('Server started succefully (max payload is '.number_format($payloadSize).' bytes)');
|
2020-07-09 03:08:14 +12:00
|
|
|
|
|
|
|
Console::info("Master pid {$http->master_pid}, manager pid {$http->manager_pid}");
|
2020-06-27 00:27:58 +12:00
|
|
|
|
|
|
|
// listen ctrl + c
|
|
|
|
Process::signal(2, function () use ($http) {
|
2020-07-09 03:08:14 +12:00
|
|
|
Console::log('Stop by Ctrl+C');
|
2020-06-27 00:27:58 +12:00
|
|
|
$http->shutdown();
|
|
|
|
});
|
2020-06-26 21:54:37 +12:00
|
|
|
});
|
|
|
|
|
2020-07-07 07:29:13 +12:00
|
|
|
Files::load(__DIR__ . '/../public');
|
|
|
|
|
2020-07-29 19:29:34 +12:00
|
|
|
include __DIR__ . '/controllers/general.php';
|
2020-07-01 20:55:14 +12:00
|
|
|
|
2021-06-12 04:09:46 +12:00
|
|
|
$http->on('request', function (SwooleRequest $swooleRequest, SwooleResponse $swooleResponse) use ($register) {
|
2020-07-01 20:55:14 +12:00
|
|
|
$request = new Request($swooleRequest);
|
|
|
|
$response = new Response($swooleResponse);
|
|
|
|
|
2020-07-07 07:29:13 +12:00
|
|
|
if(Files::isFileLoaded($request->getURI())) {
|
2020-07-11 16:16:24 +12:00
|
|
|
$time = (60 * 60 * 24 * 365 * 2); // 45 days cache
|
2020-07-07 07:29:13 +12:00
|
|
|
|
|
|
|
$response
|
|
|
|
->setContentType(Files::getFileMimeType($request->getURI()))
|
|
|
|
->addHeader('Cache-Control', 'public, max-age='.$time)
|
|
|
|
->addHeader('Expires', \date('D, d M Y H:i:s', \time() + $time).' GMT') // 45 days cache
|
|
|
|
->send(Files::getFileContents($request->getURI()))
|
|
|
|
;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-06-28 19:19:33 +12:00
|
|
|
$app = new App('UTC');
|
|
|
|
|
2021-06-12 04:09:46 +12:00
|
|
|
$db = $register->get('dbPool')->get();
|
|
|
|
$redis = $register->get('redisPool')->get();
|
|
|
|
|
2021-06-28 19:19:33 +12:00
|
|
|
App::setResource('db', function () use (&$db) {
|
2021-06-12 04:09:46 +12:00
|
|
|
return $db;
|
|
|
|
});
|
|
|
|
|
2021-06-28 19:19:33 +12:00
|
|
|
App::setResource('cache', function () use (&$redis) {
|
2021-06-12 04:09:46 +12:00
|
|
|
return $redis;
|
|
|
|
});
|
2020-07-01 20:55:14 +12:00
|
|
|
|
2020-06-27 00:27:58 +12:00
|
|
|
try {
|
2020-11-19 19:56:14 +13:00
|
|
|
Authorization::cleanRoles();
|
|
|
|
Authorization::setRole('*');
|
|
|
|
|
2020-07-01 20:55:14 +12:00
|
|
|
$app->run($request, $response);
|
2020-06-27 00:27:58 +12:00
|
|
|
} catch (\Throwable $th) {
|
2021-12-22 04:01:40 +13:00
|
|
|
$version = App::getEnv('_APP_VERSION', 'UNKNOWN');
|
|
|
|
|
|
|
|
$user = null;
|
|
|
|
try {
|
|
|
|
$user = $app->getResource('user');
|
2021-12-22 04:21:30 +13:00
|
|
|
} catch(\Throwable $_th) {
|
2021-12-22 04:01:40 +13:00
|
|
|
// All good, user is optional information for logger
|
|
|
|
}
|
|
|
|
|
|
|
|
$logger = $app->getResource("logger");
|
|
|
|
if($logger) {
|
|
|
|
$loggerBreadcrumbs = $app->getResource("loggerBreadcrumbs");
|
|
|
|
$route = $app->match($request);
|
|
|
|
|
|
|
|
$log = new Utopia\Logger\Log();
|
|
|
|
|
2021-12-22 04:21:30 +13:00
|
|
|
if($user !== null && !$user->isEmpty()) {
|
2021-12-22 04:01:40 +13:00
|
|
|
$log->setUser(new User($user->getId()));
|
|
|
|
}
|
|
|
|
|
|
|
|
$log->setNamespace("http");
|
|
|
|
$log->setServer(\gethostname());
|
|
|
|
$log->setVersion($version);
|
|
|
|
$log->setType(Log::TYPE_ERROR);
|
|
|
|
$log->setMessage($th->getMessage());
|
|
|
|
|
|
|
|
$log->addTag('method', $route->getMethod());
|
|
|
|
$log->addTag('url', $route->getPath());
|
|
|
|
$log->addTag('verboseType', get_class($th));
|
|
|
|
$log->addTag('code', $th->getCode());
|
2021-12-22 04:21:30 +13:00
|
|
|
// $log->addTag('projectId', $project->getId()); // TODO: Figure out how to get ProjectID, if it becomes relevant
|
2021-12-22 04:01:40 +13:00
|
|
|
$log->addTag('hostname', $request->getHostname());
|
|
|
|
$log->addTag('locale', (string)$request->getParam('locale', $request->getHeader('x-appwrite-locale', '')));
|
|
|
|
|
|
|
|
$log->addExtra('file', $th->getFile());
|
|
|
|
$log->addExtra('line', $th->getLine());
|
|
|
|
$log->addExtra('trace', $th->getTraceAsString());
|
|
|
|
$log->addExtra('roles', Authorization::$roles);
|
|
|
|
|
|
|
|
$action = $route->getLabel("sdk.namespace", "UNKNOWN_NAMESPACE") . '.' . $route->getLabel("sdk.method", "UNKNOWN_METHOD");
|
|
|
|
$log->setAction($action);
|
|
|
|
|
|
|
|
$isProduction = App::getEnv('_APP_ENV', 'development') === 'production';
|
|
|
|
$log->setEnvironment($isProduction ? Log::ENVIRONMENT_PRODUCTION : Log::ENVIRONMENT_STAGING);
|
|
|
|
|
|
|
|
foreach($loggerBreadcrumbs as $loggerBreadcrumb) {
|
|
|
|
$log->addBreadcrumb($loggerBreadcrumb);
|
|
|
|
}
|
|
|
|
|
|
|
|
$responseCode = $logger->addLog($log);
|
|
|
|
Console::info('Log pushed with status code: '.$responseCode);
|
|
|
|
}
|
|
|
|
|
2020-10-26 02:48:04 +13:00
|
|
|
Console::error('[Error] Type: '.get_class($th));
|
|
|
|
Console::error('[Error] Message: '.$th->getMessage());
|
|
|
|
Console::error('[Error] File: '.$th->getFile());
|
|
|
|
Console::error('[Error] Line: '.$th->getLine());
|
|
|
|
|
2021-07-12 22:04:00 +12:00
|
|
|
/**
|
|
|
|
* Reset Database connection if PDOException was thrown.
|
|
|
|
*/
|
2021-07-13 04:15:21 +12:00
|
|
|
if ($th instanceof PDOException) {
|
2021-07-12 22:04:00 +12:00
|
|
|
$db = null;
|
|
|
|
}
|
|
|
|
|
2021-12-21 23:47:06 +13:00
|
|
|
$swooleResponse->setStatusCode(500);
|
|
|
|
|
2021-12-22 04:01:40 +13:00
|
|
|
$output = ((App::isDevelopment())) ? [
|
|
|
|
'message' => 'Error: '. $th->getMessage(),
|
|
|
|
'code' => 500,
|
|
|
|
'file' => $th->getFile(),
|
|
|
|
'line' => $th->getLine(),
|
|
|
|
'trace' => $th->getTrace(),
|
|
|
|
'version' => $version,
|
|
|
|
] : [
|
|
|
|
'message' => 'Error: Server Error',
|
|
|
|
'code' => 500,
|
|
|
|
'version' => $version,
|
|
|
|
];
|
|
|
|
|
|
|
|
$swooleResponse->end(\json_encode($output));
|
2021-06-12 04:09:46 +12:00
|
|
|
} finally {
|
|
|
|
/** @var PDOPool $dbPool */
|
|
|
|
$dbPool = $register->get('dbPool');
|
|
|
|
$dbPool->put($db);
|
|
|
|
|
|
|
|
/** @var RedisPool $redisPool */
|
|
|
|
$redisPool = $register->get('redisPool');
|
|
|
|
$redisPool->put($redis);
|
2020-06-27 00:27:58 +12:00
|
|
|
}
|
2020-06-26 21:54:37 +12:00
|
|
|
});
|
|
|
|
|
2020-10-20 05:54:21 +13:00
|
|
|
$http->start();
|