From 6a9bd461c253b1d1d31d642ef84d4d615953b030 Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 17 Oct 2023 16:35:29 +0900 Subject: [PATCH] feat: add PageCache filter --- system/Filters/PageCache.php | 74 ++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 system/Filters/PageCache.php diff --git a/system/Filters/PageCache.php b/system/Filters/PageCache.php new file mode 100644 index 000000000000..664ef5c7db6a --- /dev/null +++ b/system/Filters/PageCache.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Filters; + +use CodeIgniter\Cache\ResponseCache; +use CodeIgniter\HTTP\CLIRequest; +use CodeIgniter\HTTP\DownloadResponse; +use CodeIgniter\HTTP\IncomingRequest; +use CodeIgniter\HTTP\RedirectResponse; +use CodeIgniter\HTTP\RequestInterface; +use CodeIgniter\HTTP\ResponseInterface; +use Config\Services; + +/** + * Page Cache filter + */ +class PageCache implements FilterInterface +{ + private ResponseCache $pageCache; + + public function __construct() + { + $this->pageCache = Services::responsecache(); + } + + /** + * Checks page cache and return if found. + * + * @param array|null $arguments + */ + public function before(RequestInterface $request, $arguments = null) + { + assert($request instanceof CLIRequest || $request instanceof IncomingRequest); + + $response = Services::response(); + + $cachedResponse = $this->pageCache->get($request, $response); + + if ($cachedResponse instanceof ResponseInterface) { + return $cachedResponse; + } + } + + /** + * Cache the page. + * + * @param array|null $arguments + * + * @return void + */ + public function after(RequestInterface $request, ResponseInterface $response, $arguments = null) + { + assert($request instanceof CLIRequest || $request instanceof IncomingRequest); + + if ( + ! $response instanceof DownloadResponse + && ! $response instanceof RedirectResponse + ) { + // Cache it without the performance metrics replaced + // so that we can have live speed updates along the way. + // Must be run after filters to preserve the Response headers. + $this->pageCache->make($request, $response); + } + } +}