icingaweb2/library/Icinga/Web/Response/JsonResponse.php

240 lines
5.2 KiB
PHP

<?php
/* Icinga Web 2 | (c) 2015 Icinga Development Team | GPLv2+ */
namespace Icinga\Web\Response;
use Icinga\Util\Json;
use Zend_Controller_Action_HelperBroker;
use Icinga\Web\Response;
/**
* HTTP response in JSON format
*/
class JsonResponse extends Response
{
/**
* {@inheritdoc}
*/
const DEFAULT_CONTENT_TYPE = 'application/json';
/**
* Status identifier for failed API calls due to an error on the server
*
* @var string
*/
const STATUS_ERROR = 'error';
/**
* Status identifier for rejected API calls most due to invalid data or call conditions
*
* @var string
*/
const STATUS_FAIL = 'fail';
/**
* Status identifier for successful API requests
*
* @var string
*/
const STATUS_SUCCESS = 'success';
/**
* JSON encoding options
*
* @var int
*/
protected $encodingOptions = 0;
/**
* Whether to automatically sanitize invalid UTF-8 (if any)
*
* @var bool
*/
protected $autoSanitize = false;
/**
* Error message if the API call failed due to a server error
*
* @var string|null
*/
protected $errorMessage;
/**
* Fail data for rejected API calls
*
* @var array|null
*/
protected $failData;
/**
* API request status
*
* @var string
*/
protected $status;
/**
* Success data for successful API requests
*
* @var array|null
*/
protected $successData;
/**
* Get the JSON encoding options
*
* @return int
*/
public function getEncodingOptions()
{
return $this->encodingOptions;
}
/**
* Set the JSON encoding options
*
* @param int $encodingOptions
*
* @return $this
*/
public function setEncodingOptions($encodingOptions)
{
$this->encodingOptions = (int) $encodingOptions;
return $this;
}
/**
* Get whether to automatically sanitize invalid UTF-8 (if any)
*
* @return bool
*/
public function getAutoSanitize()
{
return $this->autoSanitize;
}
/**
* Set whether to automatically sanitize invalid UTF-8 (if any)
*
* @param bool $autoSanitize
*
* @return $this
*/
public function setAutoSanitize($autoSanitize = true)
{
$this->autoSanitize = $autoSanitize;
return $this;
}
/**
* Get the error message if the API call failed due to a server error
*
* @return string|null
*/
public function getErrorMessage()
{
return $this->errorMessage;
}
/**
* Set the error message if the API call failed due to a server error
*
* @param string $errorMessage
*
* @return $this
*/
public function setErrorMessage($errorMessage)
{
$this->errorMessage = (string) $errorMessage;
$this->status = static::STATUS_ERROR;
return $this;
}
/**
* Get the fail data for rejected API calls
*
* @return array|null
*/
public function getFailData()
{
return (! is_array($this->failData) || empty($this->failData)) ? null : $this->failData;
}
/**
* Set the fail data for rejected API calls
*
* @param array $failData
*
* @return $this
*/
public function setFailData(array $failData)
{
$this->failData = $failData;
$this->status = static::STATUS_FAIL;
return $this;
}
/**
* Get the data for successful API requests
*
* @return array|null
*/
public function getSuccessData()
{
return (! is_array($this->successData) || empty($this->successData)) ? null : $this->successData;
}
/**
* Set the data for successful API requests
*
* @param array $successData
*
* @return $this
*/
public function setSuccessData(array $successData = null)
{
$this->successData = $successData;
$this->status = static::STATUS_SUCCESS;
return $this;
}
/**
* {@inheritdoc}
*/
public function outputBody()
{
$body = array(
'status' => $this->status
);
switch ($this->status) {
/** @noinspection PhpMissingBreakStatementInspection */
case static::STATUS_ERROR:
$body['message'] = $this->getErrorMessage();
// Fallthrough
case static::STATUS_FAIL:
$failData = $this->getFailData();
if ($failData !== null || $this->status === static::STATUS_FAIL) {
$body['data'] = $failData;
}
break;
case static::STATUS_SUCCESS:
$body['data'] = $this->getSuccessData();
break;
}
echo $this->getAutoSanitize()
? Json::sanitize($body, $this->getEncodingOptions())
: Json::encode($body, $this->getEncodingOptions());
}
/**
* {@inheritdoc}
*/
public function sendResponse()
{
Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->setNoRender(true);
parent::sendResponse();
exit;
}
}