You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

109 lines
3.3 KiB
PHP

<?php
namespace BSR\Lib;
use BSR\Lib\Exception\UsageException;
use BSR\Lib\Exception\WebException;
abstract class WebService
{
private $func = null;
private $status = 200;
private $log = '';
/**
* @param $message
* @param int $verbosity
* @param bool $withTime
*/
public function log($message, $verbosity = 1, $withTime = false) {
if(Configuration::get('log.verbosity') < $verbosity) {
return;
}
if($withTime) {
$message = date("d-m-Y h:m:s").' '.$message;
}
$this->log .= $message."\n";
}
public function Run()
{
$renderer = new Renderer();
$this->log("------------------");
$this->log("Start request", 1, true);
$data = array();
try {
$result = $this->Call();
$data["result"][$this->func] = $result;
} catch (WebException $e) {
$data["error"]["code"] = $e->getCode();
$data["error"]["reason"] = $e->getMessage();
$data["error"]["name"] = $e->getName();
$this->status = 400;
$this->log(sprintf("Error : [%s] %s", $e->getCode(), $e->getName()));
} catch (\Exception $e) {
$data["failure"]["code"] = $e->getCode();
$data["failure"]["reason"] = $e->getMessage();
$this->status = 500;
$this->log(sprintf("Failure : %s", $e->getMessage()));
}
$this->log("Data: ".print_r($data, true), 2);
$renderer->render($this->status, $data);
$this->log("Request finished", 1, true);
$this->log("------------------\n\n");
if(Configuration::get('log.verbosity') > 0) {
file_put_contents(Configuration::get('log.file'), $this->log, FILE_APPEND | LOCK_EX);
}
}
private function Call()
{
session_save_path(Configuration::get('session.save_path'));
session_start();
$params = empty($_GET) ? $_POST : $_GET;
if (empty($params)) {
throw new UsageException("NoArguments", "No arguments specified.", UsageException::NO_ARGS);
}
if (!array_key_exists("func", $params)) {
throw new UsageException("MissingMethod", "No method specified.", UsageException::MISSING_METHOD);
}
$this->func = $params["func"];
unset($params['func']);
if (!is_callable(array($this, $this->func))) {
throw new UsageException("BadMethod", "Method {$this->func} does not exists.", UsageException::BAD_METHOD);
}
$rm = new \ReflectionMethod($this, $this->func);
$nbParams = count($params);
$nbArgsFix = $rm->getNumberOfRequiredParameters();
$nbArgs = $rm->getNumberOfParameters();
/* Check the number of arguments. */
if ($nbParams < $nbArgsFix) {
throw new UsageException("TooManyArgs", "You must provide at least $nbArgsFix arguments.", UsageException::TOO_MANY_ARGS);
}
if ($nbParams > $nbArgs) {
throw new UsageException("TooFewArgs", "You must provide at most $nbArgs arguments.", UsageException::TOO_FEW_ARGS);
}
$this->log("Calling '".$this->func."'");
$this->log("Params: ".print_r($params, true), 2);
return call_user_func_array(array($this, $this->func), $params);
}
}