From 951c4d286a127f4f4817982cd89bb3051cc25f0d Mon Sep 17 00:00:00 2001 From: Nikolin Majmari Date: Mon, 17 Oct 2022 19:48:06 +0200 Subject: [PATCH 1/3] added support for jpeg images --- src/Controller/PageAction.php | 15 ++++++++++++++- src/Dto/ImageResponse.php | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 src/Dto/ImageResponse.php diff --git a/src/Controller/PageAction.php b/src/Controller/PageAction.php index 62c7a7f..3819f13 100644 --- a/src/Controller/PageAction.php +++ b/src/Controller/PageAction.php @@ -15,6 +15,7 @@ use Mobizel\Bundle\MarkdownDocsBundle\Context\ReaderContextInterface; use Mobizel\Bundle\MarkdownDocsBundle\DataProvider\PageItemDataProvider; +use Mobizel\Bundle\MarkdownDocsBundle\Dto\ImageResponse; use Mobizel\Bundle\MarkdownDocsBundle\Event\PageEvent; use Mobizel\Bundle\MarkdownDocsBundle\Helper\RouteHelperInterface; use Mobizel\Bundle\MarkdownDocsBundle\PageEvents; @@ -51,6 +52,11 @@ public function __invoke(Request $request, string $slug): Response { $context = $this->readerContext->getContext(); + /// send image response if page ends with .jpeg ("foo/page.jpg" should be send as image ) + if( $this->isJpegImage($slug)){ + $image = file_get_contents($context->getDocsDir($request).DIRECTORY_SEPARATOR.$slug); + return new ImageResponse($image,200); + } // redirect a suffixed page ("foo/bar.md" should be redirected to "foo/bar") if (false !== strpos($slug, '.md')) { /** @var string $slug */ @@ -68,7 +74,6 @@ public function __invoke(Request $request, string $slug): Response } $page = $this->pageItemDataProvider->getPage($request); - if (null === $page) { throw new NotFoundHttpException(sprintf('Page "%s" was not found', $slug)); } @@ -79,4 +84,12 @@ public function __invoke(Request $request, string $slug): Response 'page' => $page, ]); } + + + private function isJpegImage(string $slug): bool + { + $chunks = explode(".",$slug); + $extension = end($chunks); + return "jpeg" === $extension; + } } diff --git a/src/Dto/ImageResponse.php b/src/Dto/ImageResponse.php new file mode 100644 index 0000000..31a616d --- /dev/null +++ b/src/Dto/ImageResponse.php @@ -0,0 +1,18 @@ +"image/jpeg" + ] + ); + parent::__construct($content, $status, $headers); + } +} \ No newline at end of file From 7abb108885cb3ff5d60ee205ca2fc425737a902b Mon Sep 17 00:00:00 2001 From: Nikolin Majmari Date: Mon, 17 Oct 2022 19:53:38 +0200 Subject: [PATCH 2/3] added tests for jpeg image --- tests/Controller/PageActionTest.php | 10 ++++++++++ tests/docs/products/books/stephen-king/img1.jpeg | Bin 0 -> 3865 bytes 2 files changed, 10 insertions(+) create mode 100644 tests/docs/products/books/stephen-king/img1.jpeg diff --git a/tests/Controller/PageActionTest.php b/tests/Controller/PageActionTest.php index ef1b323..1ac0b33 100644 --- a/tests/Controller/PageActionTest.php +++ b/tests/Controller/PageActionTest.php @@ -47,6 +47,16 @@ public function testShowPage(): void $this->assertSelectorTextSame('html h1', 'Documentation'); } + public function testImage():void + { + $client = static::createClient(); + + $client->request("GET","/current/products/books/stephen-king/img1.jpeg"); + $this->assertEquals(200, $client->getResponse()->getStatusCode()); + $client->request("GET","/current/products/../products/books/stephen-king/img1.jpeg"); + $this->assertEquals(200, $client->getResponse()->getStatusCode()); + } + public function testShowPageWithContextContainingOneRequirement(): void { $client = static::createClient(); diff --git a/tests/docs/products/books/stephen-king/img1.jpeg b/tests/docs/products/books/stephen-king/img1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..22fbb7b847031a316e4ee0e6f9ca63e9f01cf2ee GIT binary patch literal 3865 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 YqYcsEN{i*^*J6!4?*RWb_}TdX07cUrJpcdz literal 0 HcmV?d00001 From 21750757891682d6e45106357462004173193e8b Mon Sep 17 00:00:00 2001 From: Nikolin Majmari Date: Mon, 17 Oct 2022 19:56:36 +0200 Subject: [PATCH 3/3] checked if file exists --- src/Controller/PageAction.php | 3 ++- tests/Controller/PageActionTest.php | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Controller/PageAction.php b/src/Controller/PageAction.php index 3819f13..7a011ee 100644 --- a/src/Controller/PageAction.php +++ b/src/Controller/PageAction.php @@ -53,7 +53,8 @@ public function __invoke(Request $request, string $slug): Response $context = $this->readerContext->getContext(); /// send image response if page ends with .jpeg ("foo/page.jpg" should be send as image ) - if( $this->isJpegImage($slug)){ + if( $this->isJpegImage($slug) + && file_exists($context->getDocsDir($request).DIRECTORY_SEPARATOR.$slug)){ $image = file_get_contents($context->getDocsDir($request).DIRECTORY_SEPARATOR.$slug); return new ImageResponse($image,200); } diff --git a/tests/Controller/PageActionTest.php b/tests/Controller/PageActionTest.php index 1ac0b33..d33f57c 100644 --- a/tests/Controller/PageActionTest.php +++ b/tests/Controller/PageActionTest.php @@ -55,6 +55,8 @@ public function testImage():void $this->assertEquals(200, $client->getResponse()->getStatusCode()); $client->request("GET","/current/products/../products/books/stephen-king/img1.jpeg"); $this->assertEquals(200, $client->getResponse()->getStatusCode()); + $client->request("GET","/current/not-found.jpeg"); + $this->assertEquals(404, $client->getResponse()->getStatusCode()); } public function testShowPageWithContextContainingOneRequirement(): void