Updated Drupal to 8.6. This goes with the following updates because it's possible...
[yaffs-website] / web / core / lib / Drupal / Core / EventSubscriber / RssResponseRelativeUrlFilter.php
1 <?php
2
3 namespace Drupal\Core\EventSubscriber;
4
5 use Drupal\Component\Utility\Html;
6 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
7 use Symfony\Component\HttpFoundation\Request;
8 use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
9 use Symfony\Component\HttpKernel\KernelEvents;
10
11 /**
12  * Subscribes to filter RSS responses, to make relative URIs absolute.
13  */
14 class RssResponseRelativeUrlFilter implements EventSubscriberInterface {
15
16   /**
17    * Converts relative URLs to absolute URLs.
18    *
19    * @param \Symfony\Component\HttpKernel\Event\FilterResponseEvent $event
20    *   The response event.
21    */
22   public function onResponse(FilterResponseEvent $event) {
23     // Only care about RSS responses.
24     if (stripos($event->getResponse()->headers->get('Content-Type'), 'application/rss+xml') === FALSE) {
25       return;
26     }
27
28     $response = $event->getResponse();
29     $response->setContent($this->transformRootRelativeUrlsToAbsolute($response->getContent(), $event->getRequest()));
30   }
31
32   /**
33    * Converts all root-relative URLs to absolute URLs in RSS markup.
34    *
35    * Does not change any existing protocol-relative or absolute URLs.
36    *
37    * @param string $rss_markup
38    *   The RSS markup to update.
39    * @param \Symfony\Component\HttpFoundation\Request $request
40    *   The current request.
41    *
42    * @return string
43    *   The updated RSS markup.
44    */
45   protected function transformRootRelativeUrlsToAbsolute($rss_markup, Request $request) {
46     $rss_dom = new \DOMDocument();
47
48     // Load the RSS, if there are parsing errors, abort and return the unchanged
49     // markup.
50     $previous_value = libxml_use_internal_errors(TRUE);
51     $rss_dom->loadXML($rss_markup);
52     $errors = libxml_get_errors();
53     libxml_use_internal_errors($previous_value);
54     if ($errors) {
55       return $rss_markup;
56     }
57
58     // Invoke Html::transformRootRelativeUrlsToAbsolute() on all HTML content
59     // embedded in this RSS feed.
60     foreach ($rss_dom->getElementsByTagName('description') as $node) {
61       $html_markup = $node->nodeValue;
62       if (!empty($html_markup)) {
63         $node->nodeValue = Html::transformRootRelativeUrlsToAbsolute($html_markup, $request->getSchemeAndHttpHost());
64       }
65     }
66
67     return $rss_dom->saveXML();
68   }
69
70   /**
71    * {@inheritdoc}
72    */
73   public static function getSubscribedEvents() {
74     // Should run after any other response subscriber that modifies the markup.
75     // @see \Drupal\Core\EventSubscriber\ActiveLinkResponseFilter
76     $events[KernelEvents::RESPONSE][] = ['onResponse', -512];
77
78     return $events;
79   }
80
81 }