From f1fe4cc4834697d6b47ff4449b81832cf9eb972d Mon Sep 17 00:00:00 2001 From: Matthew Baggett Date: Sun, 14 Apr 2024 18:38:17 +0200 Subject: [PATCH] Json flapping --- composer.json | 1 + src/App.php | 2 + src/Middleware/JsonResponse.php | 107 ++++++++++++++++++ .../JsonResponseUnpackerMiddleware.php | 24 ++++ tests/Traits/AppTestTrait.php | 11 ++ 5 files changed, 145 insertions(+) create mode 100644 src/Middleware/JsonResponse.php create mode 100644 src/Middleware/JsonResponseUnpackerMiddleware.php diff --git a/composer.json b/composer.json index 4d20cdf..c45d642 100644 --- a/composer.json +++ b/composer.json @@ -34,6 +34,7 @@ "cocur/slugify": "^4.0", "doctrine/annotations": "^1.10", "donatj/flags": "^1.4", + "ergebnis/json": "^1.2", "fakerphp/faker": "^1.14.1", "friendsofphp/php-cs-fixer": "^3.0", "kint-php/kint": "^4.0", diff --git a/src/App.php b/src/App.php index 61cbadb..bb0deae 100644 --- a/src/App.php +++ b/src/App.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Benzine; use Benzine\Middleware\JsonResponseExecTimeMiddleware; +use Benzine\Middleware\JsonResponseUnpackerMiddleware; use Benzine\Middleware\JsonValidationMiddleware; use Benzine\ORM\Connection\Databases; use Benzine\ORM\Laminator; @@ -106,6 +107,7 @@ class App $this->app->addBodyParsingMiddleware(); $this->app->addRoutingMiddleware(); $this->app->add($container->get(JsonResponseExecTimeMiddleware::class)); + $this->app->add($container->get(JsonResponseUnpackerMiddleware::class)); // Determine if we're going to enable debug mode $this->debugMode = $this->environmentService->get('DEBUG_MODE', 'off') == 'on'; diff --git a/src/Middleware/JsonResponse.php b/src/Middleware/JsonResponse.php new file mode 100644 index 0000000..5c02bd3 --- /dev/null +++ b/src/Middleware/JsonResponse.php @@ -0,0 +1,107 @@ +response = $response; + } + public function getJson() : Json + { + $this->getBody()->rewind(); + $json = Json::fromString($this->getBody()->getContents()); + $this->getBody()->rewind(); + return $json; + } + public function setJson(Json $json) : self + { + $this->getBody()->rewind(); + $this->getBody()->write($json->toString()); + $this->getBody()->rewind(); + return $this; + } + + public function getProtocolVersion() + { + return $this->response->getProtocolVersion(); + } + + public function withProtocolVersion(string $version) + { + return $this->response->withProtocolVersion($version); + } + + public function getHeaders() + { + return $this->response->getHeaders(); + } + + public function hasHeader(string $name) + { + return $this->response->hasHeader($name); + } + + public function getHeader(string $name) + { + return $this->response->getHeader($name); + } + + public function getHeaderLine(string $name) + { + return $this->response->getHeaderLine($name); + } + + public function withHeader(string $name, $value) + { + return $this->response->withHeader($name, $value); + } + + public function withAddedHeader(string $name, $value) + { + return $this->response->withAddedHeader($name, $value); + } + + public function withoutHeader(string $name) + { + return $this->response->withoutHeader($name); + } + + public function getBody() + { + return $this->response->getBody(); + } + + public function withBody(StreamInterface $body) + { + return $this->response->withBody($body); + } + + public function getStatusCode() + { + return $this->response->getStatusCode(); + } + + public function withStatus(int $code, string $reasonPhrase = '') + { + return $this->response->withStatus($code, $reasonPhrase); + } + + public function getReasonPhrase() + { + return $this->response->getReasonPhrase(); + } + +} \ No newline at end of file diff --git a/src/Middleware/JsonResponseUnpackerMiddleware.php b/src/Middleware/JsonResponseUnpackerMiddleware.php new file mode 100644 index 0000000..54b59e7 --- /dev/null +++ b/src/Middleware/JsonResponseUnpackerMiddleware.php @@ -0,0 +1,24 @@ +handle($request); + + if(!($response->hasHeader("Content-Type") && $response->getHeader("Content-Type")[0] === "application/json") ) { + return $response; + } + return new JsonResponse($response); + } +} \ No newline at end of file diff --git a/tests/Traits/AppTestTrait.php b/tests/Traits/AppTestTrait.php index 97e7db0..5a9a95c 100644 --- a/tests/Traits/AppTestTrait.php +++ b/tests/Traits/AppTestTrait.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Benzine\Tests\Traits; use Benzine\App as BenzineApp; +use Benzine\Middleware\JsonResponse; use DI\Container; use PHPUnit\Framework\MockObject\MockObject; use Psr\Http\Message\ResponseInterface; @@ -13,6 +14,8 @@ use Psr\Http\Message\UriInterface; use Slim\App as SlimApp; use Slim\Factory\ServerRequestCreatorFactory; use Slim\Psr7\Factory\ServerRequestFactory; +use Slim\Psr7\Request; +use Slim\Psr7\Response; /** * Container Trait. @@ -141,4 +144,12 @@ trait AppTestTrait $this->assertJson($actual); $this->assertSame($expected, (array) json_decode($actual, true)); } + + protected function send(Request $request) : JsonResponse|Response|ResponseInterface { + return $this + ->app + ->loadAllRoutes($request) + ->getApp() + ->handle($request); + } }