use Friendica\App\Arguments;
use Friendica\Core\L10n;
-use Friendica\Core\Logger;
-use Friendica\Core\System;
-use Friendica\DI;
-use Friendica\Object\Api\Mastodon\Error;
use Friendica\Util\Arrays;
use Friendica\Util\HTTPInputData;
use Friendica\Util\XML;
+use Psr\Log\LoggerInterface;
/**
* This class is used to format and return API responses
protected $l10n;
/** @var Arguments */
protected $args;
+ /** @var LoggerInterface */
+ protected $logger;
/**
- * @param L10n $l10n
- * @param Arguments $args
+ * @param L10n $l10n
+ * @param Arguments $args
+ * @param LoggerInterface $logger
*/
- public function __construct(L10n $l10n, Arguments $args)
+ public function __construct(L10n $l10n, Arguments $args, LoggerInterface $logger)
{
- $this->l10n = $l10n;
- $this->args = $args;
+ $this->l10n = $l10n;
+ $this->args = $args;
+ $this->logger = $logger;
+ }
+
+ /**
+ * 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;
}
/**
case 'atom':
case 'rss':
case 'xml':
- $ret = $this->createXML($data, $root_element);
- break;
+ return $this->createXML($data, $root_element);
case 'json':
default:
- $ret = $data;
- break;
+ return $data;
}
- return $ret;
}
/**
'request' => $this->args->getQueryString()
];
- header(($_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.1') . ' ' . $code . ' ' . $description);
+ $this->setHeader(($_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.1') . ' ' . $code . ' ' . $description);
$this->exit('status', ['status' => $error], $format);
}
switch ($format) {
case 'xml':
- header('Content-Type: text/xml');
+ $this->setHeader('Content-Type: text/xml');
break;
case 'json':
- header('Content-Type: application/json');
+ $this->setHeader('Content-Type: application/json');
if (!empty($return)) {
$json = json_encode(end($return));
if (!empty($_GET['callback'])) {
}
break;
case 'rss':
- header('Content-Type: application/rss+xml');
- $return = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $return;
+ $this->setHeader('Content-Type: application/rss+xml');
break;
case 'atom':
- header('Content-Type: application/atom+xml');
- $return = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $return;
+ $this->setHeader('Content-Type: application/atom+xml');
break;
}
- echo $return;
- exit;
+ $this->printOutput($return);
}
/**
* @return void
* @throws \Exception
*/
- public static function unsupported(string $method = 'all')
+ public function unsupported(string $method = 'all')
{
- $path = DI::args()->getQueryString();
- Logger::info('Unimplemented API call',
+ $path = $this->args->getQueryString();
+ $this->logger->info('Unimplemented API call',
[
'method' => $method,
'path' => $path,
'agent' => $_SERVER['HTTP_USER_AGENT'] ?? '',
'request' => HTTPInputData::process()
]);
- $error = DI::l10n()->t('API endpoint %s %s is not implemented', strtoupper($method), $path);
- $error_description = DI::l10n()->t('The API endpoint is currently not implemented but might be in the future.');
- $errorobj = new Error($error, $error_description);
- System::jsonError(501, $errorobj->toArray());
+ $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.');
+
+ $this->exit('error', ['error' => ['error' => $error, 'error_description' => $error_description]]);
}
}