.../EventSubscriber/DefaultExceptionSubscriber.php | 69 ++++++++-------------- 1 file changed, 24 insertions(+), 45 deletions(-) diff --git a/core/modules/serialization/src/EventSubscriber/DefaultExceptionSubscriber.php b/core/modules/serialization/src/EventSubscriber/DefaultExceptionSubscriber.php index e58d980..5a21bf4 100644 --- a/core/modules/serialization/src/EventSubscriber/DefaultExceptionSubscriber.php +++ b/core/modules/serialization/src/EventSubscriber/DefaultExceptionSubscriber.php @@ -4,9 +4,9 @@ use Drupal\Core\EventSubscriber\HttpExceptionSubscriberBase; use Drupal\Core\Utility\Error; -use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; +use Symfony\Component\HttpKernel\Exception\HttpException; use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; use Symfony\Component\Serializer\SerializerInterface; @@ -62,19 +62,19 @@ protected static function getPriority() { * {@inheritdoc} */ public function onException(GetResponseForExceptionEvent $event) { + $exception = $event->getException(); + if (in_array($event->getRequest()->getRequestFormat(), $this->getHandledFormats(), TRUE)) { + if (!$exception instanceof HttpExceptionInterface) { + $error = Error::decodeException($exception); + $message = error_displayable($error) + ? sprintf('A fatal error occurred: %s', $exception->getMessage()) + : 'A fatal error occurred.'; + $event->setException(new HttpException(500, $message, $exception)); + } + } parent::onException($event); - - // If the exception was an HttpExceptionInterface exception, then - // propagation will already have stopped. If propagation has not yet stopped - // this must be a fatal error. - if (!$event->isPropagationStopped() && in_array($event->getRequest()->getRequestFormat(), $this->getHandledFormats(), TRUE)) { - $exception = $event->getException(); - $error = Error::decodeException($exception); - $message = error_displayable($error) - ? sprintf('A fatal error occurred: %s', $exception->getMessage()) - : 'A fatal error occurred.'; - - $event->setResponse($this->buildResponse($message, 500, [], $event->getRequest())); + if (!$event->isPropagationStopped()) { + $event->setException($exception); } } @@ -87,13 +87,18 @@ public function onException(GetResponseForExceptionEvent $event) { public function on4xx(GetResponseForExceptionEvent $event) { /** @var \Symfony\Component\HttpKernel\Exception\HttpExceptionInterface $exception */ $exception = $event->getException(); + $request = $event->getRequest(); - $event->setResponse($this->buildResponse( - $exception->getMessage(), - $exception->getStatusCode(), - $exception->getHeaders(), - $event->getRequest() - )); + $format = $request->getRequestFormat(); + $content = ['message' => $event->getException()->getMessage()]; + $encoded_content = $this->serializer->serialize($content, $format); + $headers = $exception->getHeaders(); + + // Add the MIME type from the request to send back in the header. + $headers['Content-Type'] = $request->getMimeType($format); + + $response = new Response($encoded_content, $exception->getStatusCode(), $headers); + $event->setResponse($response); } /** @@ -106,30 +111,4 @@ public function on500(GetResponseForExceptionEvent $event) { return $this->on4xx($event); } - /** - * Builds an error response. - * - * @param string $message - * The message to use in the error response. - * @param int $status_code - * The response status code. - * @param array $headers - * An array of response headers. - * @param \Symfony\Component\HttpFoundation\Request $request - * The current request. - * - * @return \Symfony\Component\HttpFoundation\Response - * The error response to send. - */ - protected function buildResponse($message, $status_code, $headers, Request $request) { - $format = $request->getRequestFormat(); - $content = ['message' => $message]; - $encoded_content = $this->serializer->serialize($content, $format); - - // Add the MIME type from the request to send back in the header. - $headers['Content-Type'] = $request->getMimeType($format); - - return new Response($encoded_content, $status_code, $headers); - } - }