Version 1
[yaffs-website] / web / modules / contrib / redirect / modules / redirect_domain / src / EventSubscriber / DomainRedirectRequestSubscriber.php
diff --git a/web/modules/contrib/redirect/modules/redirect_domain/src/EventSubscriber/DomainRedirectRequestSubscriber.php b/web/modules/contrib/redirect/modules/redirect_domain/src/EventSubscriber/DomainRedirectRequestSubscriber.php
new file mode 100644 (file)
index 0000000..bc949b8
--- /dev/null
@@ -0,0 +1,133 @@
+<?php
+
+namespace Drupal\redirect_domain\EventSubscriber;
+
+use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Path\PathMatcherInterface;
+use Drupal\Core\Routing\TrustedRedirectResponse;
+use Drupal\Core\Url;
+use Drupal\redirect\RedirectChecker;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * Redirect subscriber for controller requests.
+ */
+class DomainRedirectRequestSubscriber implements EventSubscriberInterface {
+
+  /**
+   * @var \Drupal\redirect\RedirectChecker
+   */
+  protected $redirectChecker;
+
+  /**
+   * Domain redirect configuration.
+   *
+   * @var \Drupal\Core\Config\Config
+   */
+  protected $domainConfig;
+
+  /**
+   * The path matcher.
+   *
+   * @var \Drupal\Core\Path\PathMatcherInterface
+   */
+  protected $pathMatcher;
+
+  /**
+   * Redirect configuration.
+   *
+   * @var \Drupal\Core\Config\Config
+   */
+  protected  $redirectConfig;
+
+  /**
+   * Constructs a \Drupal\redirect\EventSubscriber\RedirectRequestSubscriber object.
+   *
+   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
+   *   The config factory.
+   * @param \Drupal\redirect\RedirectChecker $redirect_checker
+   *   The redirect checker service.
+   * @param \Drupal\Core\Path\PathMatcherInterface $path_matcher
+   *   The path matcher.
+   */
+  public function __construct(ConfigFactoryInterface $config_factory, RedirectChecker $redirect_checker, PathMatcherInterface $path_matcher) {
+    $this->domainConfig = $config_factory->get('redirect_domain.domains');
+    $this->redirectConfig = $config_factory->get('redirect.settings');
+    $this->redirectChecker = $redirect_checker;
+    $this->pathMatcher = $path_matcher;
+  }
+
+  /**
+   * Handles the domain redirect if any found.
+   *
+   * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
+   *   The event to process.
+   */
+  public function onKernelRequestCheckDomainRedirect(GetResponseEvent $event) {
+    $request = clone $event->getRequest();
+
+    if (!$this->redirectChecker->canRedirect($request)) {
+      return;
+    }
+
+    // Redirect between domains configuration.
+    $domains = $this->domainConfig->get('domain_redirects');
+    if (!empty($domains)) {
+      $host = $request->getHost();
+      $path = $request->getPathInfo();
+      $protocol = $request->getScheme() . '://';
+      $destination = NULL;
+
+      // Checks if there is a redirect domain in the configuration.
+      if (isset($domains[str_replace('.', ':', $host)])) {
+        foreach ($domains[str_replace('.', ':', $host)] as $item) {
+          if ($this->pathMatcher->matchPath($path, $item['sub_path'])) {
+            $destination = $item['destination'];
+            break;
+          }
+        }
+        if ($destination) {
+          // Use the default status code from Redirect.
+          $response = new TrustedRedirectResponse(
+            $protocol . $destination,
+            $this->redirectConfig->get('default_status_code')
+          );
+          $event->setResponse($response);
+          return;
+        }
+      }
+    }
+  }
+
+  /**
+   * Prior to set the response it check if we can redirect.
+   *
+   * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
+   *   The event object.
+   * @param \Drupal\Core\Url $url
+   *   The Url where we want to redirect.
+   */
+  protected function setResponse(GetResponseEvent $event, Url $url) {
+    $request = $event->getRequest();
+
+    parse_str($request->getQueryString(), $query);
+    $url->setOption('query', $query);
+    $url->setAbsolute(TRUE);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents() {
+    // This needs to run before RouterListener::onKernelRequest(), which has
+    // a priority of 32 and
+    // RedirectRequestSubscriber::onKernelRequestCheckRedirect(), which has
+    // a priority of 33. Otherwise, that aborts the request if no matching
+    // route is found.
+    $events[KernelEvents::REQUEST][] = ['onKernelRequestCheckDomainRedirect', 34];
+    return $events;
+  }
+
+}