[BUGFIX] Do not prohibit valid cache updates
authorBenjamin Franzke <bfr@qbus.de>
Mon, 28 Dec 2015 18:29:56 +0000 (19:29 +0100)
committerTim Lochm├╝ller <tim@fruit-lab.de>
Tue, 29 Dec 2015 09:12:38 +0000 (10:12 +0100)
Commit f1ffcad (Bug #67526) added a detection of already stored cache identifiers
and prevented any cache update without a prior explicit flush.

This broke the ctrl + shift + reload feature since our HeaderNoCache hook is also
broken and never clears the current page from the static file cache.
Prior to the aformentioned patch that wasn't noticed since an explicit flush was
not necessary because the cache update through insertPageIncache does all we need
for ctrl + shift + reload to work.

This patch moves the detection of an already valid cache entry into a helper function
to improve readability.

Classes/StaticFileCache.php

index 114ad1d..03c813c 100644 (file)
@@ -90,13 +90,6 @@ class StaticFileCache implements SingletonInterface
         $preProcessArguments = $this->signalDispatcher->dispatch(__CLASS__, 'preProcess', $preProcessArguments);
         $uri = $preProcessArguments['uri'];
 
-        // don't continue if there is already an existing valid cache entry
-        // prevents overriding if a logged in user is checking the page in a second call
-        $previousCacheEntry = $this->cache->get($uri);
-        if (!count($previousCacheEntry['explanation']) && $previousCacheEntry['expires'] >= $GLOBALS['EXEC_TIME']) {
-            return;
-        }
-
         // cache rules
         $ruleArguments = [
             'frontendController' => $pObj,
@@ -109,6 +102,13 @@ class StaticFileCache implements SingletonInterface
 
         if (!$ruleArguments['skipProcessing']) {
 
+            // Don't continue if there is already an existing valid cache entry and we've got an invalid now.
+            // Prevents overriding if a logged in user is checking the page in a second call
+            // see https://forge.typo3.org/issues/67526
+            if (count($explanation) && $this->hasValidCacheEntry($uri)) {
+                return;
+            }
+
             // The page tag pageId_NN is included in $pObj->pageCacheTags
             $cacheTags = ObjectAccess::getProperty($pObj, 'pageCacheTags', true);
             $cacheTags[] = 'sfc_pageId_' . $pObj->page['uid'];
@@ -206,4 +206,19 @@ class StaticFileCache implements SingletonInterface
             ->setAddQueryString(true)
             ->build();
     }
+
+    /**
+     * Determines whether the given $uri has a valid cache entry.
+     *
+     * @param     string  $uri
+     *
+     * @return    bool    is available and valid
+     */
+    protected function hasValidCacheEntry($uri)
+    {
+        $entry = $this->cache->get($uri);
+        return ($entry !== null &&
+                count($entry['explanation']) === 0 &&
+                $entry['expires'] >= $GLOBALS['EXEC_TIME']);
+    }
 }