icingaweb2-module-director/library/Director/Core/RestApiResponse.php

128 lines
3.5 KiB
PHP
Raw Normal View History

2015-09-14 16:23:43 +02:00
<?php
namespace Icinga\Module\Director\Core;
use Icinga\Exception\IcingaException;
2015-09-14 16:23:43 +02:00
class RestApiResponse
{
protected $errorMessage;
protected $results;
protected function __construct()
{
}
public static function fromJsonResult($json)
{
$response = new static;
return $response->parseJsonResult($json);
}
public static function fromErrorMessage($error)
{
$response = new static;
$response->errorMessage = $error;
return $response;
}
public function getResult($desiredKey, $filter = array())
{
return $this->extractResult($this->results, $desiredKey, $filter);
}
public function getSingleResult()
{
if ($this->isErrorCode($this->results[0]->code)) {
throw new IcingaException(
$this->results[0]->status
);
} else {
return $this->results[0]->result;
}
}
protected function isErrorCode($code)
{
$code = (int) ceil($code);
return $code >= 400;
}
protected function extractResult($results, $desiredKey, $filter = array())
2015-09-14 16:23:43 +02:00
{
$response = array();
foreach ($results as $result) {
2015-09-14 16:23:43 +02:00
foreach ($filter as $key => $val) {
if (! property_exists($result, $key)) {
continue;
}
if ($result->$key !== $val) {
continue;
}
}
if (! property_exists($result, $desiredKey)) {
continue;
}
$response[$result->$desiredKey] = $result;
}
return $response;
}
public function getErrorMessage()
{
return $this->errorMessage;
}
public function succeeded()
{
return $this->errorMessage === null;
}
protected function parseJsonResult($json)
{
$result = @json_decode($json);
if ($result === null) {
$this->setJsonError();
throw new IcingaException('Parsing JSON result failed: ' . $this->errorMessage);
2015-09-14 16:23:43 +02:00
}
if (property_exists($result, 'error')) {
if (property_exists($result, 'status')) {
throw new IcingaException('API request failed: ' . $result->status);
} else {
throw new IcingaException('API request failed: ' . var_export($result, 1));
}
}
2015-09-14 16:23:43 +02:00
$this->results = $result->results; // TODO: Check if set
return $this;
}
// TODO: just return json_last_error_msg() for PHP >= 5.5.0
2015-09-14 16:23:43 +02:00
protected function setJsonError()
{
switch (json_last_error()) {
case JSON_ERROR_DEPTH:
$this->errorMessage = 'The maximum stack depth has been exceeded';
break;
case JSON_ERROR_CTRL_CHAR:
$this->errorMessage = 'Control character error, possibly incorrectly encoded';
break;
case JSON_ERROR_STATE_MISMATCH:
$this->errorMessage = 'Invalid or malformed JSON';
break;
case JSON_ERROR_SYNTAX:
$this->errorMessage = 'Syntax error';
break;
case JSON_ERROR_UTF8:
$this->errorMessage = 'Malformed UTF-8 characters, possibly incorrectly encoded';
break;
2015-09-14 16:23:43 +02:00
default:
$this->errorMessage = 'An error occured when parsing a JSON string';
2015-09-14 16:23:43 +02:00
}
return $this;
}
}