From b49e74fad99c0132623dbca2da5cd98ac494b20f Mon Sep 17 00:00:00 2001 From: Franco Gilio Date: Mon, 8 Aug 2022 20:22:32 -0300 Subject: [PATCH 1/2] Test that we won't return a cached response if request asks for bypass, even if cache already exists --- tests/IntegrationTest.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/IntegrationTest.php b/tests/IntegrationTest.php index 1c319f5..b1ebea3 100644 --- a/tests/IntegrationTest.php +++ b/tests/IntegrationTest.php @@ -277,15 +277,17 @@ public function it_can_add_a_cache_age_header() } /** @test */ - public function it_wont_serve_cached_response_if_request_has_bypass_header() + public function it_wont_cache_nor_serve_a_cached_response_if_request_has_bypass_header() { $headerName = 'X-Cache-Bypass'; $headerValue = rand(1, 99999); $this->app['config']->set('responsecache.cache_bypass_header.name', $headerName); $this->app['config']->set('responsecache.cache_bypass_header.value', $headerValue); - $response = $this->get('/', ['X-Cache-Bypass' => $headerValue]); + $firstResponse = $this->get('/', ['X-Cache-Bypass' => $headerValue]); + $secondResponse = $this->get('/', ['X-Cache-Bypass' => $headerValue]); - $this->assertRegularResponse($response); + $this->assertRegularResponse($firstResponse); + $this->assertRegularResponse($secondResponse); } } From 456be005fcee797a1dd47259c7106badb23d0d64 Mon Sep 17 00:00:00 2001 From: Franco Gilio Date: Mon, 8 Aug 2022 20:23:11 -0300 Subject: [PATCH 2/2] Refactor bypass header implementation --- src/CacheProfiles/BaseCacheProfile.php | 14 -------------- .../CacheAllSuccessfulGetRequests.php | 4 ---- src/Middlewares/CacheResponse.php | 4 ++-- src/ResponseCache.php | 14 ++++++++++++++ 4 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/CacheProfiles/BaseCacheProfile.php b/src/CacheProfiles/BaseCacheProfile.php index a2bea0a..2eab5e8 100644 --- a/src/CacheProfiles/BaseCacheProfile.php +++ b/src/CacheProfiles/BaseCacheProfile.php @@ -36,18 +36,4 @@ public function isRunningInConsole(): bool return app()->runningInConsole(); } - - public function requestHasCacheBypassHeader(Request $request): bool - { - // Ensure we return if cache_bypass_header is not setup - if (! config('responsecache.cache_bypass_header.name')) { - return false; - } - // Ensure we return if cache_bypass_header is not setup - if (! config('responsecache.cache_bypass_header.value')) { - return false; - } - - return $request->header(config('responsecache.cache_bypass_header.name')) === config('responsecache.cache_bypass_header.value'); - } } diff --git a/src/CacheProfiles/CacheAllSuccessfulGetRequests.php b/src/CacheProfiles/CacheAllSuccessfulGetRequests.php index 65d2df6..0d34055 100644 --- a/src/CacheProfiles/CacheAllSuccessfulGetRequests.php +++ b/src/CacheProfiles/CacheAllSuccessfulGetRequests.php @@ -18,10 +18,6 @@ public function shouldCacheRequest(Request $request): bool return false; } - if ($this->requestHasCacheBypassHeader($request)) { - return false; - } - return $request->isMethod('get'); } diff --git a/src/Middlewares/CacheResponse.php b/src/Middlewares/CacheResponse.php index 3ad8b57..d2b63f4 100644 --- a/src/Middlewares/CacheResponse.php +++ b/src/Middlewares/CacheResponse.php @@ -26,7 +26,7 @@ public function handle(Request $request, Closure $next, ...$args): Response $lifetimeInSeconds = $this->getLifetime($args); $tags = $this->getTags($args); - if ($this->responseCache->enabled($request)) { + if ($this->responseCache->enabled($request) && ! $this->responseCache->shouldBypass($request)) { if ($this->responseCache->hasBeenCached($request, $tags)) { event(new ResponseCacheHit($request)); @@ -44,7 +44,7 @@ public function handle(Request $request, Closure $next, ...$args): Response $response = $next($request); - if ($this->responseCache->enabled($request)) { + if ($this->responseCache->enabled($request) && ! $this->responseCache->shouldBypass($request)) { if ($this->responseCache->shouldCache($request, $response)) { $this->makeReplacementsAndCacheResponse($request, $response, $lifetimeInSeconds, $tags); } diff --git a/src/ResponseCache.php b/src/ResponseCache.php index 12c0649..cdda509 100644 --- a/src/ResponseCache.php +++ b/src/ResponseCache.php @@ -37,6 +37,20 @@ public function shouldCache(Request $request, Response $response): bool return $this->cacheProfile->shouldCacheResponse($response); } + public function shouldBypass(Request $request): bool + { + // Ensure we return if cache_bypass_header is not setup + if (! config('responsecache.cache_bypass_header.name')) { + return false; + } + // Ensure we return if cache_bypass_header is not setup + if (! config('responsecache.cache_bypass_header.value')) { + return false; + } + + return $request->header(config('responsecache.cache_bypass_header.name')) === (string) config('responsecache.cache_bypass_header.value'); + } + public function cacheResponse( Request $request, Response $response,