3 namespace seekat\API\Call
;
5 use http\Client\Request
;
6 use http\Client\Response
;
7 use seekat\API\Call\Cache\Control
;
8 use seekat\API\Call\Cache\Service
;
9 use seekat\API\Call\Cache\Service\Hollow
;
19 * @param Service $cache
21 public function __construct(Service
$cache = null) {
22 $this->cache
= $cache ??
new Hollow
;
27 * @param Request $request
28 * @param Response $response
31 public function save(Request
$request, Response
$response) : bool {
32 $ctl = new Control($request);
33 if (!$ctl->isValid()) {
38 if ($time - 1 <= $response->getHeader("X-Cache-Time")) {
41 $response->setHeader("X-Cache-Time", $time);
43 return $this->cache
->store($ctl->getKey(), $response);
47 * Attempt to load call data
48 * @param Request $request
49 * @param Response $response out param
52 public function load(Request
$request, Response
&$response = null) : bool {
53 $ctl = new Control($request);
54 if (!$ctl->isValid()) {
58 if (!$this->cache
->fetch($ctl->getKey(), $response)) {
61 if ($ctl->isStale($response)) {
62 if (($lmod = $response->getHeader("Last-Modified"))) {
63 $request->setOptions(["lastmodified" => strtotime($lmod)]);
65 if (($etag = $response->getHeader("ETag"))) {
66 $request->setOptions(["etag" => $etag]);
70 $response->setHeader("X-Cache-Hit", $response->getHeader("X-Cache-Hit") +
1);
76 * @param Request $request
77 * @param Response $response
80 public function update(Request
$request, Response
&$response) : bool {
81 $ctl = new Control($request);
82 if (!$ctl->isValid()) {
86 if ($response->getResponseCode() !== 304) {
87 return $this->save($request, $response);
90 /** @var Response $cached */
91 if (!$this->cache
->fetch($ctl->getKey(), $cached)) {
92 return $this->save($request, $response);
95 if ($response->getHeader("ETag") !== $cached->getHeader("ETag")) {
96 return $this->save($request, $response);
99 $cached->setHeader("X-Cache-Update", $cached->getHeader("X-Cache-Update") +
1);