diff --git a/include/api.php b/include/api.php index 9ed7d74218..b291b6e002 100644 --- a/include/api.php +++ b/include/api.php @@ -391,6 +391,7 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $ return prepare_photo_data($type, false, $resource_id, $uid); } else { throw new InternalServerErrorException("image upload failed"); + DI::page()->exit(DI::apiResponse()); } } diff --git a/src/App.php b/src/App.php index f3f7429db0..d4e3021f82 100644 --- a/src/App.php +++ b/src/App.php @@ -702,7 +702,11 @@ class App // Let the module run it's internal process (init, get, post, ...) $response = $module->run($_POST, $_REQUEST); - $page->run($this, $this->baseURL, $this->args, $this->mode, $response, $this->l10n, $this->profiler, $this->config, $pconfig); + if ($response->getType() === $response::TYPE_HTML) { + $page->run($this, $this->baseURL, $this->args, $this->mode, $response, $this->l10n, $this->profiler, $this->config, $pconfig); + } else { + $page->exit($response); + } } catch (HTTPException $e) { (new ModuleHTTPException())->rawContent($e); } diff --git a/src/App/Page.php b/src/App/Page.php index 7996dca94f..7019d45985 100644 --- a/src/App/Page.php +++ b/src/App/Page.php @@ -371,6 +371,24 @@ class Page implements ArrayAccess $this->footerScripts[] = trim($url, '/'); } + /** + * Directly exit with the current response (include setting all headers) + * + * @param IRespondToRequests $response + */ + public function exit(IRespondToRequests $response) + { + foreach ($response->getHeaders() as $key => $header) { + if (empty($key)) { + header($header); + } else { + header("$key: $header"); + } + } + + echo $response->getContent(); + } + /** * Executes the creation of the current page and prints it to the screen * @@ -434,13 +452,11 @@ class Page implements ArrayAccess $this->page['nav'] = Nav::build($app); } - foreach ($response->getHeaders() as $key => $values) { - if (is_array($values)) { - foreach ($values as $value) { - header($key, $value); - } + foreach ($response->getHeaders() as $key => $header) { + if (empty($key)) { + header($header); } else { - header($key, $values); + header("$key: $header"); } } diff --git a/src/BaseModule.php b/src/BaseModule.php index c68af875d7..423e11c7a5 100644 --- a/src/BaseModule.php +++ b/src/BaseModule.php @@ -23,7 +23,7 @@ namespace Friendica; use Friendica\App\Router; use Friendica\Capabilities\ICanHandleRequests; -use Friendica\Capabilities\ICanReadAndWriteToResponds; +use Friendica\Capabilities\ICanCreateResponses; use Friendica\Capabilities\IRespondToRequests; use Friendica\Core\Hook; use Friendica\Core\L10n; @@ -60,7 +60,7 @@ abstract class BaseModule implements ICanHandleRequests protected $profiler; /** @var array */ protected $server; - /** @var ICanReadAndWriteToResponds */ + /** @var ICanCreateResponses */ protected $response; public function __construct(L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = []) @@ -168,12 +168,6 @@ abstract class BaseModule implements ICanHandleRequests { } - /** Gets the name of the current class */ - public function getClassName(): string - { - return static::class; - } - /** * {@inheritDoc} */ @@ -211,27 +205,23 @@ abstract class BaseModule implements ICanHandleRequests Core\Hook::callAll($this->args->getModuleName() . '_mod_init', $placeholder); $this->profiler->set(microtime(true) - $timestamp, 'init'); - $this->response->setType(IRespondToRequests::TYPE_CONTENT); - switch ($this->server['REQUEST_METHOD']) { + switch ($this->server['REQUEST_METHOD'] ?? Router::GET) { case Router::DELETE: - $this->response->setType(IRespondToRequests::TYPE_DELETE); $this->delete(); break; case Router::PATCH: - $this->response->setType(IRespondToRequests::TYPE_PATCH); $this->patch(); break; case Router::POST: Core\Hook::callAll($this->args->getModuleName() . '_mod_post', $post); - $this->response->setType(IRespondToRequests::TYPE_POST); $this->post($request, $post); break; case Router::PUT: - $this->response->setType(IRespondToRequests::TYPE_PUT); $this->put(); break; default: + $timestamp = microtime(true); // "rawContent" is especially meant for technical endpoints. // This endpoint doesn't need any theme initialization or other comparable stuff. $this->rawContent($request); @@ -243,6 +233,8 @@ abstract class BaseModule implements ICanHandleRequests $this->response->addContent($this->content($_REQUEST)); } catch (HTTPException $e) { $this->response->addContent((new ModuleHTTPException())->content($e)); + } finally { + $this->profiler->set(microtime(true) - $timestamp, 'content'); } break; } diff --git a/src/Capabilities/ICanCreateResponses.php b/src/Capabilities/ICanCreateResponses.php new file mode 100644 index 0000000000..282458136b --- /dev/null +++ b/src/Capabilities/ICanCreateResponses.php @@ -0,0 +1,33 @@ +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; } /** @@ -125,12 +102,12 @@ class ApiResponse $arr['$user'] = $user_info; $arr['$rss'] = [ 'alternate' => $user_info['url'], - 'self' => $this->baseurl . '/' . $this->args->getQueryString(), - 'base' => $this->baseurl, + 'self' => $this->baseUrl . '/' . $this->args->getQueryString(), + 'base' => $this->baseUrl, 'updated' => DateTimeFormat::utc(null, 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; @@ -242,7 +219,7 @@ class ApiResponse break; } - $this->printOutput($return); + $this->addContent($return); } /** diff --git a/src/Module/Api/Friendica/Activity.php b/src/Module/Api/Friendica/Activity.php index c65d32d0e7..aaab6417fb 100644 --- a/src/Module/Api/Friendica/Activity.php +++ b/src/Module/Api/Friendica/Activity.php @@ -57,9 +57,9 @@ class Activity extends BaseApi } else { $ok = 'ok'; } - DI::apiResponse()->exit('ok', ['ok' => $ok], $this->parameters['extension'] ?? null); + $this->response->exit('ok', ['ok' => $ok], $this->parameters['extension'] ?? null); } else { - DI::apiResponse()->error(500, 'Error adding activity', '', $this->parameters['extension'] ?? null); + $this->response->error(500, 'Error adding activity', '', $this->parameters['extension'] ?? null); } } } diff --git a/src/Module/Api/Friendica/DirectMessages/Setseen.php b/src/Module/Api/Friendica/DirectMessages/Setseen.php index 6e1f3675fc..d64b4ee15d 100644 --- a/src/Module/Api/Friendica/DirectMessages/Setseen.php +++ b/src/Module/Api/Friendica/DirectMessages/Setseen.php @@ -42,13 +42,15 @@ class Setseen extends BaseApi // return error if id is zero if (empty($request['id'])) { $answer = ['result' => 'error', 'message' => 'message id not specified']; - DI::apiResponse()->exit('direct_messages_setseen', ['$result' => $answer], $this->parameters['extension'] ?? null); + $this->response->exit('direct_messages_setseen', ['$result' => $answer], $this->parameters['extension'] ?? null); + return; } // error message if specified id is not in database if (!DBA::exists('mail', ['id' => $request['id'], 'uid' => $uid])) { $answer = ['result' => 'error', 'message' => 'message id not in database']; - DI::apiResponse()->exit('direct_messages_setseen', ['$result' => $answer], $this->parameters['extension'] ?? null); + $this->response->exit('direct_messages_setseen', ['$result' => $answer], $this->parameters['extension'] ?? null); + return; } // update seen indicator @@ -58,6 +60,6 @@ class Setseen extends BaseApi $answer = ['result' => 'error', 'message' => 'unknown error']; } - DI::apiResponse()->exit('direct_messages_setseen', ['$result' => $answer], $this->parameters['extension'] ?? null); + $this->response->exit('direct_messages_setseen', ['$result' => $answer], $this->parameters['extension'] ?? null); } } diff --git a/src/Module/Api/Friendica/Events/Index.php b/src/Module/Api/Friendica/Events/Index.php index 177e26f52b..86f79578d1 100644 --- a/src/Module/Api/Friendica/Events/Index.php +++ b/src/Module/Api/Friendica/Events/Index.php @@ -70,6 +70,6 @@ class Index extends BaseApi ]; } - DI::apiResponse()->exit('events', ['events' => $items], $this->parameters['extension'] ?? null); + $this->response->exit('events', ['events' => $items], $this->parameters['extension'] ?? null); } } diff --git a/src/Module/Api/Friendica/Group/Delete.php b/src/Module/Api/Friendica/Group/Delete.php index 9583c003d7..56b3445c0d 100644 --- a/src/Module/Api/Friendica/Group/Delete.php +++ b/src/Module/Api/Friendica/Group/Delete.php @@ -70,7 +70,7 @@ class Delete extends BaseApi if ($ret) { // return success $success = ['success' => $ret, 'gid' => $request['gid'], 'name' => $request['name'], 'status' => 'deleted', 'wrong users' => []]; - DI::apiResponse()->exit('group_delete', ['$result' => $success], $parameters['extension'] ?? null); + $this->response->exit('group_delete', ['$result' => $success], $parameters['extension'] ?? null); } else { throw new BadRequestException('other API error'); } diff --git a/src/Module/Api/Friendica/Notification.php b/src/Module/Api/Friendica/Notification.php index 76bce7de27..597f3d6811 100644 --- a/src/Module/Api/Friendica/Notification.php +++ b/src/Module/Api/Friendica/Notification.php @@ -56,6 +56,6 @@ class Notification extends BaseApi $result = false; } - DI::apiResponse()->exit('notes', ['note' => $result], $this->parameters['extension'] ?? null); + $this->response->exit('notes', ['note' => $result], $this->parameters['extension'] ?? null); } } diff --git a/src/Module/Api/Friendica/Photo/Delete.php b/src/Module/Api/Friendica/Photo/Delete.php index 7da819a7a2..2edf398aab 100644 --- a/src/Module/Api/Friendica/Photo/Delete.php +++ b/src/Module/Api/Friendica/Photo/Delete.php @@ -64,7 +64,7 @@ class Delete extends BaseApi Item::deleteForUser($condition, $uid); $result = ['result' => 'deleted', 'message' => 'photo with id `' . $request['photo_id'] . '` has been deleted from server.']; - DI::apiResponse()->exit('photo_delete', ['$result' => $result], $this->parameters['extension'] ?? null); + $this->response->exit('photo_delete', ['$result' => $result], $this->parameters['extension'] ?? null); } else { throw new InternalServerErrorException("unknown error on deleting photo from database table"); } diff --git a/src/Module/Api/Friendica/Photoalbum/Delete.php b/src/Module/Api/Friendica/Photoalbum/Delete.php index a8bb5d45e9..c7592a5eaf 100644 --- a/src/Module/Api/Friendica/Photoalbum/Delete.php +++ b/src/Module/Api/Friendica/Photoalbum/Delete.php @@ -67,7 +67,7 @@ class Delete extends BaseApi // return success of deletion or error message if ($result) { $answer = ['result' => 'deleted', 'message' => 'album `' . $request['album'] . '` with all containing photos has been deleted.']; - DI::apiResponse()->exit('photoalbum_delete', ['$result' => $answer], $this->parameters['extension'] ?? null); + $this->response->exit('photoalbum_delete', ['$result' => $answer], $this->parameters['extension'] ?? null); } else { throw new InternalServerErrorException("unknown error - deleting from database failed"); } diff --git a/src/Module/Api/Friendica/Photoalbum/Update.php b/src/Module/Api/Friendica/Photoalbum/Update.php index d4d6017909..87513c5ad4 100644 --- a/src/Module/Api/Friendica/Photoalbum/Update.php +++ b/src/Module/Api/Friendica/Photoalbum/Update.php @@ -59,7 +59,7 @@ class Update extends BaseApi // return success of updating or error message if ($result) { $answer = ['result' => 'updated', 'message' => 'album `' . $request['album'] . '` with all containing photos has been renamed to `' . $request['album_new'] . '`.']; - DI::apiResponse()->exit('photoalbum_update', ['$result' => $answer], $this->parameters['extension'] ?? null); + $this->response->exit('photoalbum_update', ['$result' => $answer], $this->parameters['extension'] ?? null); } else { throw new InternalServerErrorException("unknown error - updating in database failed"); } diff --git a/src/Module/Api/Friendica/Profile/Show.php b/src/Module/Api/Friendica/Profile/Show.php index 27a19f48e5..6e77f9731e 100644 --- a/src/Module/Api/Friendica/Profile/Show.php +++ b/src/Module/Api/Friendica/Profile/Show.php @@ -61,7 +61,7 @@ class Show extends BaseApi 'profiles' => $profiles ]; - DI::apiResponse()->exit('friendica_profiles', ['$result' => $result], $this->parameters['extension'] ?? null); + $this->response->exit('friendica_profiles', ['$result' => $result], $this->parameters['extension'] ?? null); } /** diff --git a/src/Module/Api/GNUSocial/GNUSocial/Config.php b/src/Module/Api/GNUSocial/GNUSocial/Config.php index a3556fcdd9..094fd5a100 100644 --- a/src/Module/Api/GNUSocial/GNUSocial/Config.php +++ b/src/Module/Api/GNUSocial/GNUSocial/Config.php @@ -61,6 +61,6 @@ class Config extends BaseApi ], ]; - DI::apiResponse()->exit('config', ['config' => $config], $this->parameters['extension'] ?? null); + $this->response->exit('config', ['config' => $config], $this->parameters['extension'] ?? null); } } diff --git a/src/Module/Api/GNUSocial/GNUSocial/Version.php b/src/Module/Api/GNUSocial/GNUSocial/Version.php index 67f23628c1..9b2afe128e 100644 --- a/src/Module/Api/GNUSocial/GNUSocial/Version.php +++ b/src/Module/Api/GNUSocial/GNUSocial/Version.php @@ -31,6 +31,6 @@ class Version extends BaseApi { protected function rawContent(array $request = []) { - DI::apiResponse()->exit('version', ['version' => '0.9.7'], $this->parameters['extension'] ?? null); + $this->response->exit('version', ['version' => '0.9.7'], $this->parameters['extension'] ?? null); } } diff --git a/src/Module/Api/GNUSocial/Help/Test.php b/src/Module/Api/GNUSocial/Help/Test.php index e2f05183e6..0a2ef6f831 100644 --- a/src/Module/Api/GNUSocial/Help/Test.php +++ b/src/Module/Api/GNUSocial/Help/Test.php @@ -37,6 +37,6 @@ class Test extends BaseApi $ok = 'ok'; } - DI::apiResponse()->exit('ok', ['ok' => $ok], $this->parameters['extension'] ?? null); + $this->response->exit('ok', ['ok' => $ok], $this->parameters['extension'] ?? null); } } diff --git a/src/Module/Api/Mastodon/Accounts/UpdateCredentials.php b/src/Module/Api/Mastodon/Accounts/UpdateCredentials.php index 1a390d4a1f..8d9fb48695 100644 --- a/src/Module/Api/Mastodon/Accounts/UpdateCredentials.php +++ b/src/Module/Api/Mastodon/Accounts/UpdateCredentials.php @@ -23,7 +23,6 @@ namespace Friendica\Module\Api\Mastodon\Accounts; use Friendica\App\Router; use Friendica\Core\Logger; -use Friendica\DI; use Friendica\Module\BaseApi; use Friendica\Util\HTTPInputData; @@ -41,6 +40,6 @@ class UpdateCredentials extends BaseApi Logger::info('Patch data', ['data' => $data]); - DI::apiResponse()->unsupported(Router::PATCH); + $this->response->unsupported(Router::PATCH); } } diff --git a/src/Module/Api/Mastodon/Filters.php b/src/Module/Api/Mastodon/Filters.php index 38fc27ebc0..3c902bc17b 100644 --- a/src/Module/Api/Mastodon/Filters.php +++ b/src/Module/Api/Mastodon/Filters.php @@ -35,7 +35,7 @@ class Filters extends BaseApi { self::checkAllowedScope(self::SCOPE_WRITE); - DI::apiResponse()->unsupported(Router::POST); + $this->response->unsupported(Router::POST); } /** diff --git a/src/Module/Api/Mastodon/Lists/Accounts.php b/src/Module/Api/Mastodon/Lists/Accounts.php index 66d6f068ec..be87dbf9d1 100644 --- a/src/Module/Api/Mastodon/Lists/Accounts.php +++ b/src/Module/Api/Mastodon/Lists/Accounts.php @@ -25,7 +25,6 @@ use Friendica\App\Router; use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\DI; -use Friendica\Module\Api\ApiResponse; use Friendica\Module\BaseApi; /** @@ -37,12 +36,12 @@ class Accounts extends BaseApi { protected function delete() { - DI::apiResponse()->unsupported(Router::DELETE); + $this->response->unsupported(Router::DELETE); } protected function post(array $request = [], array $post = []) { - DI::apiResponse()->unsupported(Router::POST); + $this->response->unsupported(Router::POST); } /** diff --git a/src/Module/Api/Mastodon/Markers.php b/src/Module/Api/Mastodon/Markers.php index 5cd38925e4..9f208e9262 100644 --- a/src/Module/Api/Mastodon/Markers.php +++ b/src/Module/Api/Mastodon/Markers.php @@ -35,7 +35,7 @@ class Markers extends BaseApi { self::checkAllowedScope(self::SCOPE_WRITE); - DI::apiResponse()->unsupported(Router::POST); + $this->response->unsupported(Router::POST); } /** diff --git a/src/Module/Api/Mastodon/ScheduledStatuses.php b/src/Module/Api/Mastodon/ScheduledStatuses.php index 605aaeb6d6..e79d1e153f 100644 --- a/src/Module/Api/Mastodon/ScheduledStatuses.php +++ b/src/Module/Api/Mastodon/ScheduledStatuses.php @@ -26,7 +26,6 @@ use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Post; -use Friendica\Module\Api\ApiResponse; use Friendica\Module\BaseApi; /** @@ -39,7 +38,7 @@ class ScheduledStatuses extends BaseApi self::checkAllowedScope(self::SCOPE_WRITE); $uid = self::getCurrentUserID(); - DI::apiResponse()->unsupported(Router::PUT); + $this->response->unsupported(Router::PUT); } protected function delete() diff --git a/src/Module/Api/Mastodon/Unimplemented.php b/src/Module/Api/Mastodon/Unimplemented.php index 9874b504a7..22111781bb 100644 --- a/src/Module/Api/Mastodon/Unimplemented.php +++ b/src/Module/Api/Mastodon/Unimplemented.php @@ -22,7 +22,6 @@ namespace Friendica\Module\Api\Mastodon; use Friendica\App\Router; -use Friendica\DI; use Friendica\Module\BaseApi; /** @@ -35,7 +34,7 @@ class Unimplemented extends BaseApi */ protected function delete() { - DI::apiResponse()->unsupported(Router::DELETE); + $this->response->unsupported(Router::DELETE); } /** @@ -43,7 +42,7 @@ class Unimplemented extends BaseApi */ protected function patch() { - DI::apiResponse()->unsupported(Router::PATCH); + $this->response->unsupported(Router::PATCH); } /** @@ -51,7 +50,7 @@ class Unimplemented extends BaseApi */ protected function post(array $request = [], array $post = []) { - DI::apiResponse()->unsupported(Router::POST); + $this->response->unsupported(Router::POST); } /** @@ -59,7 +58,7 @@ class Unimplemented extends BaseApi */ public function put() { - DI::apiResponse()->unsupported(Router::PUT); + $this->response->unsupported(Router::PUT); } /** @@ -67,6 +66,6 @@ class Unimplemented extends BaseApi */ protected function rawContent(array $request = []) { - DI::apiResponse()->unsupported(Router::GET); + $this->response->unsupported(Router::GET); } } diff --git a/src/Module/Api/Twitter/Account/RateLimitStatus.php b/src/Module/Api/Twitter/Account/RateLimitStatus.php index 82cf2c3e66..5f1d37e7b5 100644 --- a/src/Module/Api/Twitter/Account/RateLimitStatus.php +++ b/src/Module/Api/Twitter/Account/RateLimitStatus.php @@ -22,7 +22,6 @@ namespace Friendica\Module\Api\Twitter\Account; use Friendica\Module\BaseApi; -use Friendica\DI; use Friendica\Util\DateTimeFormat; /** @@ -52,6 +51,6 @@ class RateLimitStatus extends BaseApi ]; } - DI::apiResponse()->exit('hash', ['hash' => $hash], $this->parameters['extension'] ?? null); + $this->response->exit('hash', ['hash' => $hash], $this->parameters['extension'] ?? null); } } diff --git a/src/Module/Api/Twitter/ContactEndpoint.php b/src/Module/Api/Twitter/ContactEndpoint.php index 2b2936820d..541f7fd86d 100644 --- a/src/Module/Api/Twitter/ContactEndpoint.php +++ b/src/Module/Api/Twitter/ContactEndpoint.php @@ -27,9 +27,9 @@ use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Profile; use Friendica\Model\User; +use Friendica\Module\Api\ApiResponse; use Friendica\Module\BaseApi; use Friendica\Model\Contact; -use Friendica\Module\Response; use Friendica\Network\HTTPException; use Friendica\Util\Profiler; use Friendica\Util\Strings; @@ -40,9 +40,9 @@ abstract class ContactEndpoint extends BaseApi const DEFAULT_COUNT = 20; const MAX_COUNT = 200; - public function __construct(L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = []) + public function __construct(App $app, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, ApiResponse $response, array $server, array $parameters = []) { - parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); + parent::__construct($app, $l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); self::checkAllowedScope(self::SCOPE_READ); } diff --git a/src/Module/Api/Twitter/SavedSearches.php b/src/Module/Api/Twitter/SavedSearches.php index 3fd30e34ea..31824a8d4c 100644 --- a/src/Module/Api/Twitter/SavedSearches.php +++ b/src/Module/Api/Twitter/SavedSearches.php @@ -22,7 +22,6 @@ namespace Friendica\Module\Api\Twitter; use Friendica\Database\DBA; -use Friendica\DI; use Friendica\Module\BaseApi; /** @@ -45,6 +44,6 @@ class SavedSearches extends BaseApi DBA::close($terms); - DI::apiResponse()->exit('terms', ['terms' => $result], $this->parameters['extension'] ?? null); + $this->response->exit('terms', ['terms' => $result], $this->parameters['extension'] ?? null); } } diff --git a/src/Module/BaseApi.php b/src/Module/BaseApi.php index 03a28951e3..009809376e 100644 --- a/src/Module/BaseApi.php +++ b/src/Module/BaseApi.php @@ -21,18 +21,23 @@ namespace Friendica\Module; +use Friendica\App; use Friendica\BaseModule; +use Friendica\Core\L10n; use Friendica\Core\Logger; use Friendica\Core\System; use Friendica\DI; use Friendica\Model\Contact; use Friendica\Model\Post; use Friendica\Model\User; +use Friendica\Module\Api\ApiResponse; use Friendica\Network\HTTPException; use Friendica\Security\BasicAuth; use Friendica\Security\OAuth; use Friendica\Util\DateTimeFormat; use Friendica\Util\HTTPInputData; +use Friendica\Util\Profiler; +use Psr\Log\LoggerInterface; class BaseApi extends BaseModule { @@ -53,12 +58,23 @@ class BaseApi extends BaseModule */ protected static $request = []; + /** @var App */ + protected $app; + + /** @var ApiResponse */ + protected $response; + + public function __construct(App $app, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, ApiResponse $response, array $server, array $parameters = []) + { + parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); + } + protected function delete() { self::checkAllowedScope(self::SCOPE_WRITE); - if (!DI::app()->isLoggedIn()) { - throw new HTTPException\ForbiddenException(DI::l10n()->t('Permission denied.')); + if (!$this->app->isLoggedIn()) { + throw new HTTPException\ForbiddenException($this->t('Permission denied.')); } } @@ -66,8 +82,8 @@ class BaseApi extends BaseModule { self::checkAllowedScope(self::SCOPE_WRITE); - if (!DI::app()->isLoggedIn()) { - throw new HTTPException\ForbiddenException(DI::l10n()->t('Permission denied.')); + if (!$this->app->isLoggedIn()) { + throw new HTTPException\ForbiddenException($this->t('Permission denied.')); } } @@ -75,8 +91,8 @@ class BaseApi extends BaseModule { self::checkAllowedScope(self::SCOPE_WRITE); - if (!DI::app()->isLoggedIn()) { - throw new HTTPException\ForbiddenException(DI::l10n()->t('Permission denied.')); + if (!$this->app->isLoggedIn()) { + throw new HTTPException\ForbiddenException($this->t('Permission denied.')); } } @@ -84,8 +100,8 @@ class BaseApi extends BaseModule { self::checkAllowedScope(self::SCOPE_WRITE); - if (!DI::app()->isLoggedIn()) { - throw new HTTPException\ForbiddenException(DI::l10n()->t('Permission denied.')); + if (!$this->app->isLoggedIn()) { + throw new HTTPException\ForbiddenException($this->t('Permission denied.')); } } diff --git a/src/Module/HTTPException/PageNotFound.php b/src/Module/HTTPException/PageNotFound.php index 4971ed3cd0..0ec357656f 100644 --- a/src/Module/HTTPException/PageNotFound.php +++ b/src/Module/HTTPException/PageNotFound.php @@ -22,6 +22,7 @@ namespace Friendica\Module\HTTPException; use Friendica\BaseModule; +use Friendica\Capabilities\IRespondToRequests; use Friendica\DI; use Friendica\Network\HTTPException; @@ -32,7 +33,7 @@ class PageNotFound extends BaseModule throw new HTTPException\NotFoundException(DI::l10n()->t('Page not found.')); } - public function run(array $post = [], array $request = []): string + public function run(array $post = [], array $request = []): IRespondToRequests { /* The URL provided does not resolve to a valid module. * diff --git a/src/Module/NodeInfo110.php b/src/Module/NodeInfo110.php index 9e5a4cac97..6681dcc020 100644 --- a/src/Module/NodeInfo110.php +++ b/src/Module/NodeInfo110.php @@ -21,11 +21,15 @@ namespace Friendica\Module; +use Friendica\App; use Friendica\BaseModule; +use Friendica\Capabilities\IRespondToRequests; use Friendica\Core\Addon; -use Friendica\Core\System; -use Friendica\DI; +use Friendica\Core\Config\Capability\IManageConfigValues; +use Friendica\Core\L10n; use Friendica\Model\Nodeinfo; +use Friendica\Util\Profiler; +use Psr\Log\LoggerInterface; /** * Version 1.0 of Nodeinfo, a standardized way of exposing metadata about a server running one of the distributed social networks. @@ -33,10 +37,18 @@ use Friendica\Model\Nodeinfo; */ class NodeInfo110 extends BaseModule { + /** @var IManageConfigValues */ + protected $config; + + public function __construct(L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, IManageConfigValues $config, array $server, array $parameters = []) + { + parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); + + $this->config = $config; + } + protected function rawContent(array $request = []) { - $config = DI::config(); - $nodeinfo = [ 'version' => '1.0', 'software' => [ @@ -53,19 +65,19 @@ class NodeInfo110 extends BaseModule ], 'services' => [], 'usage' => [], - 'openRegistrations' => intval($config->get('config', 'register_policy')) !== Register::CLOSED, + 'openRegistrations' => intval($this->config->get('config', 'register_policy')) !== Register::CLOSED, 'metadata' => [ - 'nodeName' => $config->get('config', 'sitename'), + 'nodeName' => $this->config->get('config', 'sitename'), ], ]; - if (!empty($config->get('system', 'diaspora_enabled'))) { - $nodeinfo['protocols']['inbound'][] = 'diaspora'; + if (!empty($this->config->get('system', 'diaspora_enabled'))) { + $nodeinfo['protocols']['inbound'][] = 'diaspora'; $nodeinfo['protocols']['outbound'][] = 'diaspora'; } - if (empty($config->get('system', 'ostatus_disabled'))) { - $nodeinfo['protocols']['inbound'][] = 'gnusocial'; + if (empty($this->config->get('system', 'ostatus_disabled'))) { + $nodeinfo['protocols']['inbound'][] = 'gnusocial'; $nodeinfo['protocols']['outbound'][] = 'gnusocial'; } @@ -73,10 +85,10 @@ class NodeInfo110 extends BaseModule $nodeinfo['services'] = Nodeinfo::getServices(); - $nodeinfo['metadata']['protocols'] = $nodeinfo['protocols']; + $nodeinfo['metadata']['protocols'] = $nodeinfo['protocols']; $nodeinfo['metadata']['protocols']['outbound'][] = 'atom1.0'; - $nodeinfo['metadata']['protocols']['inbound'][] = 'atom1.0'; - $nodeinfo['metadata']['protocols']['inbound'][] = 'rss2.0'; + $nodeinfo['metadata']['protocols']['inbound'][] = 'atom1.0'; + $nodeinfo['metadata']['protocols']['inbound'][] = 'rss2.0'; $nodeinfo['metadata']['services'] = $nodeinfo['services']; @@ -84,8 +96,9 @@ class NodeInfo110 extends BaseModule $nodeinfo['metadata']['services']['inbound'][] = 'twitter'; } - $nodeinfo['metadata']['explicitContent'] = $config->get('system', 'explicit_content', false) == true; + $nodeinfo['metadata']['explicitContent'] = $this->config->get('system', 'explicit_content', false) == true; - System::jsonExit($nodeinfo, 'application/json; charset=utf-8', JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + $this->response->setType(IRespondToRequests::TYPE_JSON); + $this->response->addContent(json_encode($nodeinfo, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); } } diff --git a/src/Module/NodeInfo120.php b/src/Module/NodeInfo120.php index b0d5b18c8c..ea25653779 100644 --- a/src/Module/NodeInfo120.php +++ b/src/Module/NodeInfo120.php @@ -21,11 +21,15 @@ namespace Friendica\Module; +use Friendica\App; use Friendica\BaseModule; +use Friendica\Capabilities\IRespondToRequests; use Friendica\Core\Addon; -use Friendica\Core\System; -use Friendica\DI; +use Friendica\Core\Config\Capability\IManageConfigValues; +use Friendica\Core\L10n; use Friendica\Model\Nodeinfo; +use Friendica\Util\Profiler; +use Psr\Log\LoggerInterface; /** * Version 2.0 of Nodeinfo, a standardized way of exposing metadata about a server running one of the distributed social networks. @@ -33,30 +37,38 @@ use Friendica\Model\Nodeinfo; */ class NodeInfo120 extends BaseModule { + /** @var IManageConfigValues */ + protected $config; + + public function __construct(L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, IManageConfigValues $config, array $server, array $parameters = []) + { + parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); + + $this->config = $config; + } + protected function rawContent(array $request = []) { - $config = DI::config(); - $nodeinfo = [ - 'version' => '2.0', - 'software' => [ + 'version' => '2.0', + 'software' => [ 'name' => 'friendica', 'version' => FRIENDICA_VERSION . '-' . DB_UPDATE_VERSION, ], 'protocols' => ['dfrn', 'activitypub'], 'services' => [], 'usage' => [], - 'openRegistrations' => intval($config->get('config', 'register_policy')) !== Register::CLOSED, + 'openRegistrations' => intval($this->config->get('config', 'register_policy')) !== Register::CLOSED, 'metadata' => [ - 'nodeName' => $config->get('config', 'sitename'), + 'nodeName' => $this->config->get('config', 'sitename'), ], ]; - if (!empty($config->get('system', 'diaspora_enabled'))) { + if (!empty($this->config->get('system', 'diaspora_enabled'))) { $nodeinfo['protocols'][] = 'diaspora'; } - if (empty($config->get('system', 'ostatus_disabled'))) { + if (empty($this->config->get('system', 'ostatus_disabled'))) { $nodeinfo['protocols'][] = 'ostatus'; } @@ -72,12 +84,13 @@ class NodeInfo120 extends BaseModule $nodeinfo['services']['inbound'][] = 'rss2.0'; $nodeinfo['services']['outbound'][] = 'atom1.0'; - if (function_exists('imap_open') && !$config->get('system', 'imap_disabled')) { + if (function_exists('imap_open') && !$this->config->get('system', 'imap_disabled')) { $nodeinfo['services']['inbound'][] = 'imap'; } - $nodeinfo['metadata']['explicitContent'] = $config->get('system', 'explicit_content', false) == true; + $nodeinfo['metadata']['explicitContent'] = $this->config->get('system', 'explicit_content', false) == true; - System::jsonExit($nodeinfo, 'application/json; charset=utf-8', JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + $this->response->setType(IRespondToRequests::TYPE_JSON, 'application/json; charset=utf-8'); + $this->response->addContent(json_encode($nodeinfo, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); } } diff --git a/src/Module/NodeInfo210.php b/src/Module/NodeInfo210.php index 3584e19d73..a354046254 100644 --- a/src/Module/NodeInfo210.php +++ b/src/Module/NodeInfo210.php @@ -21,11 +21,15 @@ namespace Friendica\Module; +use Friendica\App; use Friendica\BaseModule; use Friendica\Core\Addon; +use Friendica\Core\Config\Capability\IManageConfigValues; +use Friendica\Core\L10n; use Friendica\Core\System; -use Friendica\DI; use Friendica\Model\Nodeinfo; +use Friendica\Util\Profiler; +use Psr\Log\LoggerInterface; /** * Version 1.0 of Nodeinfo 2, a sStandardized way of exposing metadata about a server running one of the distributed social networks. @@ -33,30 +37,38 @@ use Friendica\Model\Nodeinfo; */ class NodeInfo210 extends BaseModule { + /** @var IManageConfigValues */ + protected $config; + + public function __construct(L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, IManageConfigValues $config, array $server, array $parameters = []) + { + parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); + + $this->config = $config; + } + protected function rawContent(array $request = []) { - $config = DI::config(); - $nodeinfo = [ - 'version' => '1.0', - 'server' => [ - 'baseUrl' => DI::baseUrl()->get(), - 'name' => $config->get('config', 'sitename'), + 'version' => '1.0', + 'server' => [ + 'baseUrl' => $this->baseUrl->get(), + 'name' => $this->config->get('config', 'sitename'), 'software' => 'friendica', 'version' => FRIENDICA_VERSION . '-' . DB_UPDATE_VERSION, ], - 'organization' => Nodeinfo::getOrganization($config), + 'organization' => Nodeinfo::getOrganization($this->config), 'protocols' => ['dfrn', 'activitypub'], 'services' => [], - 'openRegistrations' => intval($config->get('config', 'register_policy')) !== Register::CLOSED, + 'openRegistrations' => intval($this->config->get('config', 'register_policy')) !== Register::CLOSED, 'usage' => [], ]; - if (!empty($config->get('system', 'diaspora_enabled'))) { + if (!empty($this->config->get('system', 'diaspora_enabled'))) { $nodeinfo['protocols'][] = 'diaspora'; } - if (empty($config->get('system', 'ostatus_disabled'))) { + if (empty($this->config->get('system', 'ostatus_disabled'))) { $nodeinfo['protocols'][] = 'ostatus'; } @@ -72,7 +84,7 @@ class NodeInfo210 extends BaseModule $nodeinfo['services']['inbound'][] = 'rss2.0'; $nodeinfo['services']['outbound'][] = 'atom1.0'; - if (function_exists('imap_open') && !$config->get('system', 'imap_disabled')) { + if (function_exists('imap_open') && !$this->config->get('system', 'imap_disabled')) { $nodeinfo['services']['inbound'][] = 'imap'; } diff --git a/src/Module/Response.php b/src/Module/Response.php index 87fbbf07cc..4cf9f9667e 100644 --- a/src/Module/Response.php +++ b/src/Module/Response.php @@ -2,14 +2,14 @@ namespace Friendica\Module; -use Friendica\Capabilities\ICanReadAndWriteToResponds; +use Friendica\Capabilities\ICanCreateResponses; use Friendica\Capabilities\IRespondToRequests; use Friendica\Network\HTTPException\InternalServerErrorException; -class Response implements ICanReadAndWriteToResponds +class Response implements ICanCreateResponses { /** - * @var string[][] + * @var string[] */ protected $headers = []; /** @@ -19,20 +19,30 @@ class Response implements ICanReadAndWriteToResponds /** * @var string */ - protected $type = IRespondToRequests::TYPE_CONTENT; + protected $type = IRespondToRequests::TYPE_HTML; /** * {@inheritDoc} */ - public function addHeader(string $key, string $value) + public function setHeader(?string $header = null, ?string $key = null): void { - $this->headers[$key][] = $value; + if (!isset($header) && !empty($key)) { + unset($this->headers[$key]); + } + + if (isset($header)) { + if (empty($key)) { + $this->headers[] = $header; + } else { + $this->headers[$key] = $header; + } + } } /** * {@inheritDoc} */ - public function addContent(string $content) + public function addContent($content): void { $this->content .= $content; } @@ -48,7 +58,7 @@ class Response implements ICanReadAndWriteToResponds /** * {@inheritDoc} */ - public function getContent(): string + public function getContent() { return $this->content; } @@ -56,19 +66,31 @@ class Response implements ICanReadAndWriteToResponds /** * {@inheritDoc} */ - public function setType(string $type) + public function setType(string $type, ?string $content_type = null): void { if (!in_array($type, IRespondToRequests::ALLOWED_TYPES)) { throw new InternalServerErrorException('wrong type'); } + switch ($type) { + case static::TYPE_JSON: + $content_type = $content_type ?? 'application/json'; + break; + case static::TYPE_XML: + $content_type = $content_type ?? 'text/xml'; + break; + } + + + $this->setHeader($content_type, 'Content-type'); + $this->type = $type; } /** * {@inheritDoc} */ - public function getTyp(): string + public function getType(): string { return $this->type; } diff --git a/tests/Util/ApiResponseDouble.php b/tests/Util/ApiResponseDouble.php index cc1402c7a6..a702c17fda 100644 --- a/tests/Util/ApiResponseDouble.php +++ b/tests/Util/ApiResponseDouble.php @@ -28,7 +28,7 @@ class ApiResponseDouble extends ApiResponse /** * The header list * - * @var string[] + * @var string[][] */ protected static $header = []; @@ -61,9 +61,22 @@ class ApiResponseDouble extends ApiResponse self::$header = []; } - protected function setHeader(string $header) + /** + * {@inheritDoc} + */ + public function setHeader(?string $header = null, ?string $key = null): void { - static::$header[] = $header; + if (!isset($header) && !empty($key)) { + unset(static::$header[$key]); + } + + if (isset($header)) { + if (empty($key)) { + static::$header[] = $header; + } else { + static::$header[$key] = $header; + } + } } protected function printOutput(string $output) diff --git a/tests/src/Module/Api/ApiResponseTest.php b/tests/src/Module/Api/ApiResponseTest.php index 524c9ebd17..aba8c808a5 100644 --- a/tests/src/Module/Api/ApiResponseTest.php +++ b/tests/src/Module/Api/ApiResponseTest.php @@ -6,19 +6,12 @@ use Friendica\App\Arguments; use Friendica\App\BaseURL; use Friendica\Core\L10n; use Friendica\Factory\Api\Twitter\User; +use Friendica\Module\Api\ApiResponse; use Friendica\Test\MockedTest; -use Friendica\Test\Util\ApiResponseDouble; use Psr\Log\NullLogger; class ApiResponseTest extends MockedTest { - protected function tearDown(): void - { - ApiResponseDouble::reset(); - - parent::tearDown(); - } - public function testErrorWithJson() { $l10n = \Mockery::mock(L10n::class); @@ -27,10 +20,10 @@ class ApiResponseTest extends MockedTest $baseUrl = \Mockery::mock(BaseURL::class); $twitterUser = \Mockery::mock(User::class); - $response = new ApiResponseDouble($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); + $response = new ApiResponse($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); $response->error(200, 'OK', 'error_message', 'json'); - self::assertEquals('{"error":"error_message","code":"200 OK","request":""}', ApiResponseDouble::getOutput()); + self::assertEquals('{"error":"error_message","code":"200 OK","request":""}', $response->getContent()); } public function testErrorWithXml() @@ -41,7 +34,7 @@ class ApiResponseTest extends MockedTest $baseUrl = \Mockery::mock(BaseURL::class); $twitterUser = \Mockery::mock(User::class); - $response = new ApiResponseDouble($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); + $response = new ApiResponse($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); $response->error(200, 'OK', 'error_message', 'xml'); self::assertEquals('' . "\n" . @@ -52,7 +45,7 @@ class ApiResponseTest extends MockedTest ' 200 OK' . "\n" . ' ' . "\n" . '' . "\n", - ApiResponseDouble::getOutput()); + $response->getContent()); } public function testErrorWithRss() @@ -63,7 +56,7 @@ class ApiResponseTest extends MockedTest $baseUrl = \Mockery::mock(BaseURL::class); $twitterUser = \Mockery::mock(User::class); - $response = new ApiResponseDouble($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); + $response = new ApiResponse($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); $response->error(200, 'OK', 'error_message', 'rss'); self::assertEquals( @@ -75,7 +68,7 @@ class ApiResponseTest extends MockedTest ' 200 OK' . "\n" . ' ' . "\n" . '' . "\n", - ApiResponseDouble::getOutput()); + $response->getContent()); } public function testErrorWithAtom() @@ -86,7 +79,7 @@ class ApiResponseTest extends MockedTest $baseUrl = \Mockery::mock(BaseURL::class); $twitterUser = \Mockery::mock(User::class); - $response = new ApiResponseDouble($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); + $response = new ApiResponse($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); $response->error(200, 'OK', 'error_message', 'atom'); self::assertEquals( @@ -98,7 +91,7 @@ class ApiResponseTest extends MockedTest ' 200 OK' . "\n" . ' ' . "\n" . '' . "\n", - ApiResponseDouble::getOutput()); + $response->getContent()); } public function testUnsupported() @@ -112,9 +105,9 @@ class ApiResponseTest extends MockedTest $baseUrl = \Mockery::mock(BaseURL::class); $twitterUser = \Mockery::mock(User::class); - $response = new ApiResponseDouble($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); + $response = new ApiResponse($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); $response->unsupported(); - self::assertEquals('{"error":"API endpoint %s %s is not implemented","error_description":"The API endpoint is currently not implemented but might be in the future."}', ApiResponseDouble::getOutput()); + self::assertEquals('{"error":"API endpoint %s %s is not implemented","error_description":"The API endpoint is currently not implemented but might be in the future."}', $response->getContent()); } } diff --git a/tests/src/Module/Api/ApiTest.php b/tests/src/Module/Api/ApiTest.php index e168c26555..c530ace2ee 100644 --- a/tests/src/Module/Api/ApiTest.php +++ b/tests/src/Module/Api/ApiTest.php @@ -25,10 +25,8 @@ use Friendica\Core\Addon; use Friendica\Core\Hook; use Friendica\Database\Database; use Friendica\DI; -use Friendica\Module\Api\ApiResponse; use Friendica\Security\Authentication; use Friendica\Test\FixtureTest; -use Friendica\Test\Util\ApiResponseDouble; use Friendica\Test\Util\AuthenticationDouble; abstract class ApiTest extends FixtureTest @@ -53,20 +51,12 @@ abstract class ApiTest extends FixtureTest parent::setUp(); // TODO: Change the autogenerated stub $this->dice = $this->dice - ->addRule(Authentication::class, ['instanceOf' => AuthenticationDouble::class, 'shared' => true]) - ->addRule(ApiResponse::class, ['instanceOf' => ApiResponseDouble::class, 'shared' => true]); + ->addRule(Authentication::class, ['instanceOf' => AuthenticationDouble::class, 'shared' => true]); DI::init($this->dice); $this->installAuthTest(); } - protected function tearDown(): void - { - ApiResponseDouble::reset(); - - parent::tearDown(); - } - /** * installs auththest. * diff --git a/tests/src/Module/Api/Friendica/NotificationTest.php b/tests/src/Module/Api/Friendica/NotificationTest.php index 125e7d63d0..b78715864e 100644 --- a/tests/src/Module/Api/Friendica/NotificationTest.php +++ b/tests/src/Module/Api/Friendica/NotificationTest.php @@ -23,9 +23,7 @@ namespace Friendica\Test\src\Module\Api\Friendica; use Friendica\DI; use Friendica\Module\Api\Friendica\Notification; -use Friendica\Network\HTTPException\BadRequestException; use Friendica\Test\src\Module\Api\ApiTest; -use Friendica\Test\Util\ApiResponseDouble; use Friendica\Util\DateTimeFormat; use Friendica\Util\Temporal; @@ -67,19 +65,17 @@ class NotificationTest extends ApiTest XML; - $notification = new Notification(DI::l10n(), ['extension' => 'xml']); - $notification->rawContent(); + $notification = new Notification(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'xml']); + $response = $notification->run(); - self::assertXmlStringEqualsXmlString($assertXml, ApiResponseDouble::getOutput()); + self::assertXmlStringEqualsXmlString($assertXml, $response->getContent()); } public function testWithJsonResult() { - $notification = new Notification(DI::l10n(),['parameter' => 'json']); - $notification->rawContent(); + $notification = new Notification(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json']); + $response = $notification->run(); - $result = json_encode(ApiResponseDouble::getOutput()); - - self::assertJson($result); + self::assertJson($response->getContent()); } } diff --git a/tests/src/Module/Api/Friendica/Photo/DeleteTest.php b/tests/src/Module/Api/Friendica/Photo/DeleteTest.php index 0958110115..42e3f77c04 100644 --- a/tests/src/Module/Api/Friendica/Photo/DeleteTest.php +++ b/tests/src/Module/Api/Friendica/Photo/DeleteTest.php @@ -31,7 +31,7 @@ class DeleteTest extends ApiTest public function testEmpty() { $this->expectException(BadRequestException::class); - (new Delete(DI::l10n()))->rawContent(); + (new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))->run(); } public function testWithoutAuthenticatedUser() @@ -42,7 +42,7 @@ class DeleteTest extends ApiTest public function testWrong() { $this->expectException(BadRequestException::class); - (new Delete(DI::l10n(), ['photo_id' => 1]))->rawContent(); + (new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))->run(['photo_id' => 1]); } public function testWithCorrectPhotoId() diff --git a/tests/src/Module/Api/Friendica/Photoalbum/DeleteTest.php b/tests/src/Module/Api/Friendica/Photoalbum/DeleteTest.php index aabd7e581c..118257c55b 100644 --- a/tests/src/Module/Api/Friendica/Photoalbum/DeleteTest.php +++ b/tests/src/Module/Api/Friendica/Photoalbum/DeleteTest.php @@ -31,13 +31,14 @@ class DeleteTest extends ApiTest public function testEmpty() { $this->expectException(BadRequestException::class); - (new Delete(DI::l10n()))->rawContent(); + (new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))->run(); + } public function testWrong() { $this->expectException(BadRequestException::class); - (new Delete(DI::l10n(), ['album' => 'album_name']))->rawContent(); + (new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))->run(['album' => 'album_name']); } public function testValid() diff --git a/tests/src/Module/Api/Friendica/Photoalbum/UpdateTest.php b/tests/src/Module/Api/Friendica/Photoalbum/UpdateTest.php index 51414302fa..464845745f 100644 --- a/tests/src/Module/Api/Friendica/Photoalbum/UpdateTest.php +++ b/tests/src/Module/Api/Friendica/Photoalbum/UpdateTest.php @@ -31,19 +31,19 @@ class UpdateTest extends ApiTest public function testEmpty() { $this->expectException(BadRequestException::class); - (new Update(DI::l10n()))->rawContent(); + (new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))->run(); } public function testTooFewArgs() { $this->expectException(BadRequestException::class); - (new Update(DI::l10n(), ['album' => 'album_name']))->rawContent(); + (new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))->run(['album' => 'album_name']); } public function testWrongUpdate() { $this->expectException(BadRequestException::class); - (new Update(DI::l10n(), ['album' => 'album_name', 'album_new' => 'album_name']))->rawContent(); + (new Update(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), []))->run(['album' => 'album_name', 'album_new' => 'album_name']); } public function testWithoutAuthenticatedUser() diff --git a/tests/src/Module/Api/GnuSocial/GnuSocial/VersionTest.php b/tests/src/Module/Api/GnuSocial/GnuSocial/VersionTest.php index 448f6ce145..88bce964ca 100644 --- a/tests/src/Module/Api/GnuSocial/GnuSocial/VersionTest.php +++ b/tests/src/Module/Api/GnuSocial/GnuSocial/VersionTest.php @@ -5,17 +5,14 @@ namespace Friendica\Test\src\Module\Api\GnuSocial\GnuSocial; use Friendica\DI; use Friendica\Module\Api\GNUSocial\GNUSocial\Version; use Friendica\Test\src\Module\Api\ApiTest; -use Friendica\Test\Util\ApiResponseDouble; class VersionTest extends ApiTest { public function test() { - $version = new Version(DI::l10n(), ['extension' => 'json']); - $version->rawContent(); + $version = new Version(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json']); + $response = $version->run(); - $result = json_decode(ApiResponseDouble::getOutput()); - - self::assertEquals('0.9.7', $result); + self::assertEquals('"0.9.7"', $response->getContent()); } } diff --git a/tests/src/Module/Api/GnuSocial/Help/TestTest.php b/tests/src/Module/Api/GnuSocial/Help/TestTest.php index 40d8e9750e..82ceefec9b 100644 --- a/tests/src/Module/Api/GnuSocial/Help/TestTest.php +++ b/tests/src/Module/Api/GnuSocial/Help/TestTest.php @@ -5,23 +5,22 @@ namespace Friendica\Test\src\Module\Api\GnuSocial\Help; use Friendica\DI; use Friendica\Module\Api\GNUSocial\Help\Test; use Friendica\Test\src\Module\Api\ApiTest; -use Friendica\Test\Util\ApiResponseDouble; class TestTest extends ApiTest { public function testJson() { - $test = new Test(DI::l10n(), ['extension' => 'json']); - $test->rawContent(); + $test = new Test(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json']); + $response = $test->run(); - self::assertEquals('"ok"', ApiResponseDouble::getOutput()); + self::assertEquals('"ok"', $response->getContent()); } public function testXml() { - $test = new Test(DI::l10n(), ['extension' => 'xml']); - $test->rawContent(); + $test = new Test(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'xml']); + $response = $test->run(); - self::assertxml(ApiResponseDouble::getOutput(), 'ok'); + self::assertxml($response->getContent(), 'ok'); } } diff --git a/tests/src/Module/Api/Twitter/Account/RateLimitStatusTest.php b/tests/src/Module/Api/Twitter/Account/RateLimitStatusTest.php index 93d76933ba..66821cea16 100644 --- a/tests/src/Module/Api/Twitter/Account/RateLimitStatusTest.php +++ b/tests/src/Module/Api/Twitter/Account/RateLimitStatusTest.php @@ -5,16 +5,15 @@ namespace Friendica\Test\src\Module\Api\Twitter\Account; use Friendica\DI; use Friendica\Module\Api\Twitter\Account\RateLimitStatus; use Friendica\Test\src\Module\Api\ApiTest; -use Friendica\Test\Util\ApiResponseDouble; class RateLimitStatusTest extends ApiTest { public function testWithJson() { - $rateLimitStatus = new RateLimitStatus(DI::l10n(), ['extension' => 'json']); - $rateLimitStatus->rawContent(); + $rateLimitStatus = new RateLimitStatus(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json']); + $response = $rateLimitStatus->run(); - $result = json_decode(ApiResponseDouble::getOutput()); + $result = json_decode($response->getContent()); self::assertEquals(150, $result->remaining_hits); self::assertEquals(150, $result->hourly_limit); @@ -23,9 +22,9 @@ class RateLimitStatusTest extends ApiTest public function testWithXml() { - $rateLimitStatus = new RateLimitStatus(DI::l10n(),['extension' => 'xml']); - $rateLimitStatus->rawContent(); + $rateLimitStatus = new RateLimitStatus(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'xml']); + $response = $rateLimitStatus->run(); - self::assertXml(ApiResponseDouble::getOutput(), 'hash'); + self::assertXml($response->getContent(), 'hash'); } } diff --git a/tests/src/Module/Api/Twitter/SavedSearchesTest.php b/tests/src/Module/Api/Twitter/SavedSearchesTest.php index 8e066d4bad..497a063106 100644 --- a/tests/src/Module/Api/Twitter/SavedSearchesTest.php +++ b/tests/src/Module/Api/Twitter/SavedSearchesTest.php @@ -5,16 +5,15 @@ namespace Friendica\Test\src\Module\Api\Twitter; use Friendica\DI; use Friendica\Module\Api\Twitter\SavedSearches; use Friendica\Test\src\Module\Api\ApiTest; -use Friendica\Test\Util\ApiResponseDouble; class SavedSearchesTest extends ApiTest { public function test() { - $savedSearch = new SavedSearches(DI::l10n(), ['extension' => 'json']); - $savedSearch->rawContent(); + $savedSearch = new SavedSearches(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json']); + $response = $savedSearch->run(); - $result = json_decode(ApiResponseDouble::getOutput()); + $result = json_decode($response->getContent()); self::assertEquals(1, $result[0]->id); self::assertEquals(1, $result[0]->id_str);