You are here

public function Esi::process in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 vendor/symfony/http-kernel/HttpCache/Esi.php \Symfony\Component\HttpKernel\HttpCache\Esi::process()

Replaces a Response ESI tags with the included resource content.

Parameters

Request $request A Request instance:

Response $response A Response instance:

Return value

Response

Overrides SurrogateInterface::process

File

vendor/symfony/http-kernel/HttpCache/Esi.php, line 201

Class

Esi
Esi implements the ESI capabilities to Request and Response instances.

Namespace

Symfony\Component\HttpKernel\HttpCache

Code

public function process(Request $request, Response $response) {
  $type = $response->headers
    ->get('Content-Type');
  if (empty($type)) {
    $type = 'text/html';
  }
  $parts = explode(';', $type);
  if (!in_array($parts[0], $this->contentTypes)) {
    return $response;
  }

  // we don't use a proper XML parser here as we can have ESI tags in a plain text response
  $content = $response
    ->getContent();
  $content = preg_replace('#<esi\\:remove>.*?</esi\\:remove>#s', '', $content);
  $content = preg_replace('#<esi\\:comment[^>]+>#s', '', $content);
  $chunks = preg_split('#<esi\\:include\\s+(.*?)\\s*(?:/|</esi\\:include)>#', $content, -1, PREG_SPLIT_DELIM_CAPTURE);
  $chunks[0] = str_replace($this->phpEscapeMap[0], $this->phpEscapeMap[1], $chunks[0]);
  $i = 1;
  while (isset($chunks[$i])) {
    $options = array();
    preg_match_all('/(src|onerror|alt)="([^"]*?)"/', $chunks[$i], $matches, PREG_SET_ORDER);
    foreach ($matches as $set) {
      $options[$set[1]] = $set[2];
    }
    if (!isset($options['src'])) {
      throw new \RuntimeException('Unable to process an ESI tag without a "src" attribute.');
    }
    $chunks[$i] = sprintf('<?php echo $this->surrogate->handle($this, %s, %s, %s) ?>' . "\n", var_export($options['src'], true), var_export(isset($options['alt']) ? $options['alt'] : '', true), isset($options['onerror']) && 'continue' === $options['onerror'] ? 'true' : 'false');
    ++$i;
    $chunks[$i] = str_replace($this->phpEscapeMap[0], $this->phpEscapeMap[1], $chunks[$i]);
    ++$i;
  }
  $content = implode('', $chunks);
  $response
    ->setContent($content);
  $response->headers
    ->set('X-Body-Eval', 'ESI');

  // remove ESI/1.0 from the Surrogate-Control header
  if ($response->headers
    ->has('Surrogate-Control')) {
    $value = $response->headers
      ->get('Surrogate-Control');
    if ('content="ESI/1.0"' == $value) {
      $response->headers
        ->remove('Surrogate-Control');
    }
    elseif (preg_match('#,\\s*content="ESI/1.0"#', $value)) {
      $response->headers
        ->set('Surrogate-Control', preg_replace('#,\\s*content="ESI/1.0"#', '', $value));
    }
    elseif (preg_match('#content="ESI/1.0",\\s*#', $value)) {
      $response->headers
        ->set('Surrogate-Control', preg_replace('#content="ESI/1.0",\\s*#', '', $value));
    }
  }
}