From a964b7aebd7083904dfb4878a3e360b19f90ae43 Mon Sep 17 00:00:00 2001 From: webchick <webchick@24967.no-reply.drupal.org> Date: Wed, 10 Oct 2012 19:25:09 -0700 Subject: [PATCH] Issue #1803338 by chx, katbailey, jthorson, Crell: Fixed 403 and 404 pages call error_log() cluttering server error logs. --- core/lib/Drupal/Core/CoreBundle.php | 2 +- .../EventSubscriber/ExceptionListener.php | 83 +++++++++++++++++++ core/lib/Drupal/Core/ExceptionController.php | 3 +- 3 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 core/lib/Drupal/Core/EventSubscriber/ExceptionListener.php diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php index ed15dd535ae5..f1e43d64c31d 100644 --- a/core/lib/Drupal/Core/CoreBundle.php +++ b/core/lib/Drupal/Core/CoreBundle.php @@ -119,7 +119,7 @@ public function build(ContainerBuilder $container) { $container->register('request_close_subscriber', 'Drupal\Core\EventSubscriber\RequestCloseSubscriber') ->addTag('kernel.event_subscriber'); $container->register('config_global_override_subscriber', '\Drupal\Core\EventSubscriber\ConfigGlobalOverrideSubscriber'); - $container->register('exception_listener', 'Symfony\Component\HttpKernel\EventListener\ExceptionListener') + $container->register('exception_listener', 'Drupal\Core\EventSubscriber\ExceptionListener') ->addTag('kernel.event_subscriber') ->addArgument(new Reference('service_container')) ->setFactoryClass('Drupal\Core\ExceptionController') diff --git a/core/lib/Drupal/Core/EventSubscriber/ExceptionListener.php b/core/lib/Drupal/Core/EventSubscriber/ExceptionListener.php new file mode 100644 index 000000000000..f71b35136caf --- /dev/null +++ b/core/lib/Drupal/Core/EventSubscriber/ExceptionListener.php @@ -0,0 +1,83 @@ +<?php + +/* + * @file + * Definition of Drupal\Core\EventSubscriber\ExceptionListener. + */ + +namespace Drupal\Core\EventSubscriber; + +use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; +use Symfony\Component\HttpKernel\KernelEvents; +use Symfony\Component\HttpKernel\HttpKernelInterface; +use Symfony\Component\HttpKernel\Exception\FlattenException; +use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; + +/** + * Override of Symfony EventListener class to kill 403 and 404 from server logs. + * + * This is mostly a copy of Symfony's ExceptionListener but it doesn't have a + * $logger property as we are not currently using a logger. The class from + * Symfony will, in the absense of a logger, call error_log() on every http + * exception. + * + * @todo Remove this class once we introduce a logger. + * + * @see http://drupal.org/node/1803338 + */ +class ExceptionListener implements EventSubscriberInterface { + private $controller; + + public function __construct($controller) { + $this->controller = $controller; + } + + public function onKernelException(GetResponseForExceptionEvent $event) { + static $handling; + + if ($handling) { + return FALSE; + } + + $handling = TRUE; + + $exception = $event->getException(); + $request = $event->getRequest(); + // Do not put a line in the server logs for every HTTP error. + if (!$exception instanceof HttpExceptionInterface || $exception->getStatusCode() >= 500) { + error_log(sprintf('Uncaught PHP Exception %s: "%s" at %s line %s', get_class($exception), $exception->getMessage(), $exception->getFile(), $exception->getLine())); + } + + $attributes = array( + '_controller' => $this->controller, + 'exception' => FlattenException::create($exception), + 'logger' => NULL, + 'format' => $request->getRequestFormat(), + ); + + $request = $request->duplicate(NULL, NULL, $attributes); + $request->setMethod('GET'); + + try { + $response = $event->getKernel()->handle($request, HttpKernelInterface::SUB_REQUEST, TRUE); + } + catch (\Exception $e) { + $message = sprintf('Exception thrown when handling an exception (%s: %s)', get_class($e), $e->getMessage()); + error_log($message); + // Set handling to false otherwise it won't be able to handle further + // exceptions. + $handling = FALSE; + return; + } + + $event->setResponse($response); + $handling = FALSE; + } + + public static function getSubscribedEvents() { + return array( + KernelEvents::EXCEPTION => array('onKernelException', -128), + ); + } +} diff --git a/core/lib/Drupal/Core/ExceptionController.php b/core/lib/Drupal/Core/ExceptionController.php index 20c9ec2894bc..cb448dec841f 100644 --- a/core/lib/Drupal/Core/ExceptionController.php +++ b/core/lib/Drupal/Core/ExceptionController.php @@ -12,9 +12,8 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\JsonResponse; -use Drupal\Core\HttpKernel; use Symfony\Component\HttpKernel\Exception\FlattenException; -use Symfony\Component\HttpKernel\EventListener\ExceptionListener; +use Drupal\Core\EventSubscriber\ExceptionListener; /** * This controller handles HTTP errors generated by the routing system. -- GitLab