update to PHP-8.1
[m6w6/seekat] / lib / API / Call / Cache / Control.php
1 <?php
2
3 namespace seekat\API\Call\Cache;
4
5 use http\Client\Request;
6 use http\Client\Response;
7 use http\Header;
8 use http\Params;
9 use http\QueryString;
10 use http\Url;
11
12 final class Control {
13 private string $key;
14
15 /**
16 * @param Request $request
17 */
18 function __construct(Request $request) {
19 $method = $request->getRequestMethod();
20 switch ($method) {
21 case "HEAD":
22 case "GET":
23 $uid = $this->extractAuth($request);
24 $url = $request->getRequestUrl();
25 $this->key = "seekat call $uid $method $url";
26 break;
27 default:
28 $this->key = "";
29 break;
30 }
31 }
32
33 /**
34 * @return bool
35 */
36 public function isValid() : bool {
37 return strlen($this->key) > 0;
38 }
39
40 /**
41 * @return string
42 */
43 public function getKey() : string {
44 return $this->key;
45 }
46
47 /**
48 * @param Response $response
49 * @return bool
50 */
51 public function isStale(Response $response) : bool {
52 if (false === $response->getHeader("Cache-Control") &&
53 false === $response->getHeader("Expires")) {
54 return false;
55 }
56
57 $max_age = $this->extractMaxAge($response);
58 $cur_age = time() - $response->getHeader("X-Cache-Time");
59
60 return $max_age >= 0 && $max_age < $cur_age;
61 }
62
63 /**
64 * @param Response $response
65 * @return int
66 */
67 private function extractMaxAge(Response $response) : int {
68 /* @var Header $date
69 * @var Header $control
70 * @var Header $expires
71 */
72 $control = $response->getHeader("Cache-Control", Header::class);
73 if ($control) {
74 /* @var Params $params */
75 $params = $control->getParams();
76 if (isset($params["max-age"])) {
77 return (int) $params->params["max-age"]["value"];
78 }
79 }
80
81 $expires = $response->getHeader("Expires", Header::class);
82 if ($expires) {
83 if ($expires->match(0, Header::MATCH_FULL)) {
84 return 0;
85 }
86
87 $date = $response->getHeader("Date", Header::class);
88 if ($date) {
89 return strtotime($expires->value) - strtotime($date->value);
90 }
91 }
92
93 return -1;
94 }
95
96 /**
97 * @param Request $request
98 * @return string
99 */
100 private function extractAuth(Request $request) : string {
101 $auth = $request->getHeader("Authorization");
102 if ($auth) {
103 return substr($auth, strpos($auth, " ") + 1);
104 }
105
106 $opts = $request->getOptions();
107 if (isset($opts["httpauth"])) {
108 return base64_encode($opts["httpauth"]);
109 }
110
111 $query = new QueryString((new Url($request->getRequestUrl()))->query);
112 return $query->getString("access_token", $query->getString("client_id", ""));
113 }
114 }