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

Breadcrumb

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

function HttpCache::handle

Overrides HttpKernelInterface::handle

File

vendor/symfony/http-kernel/HttpCache/HttpCache.php, line 184

Class

HttpCache
Cache provides HTTP caching.

Namespace

Symfony\Component\HttpKernel\HttpCache

Code

public function handle(Request $request, int $type = HttpKernelInterface::MAIN_REQUEST, bool $catch = true) : Response {
    // FIXME: catch exceptions and implement a 500 error page here? -> in Varnish, there is a built-in error page mechanism
    if (HttpKernelInterface::MAIN_REQUEST === $type) {
        $this->traces = [];
        // Keep a clone of the original request for surrogates so they can access it.
        // We must clone here to get a separate instance because the application will modify the request during
        // the application flow (we know it always does because we do ourselves by setting REMOTE_ADDR to 127.0.0.1
        // and adding the X-Forwarded-For header, see HttpCache::forward()).
        $this->request = clone $request;
        if (null !== $this->surrogate) {
            $this->surrogateCacheStrategy = $this->surrogate
                ->createCacheStrategy();
        }
    }
    $this->traces[$this->getTraceKey($request)] = [];
    if (!$request->isMethodSafe()) {
        $response = $this->invalidate($request, $catch);
    }
    elseif ($request->headers
        ->has('expect') || !$request->isMethodCacheable()) {
        $response = $this->pass($request, $catch);
    }
    elseif ($this->options['allow_reload'] && $request->isNoCache()) {
        
        /*
            If allow_reload is configured and the client requests "Cache-Control: no-cache",
            reload the cache by fetching a fresh response and caching it (if possible).
        */
        $this->record($request, 'reload');
        $response = $this->fetch($request, $catch);
    }
    else {
        $response = $this->lookup($request, $catch);
    }
    $this->restoreResponseBody($request, $response);
    if (HttpKernelInterface::MAIN_REQUEST === $type) {
        $this->addTraces($response);
    }
    if (null !== $this->surrogate) {
        if (HttpKernelInterface::MAIN_REQUEST === $type) {
            $this->surrogateCacheStrategy
                ->update($response);
        }
        else {
            $this->surrogateCacheStrategy
                ->add($response);
        }
    }
    $response->prepare($request);
    if (HttpKernelInterface::MAIN_REQUEST === $type) {
        $response->isNotModified($request);
    }
    return $response;
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal