vendor/symfony/symfony/src/Symfony/Component/HttpKernel/EventListener/FragmentListener.php line 52

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\HttpKernel\EventListener;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpKernel\Event\GetResponseEvent;
  14. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  15. use Symfony\Component\HttpKernel\KernelEvents;
  16. use Symfony\Component\HttpKernel\UriSigner;
  17. /**
  18.  * Handles content fragments represented by special URIs.
  19.  *
  20.  * All URL paths starting with /_fragment are handled as
  21.  * content fragments by this listener.
  22.  *
  23.  * Throws an AccessDeniedHttpException exception if the request
  24.  * is not signed or if it is not an internal sub-request.
  25.  *
  26.  * @author Fabien Potencier <fabien@symfony.com>
  27.  */
  28. class FragmentListener implements EventSubscriberInterface
  29. {
  30.     private $signer;
  31.     private $fragmentPath;
  32.     /**
  33.      * @param UriSigner $signer       A UriSigner instance
  34.      * @param string    $fragmentPath The path that triggers this listener
  35.      */
  36.     public function __construct(UriSigner $signer$fragmentPath '/_fragment')
  37.     {
  38.         $this->signer $signer;
  39.         $this->fragmentPath $fragmentPath;
  40.     }
  41.     /**
  42.      * Fixes request attributes when the path is '/_fragment'.
  43.      *
  44.      * @throws AccessDeniedHttpException if the request does not come from a trusted IP
  45.      */
  46.     public function onKernelRequest(GetResponseEvent $event)
  47.     {
  48.         $request $event->getRequest();
  49.         if ($this->fragmentPath !== rawurldecode($request->getPathInfo())) {
  50.             return;
  51.         }
  52.         if ($request->attributes->has('_controller')) {
  53.             // Is a sub-request: no need to parse _path but it should still be removed from query parameters as below.
  54.             $request->query->remove('_path');
  55.             return;
  56.         }
  57.         if ($event->isMasterRequest()) {
  58.             $this->validateRequest($request);
  59.         }
  60.         parse_str($request->query->get('_path'''), $attributes);
  61.         $request->attributes->add($attributes);
  62.         $request->attributes->set('_route_params'array_replace($request->attributes->get('_route_params', []), $attributes));
  63.         $request->query->remove('_path');
  64.     }
  65.     protected function validateRequest(Request $request)
  66.     {
  67.         // is the Request safe?
  68.         if (!$request->isMethodSafe(false)) {
  69.             throw new AccessDeniedHttpException();
  70.         }
  71.         // is the Request signed?
  72.         // we cannot use $request->getUri() here as we want to work with the original URI (no query string reordering)
  73.         if ($this->signer->check($request->getSchemeAndHttpHost().$request->getBaseUrl().$request->getPathInfo().(null !== ($qs $request->server->get('QUERY_STRING')) ? '?'.$qs ''))) {
  74.             return;
  75.         }
  76.         throw new AccessDeniedHttpException();
  77.     }
  78.     public static function getSubscribedEvents()
  79.     {
  80.         return [
  81.             KernelEvents::REQUEST => [['onKernelRequest'48]],
  82.         ];
  83.     }
  84. }