Loading src/Certic/Circe/Client.php +59 −11 Original line number Diff line number Diff line Loading @@ -3,21 +3,37 @@ declare(strict_types=1); namespace Certic\Circe; use PHP_CodeSniffer\Tokenizers\PHP; class Client { private $endpoint; private $uuid; private $secret; public function __construct(string $api_endpoint, string $secret_key, string $app_uuid) public function __construct(string $api_endpoint = null, string $secret_key = null, string $app_uuid = null) { $this->endpoint = $api_endpoint; $this->secret = $secret_key; $this->uuid = $app_uuid; $this->endpoint = $api_endpoint ?: getenv('CIRCE_ENDPOINT'); $this->secret = $secret_key ?: getenv('CIRCE_SECRET'); $this->uuid = $app_uuid ?: getenv('CIRCE_APP_UUID'); if (!$this->endpoint || !$this->secret || !$this->uuid) { throw new Exception("Credentials and/or endpoint not set"); } } public function availableTransformations(): array { $endpoint = $this->endpoint . '/transformations/'; $endpoint = \str_replace('//transformations/', '/transformations/', $endpoint); $body = file_get_contents($endpoint); if ($body === false) { throw new Exception('Could not fetch available transformations.'); } $data = json_decode($body, true); if (is_null($data)) { throw new Exception('Could not fetch available transformations.'); } return $data; } public function send(Job $job, bool $wait = false, string $destination_file = null) Loading @@ -28,6 +44,7 @@ class Client $job_archive_path = $job->makeArchive(); $job_hash = \hash_hmac_file("sha256", $job_archive_path, $this->secret); $endpoint = $wait ? $this->endpoint . '/job/?block=1' : $this->endpoint . "/job/"; $endpoint = \str_replace('//job', '/job', $endpoint); $ch = \curl_init(); \curl_setopt($ch, CURLOPT_URL, $endpoint); \curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); Loading @@ -41,31 +58,62 @@ class Client ]); $output = \curl_exec($ch); if ($output === false) { throw new Exception(curl_error($ch)); throw new Exception(\curl_error($ch)); } $this->checkStatusCode($ch); if ($wait) { file_put_contents($destination_file, $output); \file_put_contents($destination_file, $output); $job->setResultFilePath($destination_file); } else { $job->setUuid($output); } } public function poll(Job $job, string $destination_file = null, int $timeout = 30, int $poll_interval = 1) public function fetch(Job $job, string $destination_file = null) { if (!$job->getUuid()) { $this->send($job); throw new Exception('Job has to be first sent to Circe server.'); } if (!$destination_file) { $destination_file = \tempnam(\sys_get_temp_dir(), "circe-") . '.tar.gz'; $destination_file = \tempnam(\sys_get_temp_dir(), "circe") . '.tar.gz'; } $then = time(); while (true) { $endpoint = $this->endpoint . '/job/' . $job->getUuid(); $endpoint = \str_replace('//job', '/job', $endpoint); $job_hash = \hash_hmac("sha256", $job->getUuid(), $this->secret); $ch = \curl_init(); \curl_setopt($ch, CURLOPT_URL, $endpoint); \curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); \curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization:' . $this->uuid . ' ' . $job_hash, ]); $output = \curl_exec($ch); if ($output === false) { throw new Exception(\curl_error($ch)); } $this->checkStatusCode($ch); \file_put_contents($destination_file, $output); $job->setResultFilePath($destination_file); } public function newJob(): Job { return new Job(); } private function checkStatusCode($curl_handle) { $infos = curl_getinfo($curl_handle); if ($infos['http_code'] !== 200) { if ($infos['http_code'] === 202) { throw new Exception('Job exists but result is not ready yet, try again later.'); } if ($infos['http_code'] === 404) { throw new Exception('No such job on the server.'); } if ($infos['http_code'] === 403) { throw new Exception('Forbidden. Check your credentials.'); } } } } src/Certic/Circe/Job.php +17 −9 Original line number Diff line number Diff line Loading @@ -13,6 +13,11 @@ class Job private $uuid; public function __construct(string $uuid = null) { $this->uuid = $uuid; } public function addFile(string $file_path): Job { $this->files[] = $file_path; Loading Loading @@ -42,7 +47,7 @@ class Job } $this->dir_path = sys_get_temp_dir() . DIRECTORY_SEPARATOR . uniqid() . DIRECTORY_SEPARATOR; if (!mkdir($this->dir_path, 0777, true)) { throw new Exception("Could not create temporary directory"); throw new Exception("Could not create temporary directory."); } $tar_path = $this->dir_path . "job.tar"; $tar = new \PharData($tar_path); Loading @@ -59,7 +64,7 @@ class Job foreach ($this->files as $file) { $tar->addFile($file, basename($file)); $tar->addFile($file, \basename($file)); } $tar->compress(\Phar::GZ); Loading @@ -68,15 +73,17 @@ class Job public function __destruct() { if ($this->dir_path) { $this->deleteTree($this->dir_path); } } private function deleteTree(string $folder, bool $keepRootFolder = false): bool { if (empty($folder) || !file_exists($folder)) { if (empty($folder) || !\file_exists($folder)) { return true; } elseif (is_file($folder) || is_link($folder)) { return @unlink($folder); } elseif (\is_file($folder) || \is_link($folder)) { return @\unlink($folder); } $files = new \RecursiveIteratorIterator( Loading @@ -96,6 +103,9 @@ class Job public function getResultFilePath(): string { if (!$this->result_file_path) { throw new Exception('Fetch job result file from Circe server first.'); } return $this->result_file_path; } Loading @@ -118,8 +128,6 @@ class Job public function getResult(): JobResult { if ($this->getResultFilePath()) { return new JobResult($this->getResultFilePath()); } } } src/Certic/Circe/JobResult.php +6 −1 Original line number Diff line number Diff line Loading @@ -18,4 +18,9 @@ class JobResult yield $file; } } public function __destruct() { @\unlink($this->result_file_path); } } Loading
src/Certic/Circe/Client.php +59 −11 Original line number Diff line number Diff line Loading @@ -3,21 +3,37 @@ declare(strict_types=1); namespace Certic\Circe; use PHP_CodeSniffer\Tokenizers\PHP; class Client { private $endpoint; private $uuid; private $secret; public function __construct(string $api_endpoint, string $secret_key, string $app_uuid) public function __construct(string $api_endpoint = null, string $secret_key = null, string $app_uuid = null) { $this->endpoint = $api_endpoint; $this->secret = $secret_key; $this->uuid = $app_uuid; $this->endpoint = $api_endpoint ?: getenv('CIRCE_ENDPOINT'); $this->secret = $secret_key ?: getenv('CIRCE_SECRET'); $this->uuid = $app_uuid ?: getenv('CIRCE_APP_UUID'); if (!$this->endpoint || !$this->secret || !$this->uuid) { throw new Exception("Credentials and/or endpoint not set"); } } public function availableTransformations(): array { $endpoint = $this->endpoint . '/transformations/'; $endpoint = \str_replace('//transformations/', '/transformations/', $endpoint); $body = file_get_contents($endpoint); if ($body === false) { throw new Exception('Could not fetch available transformations.'); } $data = json_decode($body, true); if (is_null($data)) { throw new Exception('Could not fetch available transformations.'); } return $data; } public function send(Job $job, bool $wait = false, string $destination_file = null) Loading @@ -28,6 +44,7 @@ class Client $job_archive_path = $job->makeArchive(); $job_hash = \hash_hmac_file("sha256", $job_archive_path, $this->secret); $endpoint = $wait ? $this->endpoint . '/job/?block=1' : $this->endpoint . "/job/"; $endpoint = \str_replace('//job', '/job', $endpoint); $ch = \curl_init(); \curl_setopt($ch, CURLOPT_URL, $endpoint); \curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); Loading @@ -41,31 +58,62 @@ class Client ]); $output = \curl_exec($ch); if ($output === false) { throw new Exception(curl_error($ch)); throw new Exception(\curl_error($ch)); } $this->checkStatusCode($ch); if ($wait) { file_put_contents($destination_file, $output); \file_put_contents($destination_file, $output); $job->setResultFilePath($destination_file); } else { $job->setUuid($output); } } public function poll(Job $job, string $destination_file = null, int $timeout = 30, int $poll_interval = 1) public function fetch(Job $job, string $destination_file = null) { if (!$job->getUuid()) { $this->send($job); throw new Exception('Job has to be first sent to Circe server.'); } if (!$destination_file) { $destination_file = \tempnam(\sys_get_temp_dir(), "circe-") . '.tar.gz'; $destination_file = \tempnam(\sys_get_temp_dir(), "circe") . '.tar.gz'; } $then = time(); while (true) { $endpoint = $this->endpoint . '/job/' . $job->getUuid(); $endpoint = \str_replace('//job', '/job', $endpoint); $job_hash = \hash_hmac("sha256", $job->getUuid(), $this->secret); $ch = \curl_init(); \curl_setopt($ch, CURLOPT_URL, $endpoint); \curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); \curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization:' . $this->uuid . ' ' . $job_hash, ]); $output = \curl_exec($ch); if ($output === false) { throw new Exception(\curl_error($ch)); } $this->checkStatusCode($ch); \file_put_contents($destination_file, $output); $job->setResultFilePath($destination_file); } public function newJob(): Job { return new Job(); } private function checkStatusCode($curl_handle) { $infos = curl_getinfo($curl_handle); if ($infos['http_code'] !== 200) { if ($infos['http_code'] === 202) { throw new Exception('Job exists but result is not ready yet, try again later.'); } if ($infos['http_code'] === 404) { throw new Exception('No such job on the server.'); } if ($infos['http_code'] === 403) { throw new Exception('Forbidden. Check your credentials.'); } } } }
src/Certic/Circe/Job.php +17 −9 Original line number Diff line number Diff line Loading @@ -13,6 +13,11 @@ class Job private $uuid; public function __construct(string $uuid = null) { $this->uuid = $uuid; } public function addFile(string $file_path): Job { $this->files[] = $file_path; Loading Loading @@ -42,7 +47,7 @@ class Job } $this->dir_path = sys_get_temp_dir() . DIRECTORY_SEPARATOR . uniqid() . DIRECTORY_SEPARATOR; if (!mkdir($this->dir_path, 0777, true)) { throw new Exception("Could not create temporary directory"); throw new Exception("Could not create temporary directory."); } $tar_path = $this->dir_path . "job.tar"; $tar = new \PharData($tar_path); Loading @@ -59,7 +64,7 @@ class Job foreach ($this->files as $file) { $tar->addFile($file, basename($file)); $tar->addFile($file, \basename($file)); } $tar->compress(\Phar::GZ); Loading @@ -68,15 +73,17 @@ class Job public function __destruct() { if ($this->dir_path) { $this->deleteTree($this->dir_path); } } private function deleteTree(string $folder, bool $keepRootFolder = false): bool { if (empty($folder) || !file_exists($folder)) { if (empty($folder) || !\file_exists($folder)) { return true; } elseif (is_file($folder) || is_link($folder)) { return @unlink($folder); } elseif (\is_file($folder) || \is_link($folder)) { return @\unlink($folder); } $files = new \RecursiveIteratorIterator( Loading @@ -96,6 +103,9 @@ class Job public function getResultFilePath(): string { if (!$this->result_file_path) { throw new Exception('Fetch job result file from Circe server first.'); } return $this->result_file_path; } Loading @@ -118,8 +128,6 @@ class Job public function getResult(): JobResult { if ($this->getResultFilePath()) { return new JobResult($this->getResultFilePath()); } } }
src/Certic/Circe/JobResult.php +6 −1 Original line number Diff line number Diff line Loading @@ -18,4 +18,9 @@ class JobResult yield $file; } } public function __destruct() { @\unlink($this->result_file_path); } }