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