Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. Ssi.php

function Ssi::process

Overrides SurrogateInterface::process

File

vendor/symfony/http-kernel/HttpCache/Ssi.php, line 41

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) : Response {
    $type = $response->headers
        ->get('Content-Type');
    if (!$type) {
        $type = 'text/html';
    }
    $parts = explode(';', $type);
    if (!\in_array($parts[0], $this->contentTypes, true)) {
        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();
    $boundary = self::generateBodyEvalBoundary();
    $chunks = preg_split('#<!--\\#include\\s+(.*?)\\s*-->#', $content, -1, \PREG_SPLIT_DELIM_CAPTURE);
    $i = 1;
    while (isset($chunks[$i])) {
        $options = [];
        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] = $boundary . $options['virtual'] . "\n\n\n";
        $i += 2;
    }
    $content = $boundary . implode('', $chunks) . $boundary;
    $response->setContent($content);
    $response->headers
        ->set('X-Body-Eval', 'SSI');
    // remove SSI/1.0 from the Surrogate-Control header
    $this->removeFromControl($response);
    return $response;
}
RSS feed
Powered by Drupal