X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fseekat;a=blobdiff_plain;f=lib%2FAPI%2FCall%2FCache.php;fp=lib%2FAPI%2FCall%2FCache.php;h=b80217297e76130eaf176a30efc477c42221fcf3;hp=0000000000000000000000000000000000000000;hb=2451d97f1cb7b97e445b4dd839835b8673a4d0fc;hpb=3958595e9ff27162ae918db1453ddecd4840d481 diff --git a/lib/API/Call/Cache.php b/lib/API/Call/Cache.php new file mode 100644 index 0000000..b802172 --- /dev/null +++ b/lib/API/Call/Cache.php @@ -0,0 +1,74 @@ +cache = $cache ?? new Hollow; + } + + /** + * Save call data + * @param Request $request + * @param Response $response + * @return bool + */ + public function save(Request $request, Response $response) : bool { + $ctl = new Control($request); + if (!$ctl->isValid()) { + return false; + } + + $time = time(); + if ($time - 1 <= $response->getHeader("X-Cache-Time")) { + return true; + } + $response->setHeader("X-Cache-Time", $time); + + return $this->cache->store($ctl->getKey(), $response); + } + + /** + * Attempt to load call data + * @param Request $request + * @param Response $response out param + * @return bool + */ + public function load(Request $request, Response &$response = null) : bool { + $ctl = new Control($request); + if (!$ctl->isValid()) { + return false; + } + + if (!$this->cache->fetch($ctl->getKey(), $response)) { + return false; + } + if ($ctl->isStale($response)) { + if (($lmod = $response->getHeader("Last-Modified"))) { + $request->setOptions(["lastmodified" => strtotime($lmod)]); + } + if (($etag = $response->getHeader("ETag"))) { + $request->setOptions(["etag" => $etag]); + } + return false; + } + return true; + } + +}