From a25eaadad7974735aab80173baaa01acfa48adc5 Mon Sep 17 00:00:00 2001 From: Simon Podlipsky Date: Wed, 3 Mar 2021 17:02:52 +0100 Subject: [PATCH] Refactor ControllerBlueScreenExceptionListener to leverage Symfony Kernel --- .../ControllerBlueScreenExceptionListener.php | 33 ++++++++----------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/src/BlueScreen/ControllerBlueScreenExceptionListener.php b/src/BlueScreen/ControllerBlueScreenExceptionListener.php index 91b00ed..c543165 100644 --- a/src/BlueScreen/ControllerBlueScreenExceptionListener.php +++ b/src/BlueScreen/ControllerBlueScreenExceptionListener.php @@ -4,14 +4,14 @@ namespace Cdn77\TracyBlueScreenBundle\BlueScreen; -use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\ExceptionEvent; use Throwable; use Tracy\BlueScreen; -use function header; -use function headers_sent; -use function strpos; +use function assert; +use function ob_get_clean; +use function ob_start; final class ControllerBlueScreenExceptionListener { @@ -25,27 +25,20 @@ public function __construct(BlueScreen $blueScreen) public function onKernelException(ExceptionEvent $event) : void { - $this->forceExceptionControllerHtml($event->getRequest()); - $this->renderBlueScreen($event->getThrowable()); - } + $blueScreenResponse = $this->renderBlueScreen($event->getThrowable()); - private function forceExceptionControllerHtml(Request $request) : void - { - $request->setRequestFormat('html'); - $request->attributes->set('_format', 'html'); + $event->setResponse($blueScreenResponse); } - private function renderBlueScreen(Throwable $exception) : void + private function renderBlueScreen(Throwable $exception) : Response { - if (! headers_sent()) { - $protocol = $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.1'; - $code = isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE ') !== false - ? 503 - : 500; - header($protocol . ' ' . $code, true, $code); - header('Content-Type: text/html; charset=UTF-8'); - } + ob_start(); $this->blueScreen->render($exception); + + $contents = ob_get_clean(); + assert($contents !== false); + + return new Response($contents, Response::HTTP_NOT_FOUND); } }