X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModule%2FApi%2FApiResponse.php;h=b5b2a4717c45bf9a25c9a34c15a1463aff8d5769;hb=97642e770b0260bc5d7e067e40e818ccdeff6141;hp=61886412a0f641c9ccff68a0a208c1b3f139cdd0;hpb=dbcaf5192315d00f73c88d54e413c827fd31759b;p=friendica.git diff --git a/src/Module/Api/ApiResponse.php b/src/Module/Api/ApiResponse.php index 61886412a0..b5b2a4717c 100644 --- a/src/Module/Api/ApiResponse.php +++ b/src/Module/Api/ApiResponse.php @@ -1,21 +1,40 @@ . + * + */ namespace Friendica\Module\Api; use Friendica\App\Arguments; use Friendica\App\BaseURL; use Friendica\Core\L10n; +use Friendica\Module\Response; use Friendica\Util\Arrays; use Friendica\Util\DateTimeFormat; -use Friendica\Util\HTTPInputData; use Friendica\Util\XML; use Psr\Log\LoggerInterface; use Friendica\Factory\Api\Twitter\User as TwitterUser; /** - * This class is used to format and return API responses + * This class is used to format and create API responses */ -class ApiResponse +class ApiResponse extends Response { /** @var L10n */ protected $l10n; @@ -23,42 +42,18 @@ class ApiResponse protected $args; /** @var LoggerInterface */ protected $logger; + /** @var BaseURL */ + protected $baseUrl; + /** @var TwitterUser */ + protected $twitterUser; - /** - * @param L10n $l10n - * @param Arguments $args - * @param LoggerInterface $logger - */ - public function __construct(L10n $l10n, Arguments $args, LoggerInterface $logger, BaseURL $baseurl, TwitterUser $twitteruser) + public function __construct(L10n $l10n, Arguments $args, LoggerInterface $logger, BaseURL $baseUrl, TwitterUser $twitterUser) { $this->l10n = $l10n; $this->args = $args; $this->logger = $logger; - $this->baseurl = $baseurl; - $this->twitterUser = $twitteruser; - } - - /** - * Sets header directly - * mainly used to override it for tests - * - * @param string $header - */ - protected function setHeader(string $header) - { - header($header); - } - - /** - * Prints output directly to the caller - * mainly used to override it for tests - * - * @param string $output - */ - protected function printOutput(string $output) - { - echo $output; - exit; + $this->baseUrl = $baseUrl; + $this->twitterUser = $twitterUser; } /** @@ -104,7 +99,7 @@ class ApiResponse $data3 = [$root_element => $data2]; - return XML::fromArray($data3, $xml, false, $namespaces); + return XML::fromArray($data3, $dummy, false, $namespaces); } /** @@ -112,9 +107,10 @@ class ApiResponse * * @param array $arr Array to be passed to template * @param int $cid Contact ID of template + * * @return array */ - private function addRSSValues(array $arr, int $cid) + private function addRSSValues(array $arr, int $cid): array { if (empty($cid)) { return $arr; @@ -125,12 +121,12 @@ class ApiResponse $arr['$user'] = $user_info; $arr['$rss'] = [ 'alternate' => $user_info['url'], - 'self' => $this->baseurl . '/' . $this->args->getQueryString(), - 'base' => $this->baseurl, - 'updated' => DateTimeFormat::utc(null, DateTimeFormat::API), + 'self' => $this->baseUrl . '/' . $this->args->getQueryString(), + 'base' => $this->baseUrl, + 'updated' => DateTimeFormat::utcNow(DateTimeFormat::API), 'atom_updated' => DateTimeFormat::utcNow(DateTimeFormat::ATOM), 'language' => $user_info['lang'], - 'logo' => $this->baseurl . '/images/friendica-32.png', + 'logo' => $this->baseUrl . '/images/friendica-32.png', ]; return $arr; @@ -154,6 +150,7 @@ class ApiResponse case 'atom': case 'xml': return $this->createXML($data, $root_element); + case 'json': default: return $data; @@ -222,10 +219,11 @@ class ApiResponse switch ($format) { case 'xml': - $this->setHeader('Content-Type: text/xml'); + $this->setType(static::TYPE_XML); break; + case 'json': - $this->setHeader('Content-Type: application/json'); + $this->setType(static::TYPE_JSON); if (!empty($return)) { $json = json_encode(end($return)); if (!empty($_GET['callback'])) { @@ -234,26 +232,41 @@ class ApiResponse $return = $json; } break; + case 'rss': - $this->setHeader('Content-Type: application/rss+xml'); + $this->setType(static::TYPE_RSS); break; + case 'atom': - $this->setHeader('Content-Type: application/atom+xml'); + $this->setType(static::TYPE_ATOM); break; } - $this->printOutput($return); + $this->addContent($return); + } + + /** + * Wrapper around exit() for JSON only responses + * + * @param array $data + * + * @return void + */ + public function exitWithJson(array $data) + { + $this->exit('content', ['content' => $data], static::TYPE_JSON); } /** * Quit execution with the message that the endpoint isn't implemented * * @param string $method + * @param array $request (optional) The request content of the current call for later analysis * * @return void * @throws \Exception */ - public function unsupported(string $method = 'all') + public function unsupported(string $method = 'all', array $request = []) { $path = $this->args->getQueryString(); $this->logger->info('Unimplemented API call', @@ -261,11 +274,10 @@ class ApiResponse 'method' => $method, 'path' => $path, 'agent' => $_SERVER['HTTP_USER_AGENT'] ?? '', - 'request' => HTTPInputData::process() + 'request' => $request, ]); - $error = $this->l10n->t('API endpoint %s %s is not implemented', strtoupper($method), $path); - $error_description = $this->l10n->t('The API endpoint is currently not implemented but might be in the future.'); + $error = $this->l10n->t('API endpoint %s %s is not implemented but might be in the future.', strtoupper($method), $path); - $this->exit('error', ['error' => ['error' => $error, 'error_description' => $error_description]]); + $this->error(501, 'Not Implemented', $error); } }