3 namespace Drupal\Core\EventSubscriber;
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;
12 * Subscribes to filter RSS responses, to make relative URIs absolute.
14 class RssResponseRelativeUrlFilter implements EventSubscriberInterface {
17 * Converts relative URLs to absolute URLs.
19 * @param \Symfony\Component\HttpKernel\Event\FilterResponseEvent $event
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) {
28 $response = $event->getResponse();
29 $response->setContent($this->transformRootRelativeUrlsToAbsolute($response->getContent(), $event->getRequest()));
33 * Converts all root-relative URLs to absolute URLs in RSS markup.
35 * Does not change any existing protocol-relative or absolute URLs.
37 * @param string $rss_markup
38 * The RSS markup to update.
39 * @param \Symfony\Component\HttpFoundation\Request $request
40 * The current request.
43 * The updated RSS markup.
45 protected function transformRootRelativeUrlsToAbsolute($rss_markup, Request $request) {
46 $rss_dom = new \DOMDocument();
48 // Load the RSS, if there are parsing errors, abort and return the unchanged
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);
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());
67 return $rss_dom->saveXML();
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];