diff options
Diffstat (limited to 'library/Director/RestApi/RequestHandler.php')
-rw-r--r-- | library/Director/RestApi/RequestHandler.php | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/library/Director/RestApi/RequestHandler.php b/library/Director/RestApi/RequestHandler.php new file mode 100644 index 0000000..6f66889 --- /dev/null +++ b/library/Director/RestApi/RequestHandler.php @@ -0,0 +1,86 @@ +<?php + +namespace Icinga\Module\Director\RestApi; + +use Exception; +use gipfl\Json\JsonString; +use Icinga\Module\Director\Db; +use Icinga\Web\Request; +use Icinga\Web\Response; + +abstract class RequestHandler +{ + /** @var Request */ + protected $request; + + /** @var Response */ + protected $response; + + /** @var Db */ + protected $db; + + public function __construct(Request $request, Response $response, Db $db) + { + $this->request = $request; + $this->response = $response; + $this->db = $db; + } + + abstract protected function processApiRequest(); + + public function dispatch() + { + $this->processApiRequest(); + } + + public function sendJson($object) + { + $this->response->setHeader('Content-Type', 'application/json', true); + $this->response->sendHeaders(); + echo JsonString::encode($object, JSON_PRETTY_PRINT) . "\n"; + } + + public function sendJsonError($error, $code = null) + { + $response = $this->response; + if ($code === null) { + if ($response->getHttpResponseCode() === 200) { + $response->setHttpResponseCode(500); + } + } else { + $response->setHttpResponseCode((int) $code); + } + + if ($error instanceof Exception) { + $message = $error->getMessage(); + } else { + $message = $error; + } + + $response->sendHeaders(); + $result = ['error' => $message]; + if ($this->request->getUrl()->getParam('showStacktrace')) { + $result['trace'] = $error->getTraceAsString(); + } + $this->sendJson((object) $result); + } + + // TODO: just return json_last_error_msg() for PHP >= 5.5.0 + protected function getLastJsonError() + { + switch (json_last_error()) { + case JSON_ERROR_DEPTH: + return 'The maximum stack depth has been exceeded'; + case JSON_ERROR_CTRL_CHAR: + return 'Control character error, possibly incorrectly encoded'; + case JSON_ERROR_STATE_MISMATCH: + return 'Invalid or malformed JSON'; + case JSON_ERROR_SYNTAX: + return 'Syntax error'; + case JSON_ERROR_UTF8: + return 'Malformed UTF-8 characters, possibly incorrectly encoded'; + default: + return 'An error occured when parsing a JSON string'; + } + } +} |