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