You are here

public function Ssi::process in Zircon Profile 8.0

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

Replaces a Response Surrogate 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/Ssi.php, line 114

Class

Ssi
Ssi implements the SSI 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 SSI tags in a plain text response
  $content = $response
    ->getContent();
  $chunks = preg_split('#<!--\\#include\\s+(.*?)\\s*-->#', $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('/(virtual)="([^"]*?)"/', $chunks[$i], $matches, PREG_SET_ORDER);
    foreach ($matches as $set) {
      $options[$set[1]] = $set[2];
    }
    if (!isset($options['virtual'])) {
      throw new \RuntimeException('Unable to process an SSI tag without a "virtual" attribute.');
    }
    $chunks[$i] = sprintf('<?php echo $this->surrogate->handle($this, %s, \'\', false) ?>' . "\n", var_export($options['virtual'], true));
    ++$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', 'SSI');

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