From 6a9fff5100fa58e07a9812bb1836f3caca854379 Mon Sep 17 00:00:00 2001 From: Philipp Date: Mon, 22 Nov 2021 00:07:09 +0100 Subject: [PATCH] Fixing Response --- src/App.php | 2 +- src/Capabilities/ICanCreateResponses.php | 5 +++++ src/Module/Api/ApiResponse.php | 8 ++++---- src/Module/Response.php | 13 +++++++++---- tests/src/Module/Api/ApiResponseTest.php | 3 +++ tests/src/Module/Api/Friendica/NotificationTest.php | 5 +++++ .../Module/Api/GnuSocial/GnuSocial/VersionTest.php | 2 ++ tests/src/Module/Api/GnuSocial/Help/TestTest.php | 3 +++ .../Api/Twitter/Account/RateLimitStatusTest.php | 3 +++ tests/src/Module/Api/Twitter/SavedSearchesTest.php | 2 ++ tests/src/Module/NodeInfoTest.php | 7 ++++--- 11 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/App.php b/src/App.php index 30194af8e..c80518c19 100644 --- a/src/App.php +++ b/src/App.php @@ -704,7 +704,7 @@ class App // Let the module run it's internal process (init, get, post, ...) $response = $module->run($_POST, $_REQUEST); - if ($response->getHeaderLine('X-RESPONSE-TYPE') === ICanCreateResponses::TYPE_HTML) { + if ($response->getHeaderLine(ICanCreateResponses::X_HEADER) === ICanCreateResponses::TYPE_HTML) { $page->run($this, $this->baseURL, $this->args, $this->mode, $response, $this->l10n, $this->profiler, $this->config, $pconfig); } else { $page->exit($response); diff --git a/src/Capabilities/ICanCreateResponses.php b/src/Capabilities/ICanCreateResponses.php index 21a7b1bde..0cd5348c5 100644 --- a/src/Capabilities/ICanCreateResponses.php +++ b/src/Capabilities/ICanCreateResponses.php @@ -7,6 +7,11 @@ use Psr\Http\Message\ResponseInterface; interface ICanCreateResponses { + /** + * This constant helps to find the specific return type of responses inside the headers array + */ + const X_HEADER = 'X-RESPONSE-TYPE'; + const TYPE_HTML = 'html'; const TYPE_XML = 'xml'; const TYPE_JSON = 'json'; diff --git a/src/Module/Api/ApiResponse.php b/src/Module/Api/ApiResponse.php index 8a28e5766..863e1d21d 100644 --- a/src/Module/Api/ApiResponse.php +++ b/src/Module/Api/ApiResponse.php @@ -199,10 +199,10 @@ class ApiResponse extends Response 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'])) { @@ -212,10 +212,10 @@ class ApiResponse extends Response } 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; } diff --git a/src/Module/Response.php b/src/Module/Response.php index 29df82c04..d24ebe954 100644 --- a/src/Module/Response.php +++ b/src/Module/Response.php @@ -19,7 +19,7 @@ class Response implements ICanCreateResponses /** * @var string */ - protected $type = ICanCreateResponses::TYPE_HTML; + protected $type = self::TYPE_HTML; /** * {@inheritDoc} @@ -68,7 +68,7 @@ class Response implements ICanCreateResponses */ public function setType(string $type, ?string $content_type = null): void { - if (!in_array($type, ICanCreateResponses::ALLOWED_TYPES)) { + if (!in_array($type, static::ALLOWED_TYPES)) { throw new InternalServerErrorException('wrong type'); } @@ -79,9 +79,14 @@ class Response implements ICanCreateResponses case static::TYPE_XML: $content_type = $content_type ?? 'text/xml'; break; + case static::TYPE_RSS: + $content_type = $content_type ?? 'application/rss+xml'; + break; + case static::TYPE_ATOM: + $content_type = $content_type ?? 'application/atom+xml'; + break; } - $this->setHeader($content_type, 'Content-type'); $this->type = $type; @@ -101,7 +106,7 @@ class Response implements ICanCreateResponses public function generate(): ResponseInterface { // Setting the response type as an X-header for direct usage - $this->headers['X-RESPONSE-TYPE'] = $this->type; + $this->headers[static::X_HEADER] = $this->type; return new \GuzzleHttp\Psr7\Response(200, $this->headers, $this->content); } diff --git a/tests/src/Module/Api/ApiResponseTest.php b/tests/src/Module/Api/ApiResponseTest.php index aba8c808a..99e3a8d5d 100644 --- a/tests/src/Module/Api/ApiResponseTest.php +++ b/tests/src/Module/Api/ApiResponseTest.php @@ -37,6 +37,7 @@ class ApiResponseTest extends MockedTest $response = new ApiResponse($l10n, $args, new NullLogger(), $baseUrl, $twitterUser); $response->error(200, 'OK', 'error_message', 'xml'); + self::assertEquals(['Content-type' => 'text/xml', 'HTTP/1.1 200 OK'], $response->getHeaders()); self::assertEquals('' . "\n" . 'error(200, 'OK', 'error_message', 'rss'); + self::assertEquals(['Content-type' => 'application/rss+xml', 'HTTP/1.1 200 OK'], $response->getHeaders()); self::assertEquals( '' . "\n" . 'error(200, 'OK', 'error_message', 'atom'); + self::assertEquals(['Content-type' => 'application/atom+xml', 'HTTP/1.1 200 OK'], $response->getHeaders()); self::assertEquals( '' . "\n" . ' 'xml']); $response = $notification->run(); + print_r($response->getHeaders()); + self::assertXmlStringEqualsXmlString($assertXml, (string)$response->getBody()); + self::assertEquals(['Content-type' => ['text/xml'], ICanCreateResponses::X_HEADER => ['xml']], $response->getHeaders()); } public function testWithJsonResult() @@ -77,5 +81,6 @@ XML; $response = $notification->run(); self::assertJson($response->getBody()); + self::assertEquals(['Content-type' => ['application/json'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders()); } } diff --git a/tests/src/Module/Api/GnuSocial/GnuSocial/VersionTest.php b/tests/src/Module/Api/GnuSocial/GnuSocial/VersionTest.php index e5057f09b..0f6531831 100644 --- a/tests/src/Module/Api/GnuSocial/GnuSocial/VersionTest.php +++ b/tests/src/Module/Api/GnuSocial/GnuSocial/VersionTest.php @@ -2,6 +2,7 @@ namespace Friendica\Test\src\Module\Api\GnuSocial\GnuSocial; +use Friendica\Capabilities\ICanCreateResponses; use Friendica\DI; use Friendica\Module\Api\GNUSocial\GNUSocial\Version; use Friendica\Test\src\Module\Api\ApiTest; @@ -13,6 +14,7 @@ class VersionTest extends ApiTest $version = new Version(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json']); $response = $version->run(); + self::assertEquals(['Content-type' => ['application/json'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders()); self::assertEquals('"0.9.7"', $response->getBody()); } } diff --git a/tests/src/Module/Api/GnuSocial/Help/TestTest.php b/tests/src/Module/Api/GnuSocial/Help/TestTest.php index 85bc89e00..5aa428681 100644 --- a/tests/src/Module/Api/GnuSocial/Help/TestTest.php +++ b/tests/src/Module/Api/GnuSocial/Help/TestTest.php @@ -2,6 +2,7 @@ namespace Friendica\Test\src\Module\Api\GnuSocial\Help; +use Friendica\Capabilities\ICanCreateResponses; use Friendica\DI; use Friendica\Module\Api\GNUSocial\Help\Test; use Friendica\Test\src\Module\Api\ApiTest; @@ -13,6 +14,7 @@ class TestTest extends ApiTest $test = new Test(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'json']); $response = $test->run(); + self::assertEquals(['Content-type' => ['application/json'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders()); self::assertEquals('"ok"', $response->getBody()); } @@ -21,6 +23,7 @@ class TestTest extends ApiTest $test = new Test(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'xml']); $response = $test->run(); + self::assertEquals(['Content-type' => ['text/xml'], ICanCreateResponses::X_HEADER => ['xml']], $response->getHeaders()); self::assertxml($response->getBody(), 'ok'); } } diff --git a/tests/src/Module/Api/Twitter/Account/RateLimitStatusTest.php b/tests/src/Module/Api/Twitter/Account/RateLimitStatusTest.php index aa76c1bf5..64becb75c 100644 --- a/tests/src/Module/Api/Twitter/Account/RateLimitStatusTest.php +++ b/tests/src/Module/Api/Twitter/Account/RateLimitStatusTest.php @@ -2,6 +2,7 @@ namespace Friendica\Test\src\Module\Api\Twitter\Account; +use Friendica\Capabilities\ICanCreateResponses; use Friendica\DI; use Friendica\Module\Api\Twitter\Account\RateLimitStatus; use Friendica\Test\src\Module\Api\ApiTest; @@ -15,6 +16,7 @@ class RateLimitStatusTest extends ApiTest $result = json_decode($response->getBody()); + self::assertEquals(['Content-type' => ['application/json'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders()); self::assertEquals(150, $result->remaining_hits); self::assertEquals(150, $result->hourly_limit); self::assertIsInt($result->reset_time_in_seconds); @@ -25,6 +27,7 @@ class RateLimitStatusTest extends ApiTest $rateLimitStatus = new RateLimitStatus(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), [], ['extension' => 'xml']); $response = $rateLimitStatus->run(); + self::assertEquals(['Content-type' => ['text/xml'], ICanCreateResponses::X_HEADER => ['xml']], $response->getHeaders()); self::assertXml($response->getBody(), 'hash'); } } diff --git a/tests/src/Module/Api/Twitter/SavedSearchesTest.php b/tests/src/Module/Api/Twitter/SavedSearchesTest.php index 0b20335c4..14973b391 100644 --- a/tests/src/Module/Api/Twitter/SavedSearchesTest.php +++ b/tests/src/Module/Api/Twitter/SavedSearchesTest.php @@ -2,6 +2,7 @@ namespace Friendica\Test\src\Module\Api\Twitter; +use Friendica\Capabilities\ICanCreateResponses; use Friendica\DI; use Friendica\Module\Api\Twitter\SavedSearches; use Friendica\Test\src\Module\Api\ApiTest; @@ -15,6 +16,7 @@ class SavedSearchesTest extends ApiTest $result = json_decode($response->getBody()); + self::assertEquals(['Content-type' => ['application/json'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders()); self::assertEquals(1, $result[0]->id); self::assertEquals(1, $result[0]->id_str); self::assertEquals('Saved search', $result[0]->name); diff --git a/tests/src/Module/NodeInfoTest.php b/tests/src/Module/NodeInfoTest.php index cb1670533..53a2926f9 100644 --- a/tests/src/Module/NodeInfoTest.php +++ b/tests/src/Module/NodeInfoTest.php @@ -2,6 +2,7 @@ namespace Friendica\Test\src\Module; +use Friendica\Capabilities\ICanCreateResponses; use Friendica\DI; use Friendica\Module\NodeInfo110; use Friendica\Module\NodeInfo120; @@ -19,7 +20,7 @@ class NodeInfoTest extends FixtureTest $response = $nodeinfo->run(); self::assertJson($response->getBody()); - self::assertEquals(['Content-type' => ['application/json']], $response->getHeaders()); + self::assertEquals(['Content-type' => ['application/json'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders()); $json = json_decode($response->getBody()); @@ -42,7 +43,7 @@ class NodeInfoTest extends FixtureTest $response = $nodeinfo->run(); self::assertJson($response->getBody()); - self::assertEquals(['Content-type' => ['application/json; charset=utf-8']], $response->getHeaders()); + self::assertEquals(['Content-type' => ['application/json; charset=utf-8'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders()); $json = json_decode($response->getBody()); @@ -64,7 +65,7 @@ class NodeInfoTest extends FixtureTest $response = $nodeinfo->run(); self::assertJson($response->getBody()); - self::assertEquals(['Content-type' => ['application/json; charset=utf-8']], $response->getHeaders()); + self::assertEquals(['Content-type' => ['application/json; charset=utf-8'], ICanCreateResponses::X_HEADER => ['json']], $response->getHeaders()); $json = json_decode($response->getBody());