vendor/symfony/http-kernel/HttpCache/AbstractSurrogate.php line 97

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\HttpCache;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\HttpKernel\HttpKernelInterface;
  14. /**
  15.  * Abstract class implementing Surrogate capabilities to Request and Response instances.
  16.  *
  17.  * @author Fabien Potencier <fabien@symfony.com>
  18.  * @author Robin Chalas <robin.chalas@gmail.com>
  19.  */
  20. abstract class AbstractSurrogate implements SurrogateInterface
  21. {
  22.     protected $contentTypes;
  23.     protected $phpEscapeMap = [
  24.         ['<?''<%''<s''<S'],
  25.         ['<?php echo "<?"; ?>''<?php echo "<%"; ?>''<?php echo "<s"; ?>''<?php echo "<S"; ?>'],
  26.     ];
  27.     /**
  28.      * @param array $contentTypes An array of content-type that should be parsed for Surrogate information
  29.      *                            (default: text/html, text/xml, application/xhtml+xml, and application/xml)
  30.      */
  31.     public function __construct(array $contentTypes = ['text/html''text/xml''application/xhtml+xml''application/xml'])
  32.     {
  33.         $this->contentTypes $contentTypes;
  34.     }
  35.     /**
  36.      * Returns a new cache strategy instance.
  37.      */
  38.     public function createCacheStrategy(): ResponseCacheStrategyInterface
  39.     {
  40.         return new ResponseCacheStrategy();
  41.     }
  42.     /**
  43.      * {@inheritdoc}
  44.      */
  45.     public function hasSurrogateCapability(Request $request): bool
  46.     {
  47.         if (null === $value $request->headers->get('Surrogate-Capability')) {
  48.             return false;
  49.         }
  50.         return str_contains($valuesprintf('%s/1.0'strtoupper($this->getName())));
  51.     }
  52.     /**
  53.      * {@inheritdoc}
  54.      */
  55.     public function addSurrogateCapability(Request $request)
  56.     {
  57.         $current $request->headers->get('Surrogate-Capability');
  58.         $new sprintf('symfony="%s/1.0"'strtoupper($this->getName()));
  59.         $request->headers->set('Surrogate-Capability'$current $current.', '.$new $new);
  60.     }
  61.     /**
  62.      * {@inheritdoc}
  63.      */
  64.     public function needsParsing(Response $response): bool
  65.     {
  66.         if (!$control $response->headers->get('Surrogate-Control')) {
  67.             return false;
  68.         }
  69.         $pattern sprintf('#content="[^"]*%s/1.0[^"]*"#'strtoupper($this->getName()));
  70.         return (bool) preg_match($pattern$control);
  71.     }
  72.     /**
  73.      * {@inheritdoc}
  74.      */
  75.     public function handle(HttpCache $cachestring $uristring $altbool $ignoreErrors): string
  76.     {
  77.         $subRequest Request::create($uriRequest::METHOD_GET, [], $cache->getRequest()->cookies->all(), [], $cache->getRequest()->server->all());
  78.         try {
  79.             $response $cache->handle($subRequestHttpKernelInterface::SUB_REQUESTtrue);
  80.             if (!$response->isSuccessful() && Response::HTTP_NOT_MODIFIED !== $response->getStatusCode()) {
  81.                 throw new \RuntimeException(sprintf('Error when rendering "%s" (Status code is %d).'$subRequest->getUri(), $response->getStatusCode()));
  82.             }
  83.             return $response->getContent();
  84.         } catch (\Exception $e) {
  85.             if ($alt) {
  86.                 return $this->handle($cache$alt''$ignoreErrors);
  87.             }
  88.             if (!$ignoreErrors) {
  89.                 throw $e;
  90.             }
  91.         }
  92.         return '';
  93.     }
  94.     /**
  95.      * Remove the Surrogate from the Surrogate-Control header.
  96.      */
  97.     protected function removeFromControl(Response $response)
  98.     {
  99.         if (!$response->headers->has('Surrogate-Control')) {
  100.             return;
  101.         }
  102.         $value $response->headers->get('Surrogate-Control');
  103.         $upperName strtoupper($this->getName());
  104.         if (sprintf('content="%s/1.0"'$upperName) == $value) {
  105.             $response->headers->remove('Surrogate-Control');
  106.         } elseif (preg_match(sprintf('#,\s*content="%s/1.0"#'$upperName), $value)) {
  107.             $response->headers->set('Surrogate-Control'preg_replace(sprintf('#,\s*content="%s/1.0"#'$upperName), ''$value));
  108.         } elseif (preg_match(sprintf('#content="%s/1.0",\s*#'$upperName), $value)) {
  109.             $response->headers->set('Surrogate-Control'preg_replace(sprintf('#content="%s/1.0",\s*#'$upperName), ''$value));
  110.         }
  111.     }
  112. }