From 9913c1576abde751e6bde529b5a3534f24d6ed7a Mon Sep 17 00:00:00 2001 From: Matthias Pigulla Date: Tue, 26 May 2020 14:12:18 +0000 Subject: [PATCH] Apply stale-while-revalidate also for responses without a validator --- src/CacheMiddleware.php | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/CacheMiddleware.php b/src/CacheMiddleware.php index b620102f..eb088525 100644 --- a/src/CacheMiddleware.php +++ b/src/CacheMiddleware.php @@ -153,25 +153,36 @@ function (ResponseInterface $response) use ($request) { return new FulfilledPromise( $cacheEntry->getResponse()->withHeader(self::HEADER_CACHE_INFO, self::HEADER_CACHE_HIT) ); - } elseif ($staleResponse - || ($maxStaleCache !== null && $cacheEntry->getStaleAge() <= $maxStaleCache) - ) { - // Staled cache! + } elseif ($staleResponse || ($maxStaleCache !== null && $cacheEntry->getStaleAge() <= $maxStaleCache)) { + /* + * Client is willing to accept a response that has exceeded its freshness lifetime, + * possibly by not more than $maxStaleCache (https://tools.ietf.org/html/rfc7234#section-5.2.1.2). + * + * Return the cached, stale response. + */ return new FulfilledPromise( $cacheEntry->getResponse()->withHeader(self::HEADER_CACHE_INFO, self::HEADER_CACHE_HIT) ); + } elseif ($cacheEntry->staleWhileValidate() && ($maxStaleCache === null || $cacheEntry->getStaleAge() <= $maxStaleCache)) { + /* + * The cached response indicated that it may be served stale while background revalidation (or fetch) + * occurs, and the client did not limit maximum staleness. (https://tools.ietf.org/html/rfc5861#section-3) + * + * Return the cached, stale response; initiate deferred revalidation/re-fetch. + */ + static::addReValidationRequest( + static::getRequestWithReValidationHeader($request, $cacheEntry), + $this->cacheStorage, + $cacheEntry + ); + + return new FulfilledPromise( + $cacheEntry->getResponse() + ->withHeader(self::HEADER_CACHE_INFO, self::HEADER_CACHE_STALE) + ); } elseif ($cacheEntry->hasValidationInformation() && !$onlyFromCache) { // Re-validation header $request = static::getRequestWithReValidationHeader($request, $cacheEntry); - - if ($cacheEntry->staleWhileValidate()) { - static::addReValidationRequest($request, $this->cacheStorage, $cacheEntry); - - return new FulfilledPromise( - $cacheEntry->getResponse() - ->withHeader(self::HEADER_CACHE_INFO, self::HEADER_CACHE_STALE) - ); - } } } else { $cacheEntry = null;