Security update for Core, with self-updated composer
[yaffs-website] / web / core / modules / serialization / src / EventSubscriber / DefaultExceptionSubscriber.php
1 <?php
2
3 namespace Drupal\serialization\EventSubscriber;
4
5 use Drupal\Core\EventSubscriber\HttpExceptionSubscriberBase;
6 use Symfony\Component\HttpFoundation\Response;
7 use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
8 use Symfony\Component\Serializer\SerializerInterface;
9
10 /**
11  * Handles default error responses in serialization formats.
12  */
13 class DefaultExceptionSubscriber extends HttpExceptionSubscriberBase {
14
15   /**
16    * The serializer.
17    *
18    * @var \Symfony\Component\Serializer\Serializer
19    */
20   protected $serializer;
21
22   /**
23    * The available serialization formats.
24    *
25    * @var array
26    */
27   protected $serializerFormats = [];
28
29   /**
30    * DefaultExceptionSubscriber constructor.
31    *
32    * @param \Symfony\Component\Serializer\SerializerInterface $serializer
33    *   The serializer service.
34    * @param array $serializer_formats
35    *   The available serialization formats.
36    */
37   public function __construct(SerializerInterface $serializer, array $serializer_formats) {
38     $this->serializer = $serializer;
39     $this->serializerFormats = $serializer_formats;
40   }
41
42   /**
43    * {@inheritdoc}
44    */
45   protected function getHandledFormats() {
46     return $this->serializerFormats;
47   }
48
49   /**
50    * {@inheritdoc}
51    */
52   protected static function getPriority() {
53     // This will fire after the most common HTML handler, since HTML requests
54     // are still more common than HTTP requests.
55     return -75;
56   }
57
58   /**
59    * Handles all 4xx errors for all serialization failures.
60    *
61    * @param \Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent $event
62    *   The event to process.
63    */
64   public function on4xx(GetResponseForExceptionEvent $event) {
65     /** @var \Symfony\Component\HttpKernel\Exception\HttpExceptionInterface $exception */
66     $exception = $event->getException();
67     $request = $event->getRequest();
68
69     $format = $request->getRequestFormat();
70     $content = ['message' => $event->getException()->getMessage()];
71     $encoded_content = $this->serializer->serialize($content, $format);
72     $headers = $exception->getHeaders();
73
74     // Add the MIME type from the request to send back in the header.
75     $headers['Content-Type'] = $request->getMimeType($format);
76
77     $response = new Response($encoded_content, $exception->getStatusCode(), $headers);
78     $event->setResponse($response);
79   }
80
81 }