Diff: STRATO-apps/wordpress_03/app/wp-includes/Requests/src/Cookie/Jar.php

Keine Baseline-Datei – Diff nur gegen leer.
Zur Liste
1 -
1 + <?php
2 + /**
3 + * Cookie holder object
4 + *
5 + * @package Requests\Cookies
6 + */
7 +
8 + namespace WpOrg\Requests\Cookie;
9 +
10 + use ArrayAccess;
11 + use ArrayIterator;
12 + use IteratorAggregate;
13 + use ReturnTypeWillChange;
14 + use WpOrg\Requests\Cookie;
15 + use WpOrg\Requests\Exception;
16 + use WpOrg\Requests\Exception\InvalidArgument;
17 + use WpOrg\Requests\HookManager;
18 + use WpOrg\Requests\Iri;
19 + use WpOrg\Requests\Response;
20 +
21 + /**
22 + * Cookie holder object
23 + *
24 + * @package Requests\Cookies
25 + */
26 + class Jar implements ArrayAccess, IteratorAggregate {
27 + /**
28 + * Actual item data
29 + *
30 + * @var array
31 + */
32 + protected $cookies = [];
33 +
34 + /**
35 + * Create a new jar
36 + *
37 + * @param array $cookies Existing cookie values
38 + *
39 + * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not an array.
40 + */
41 + public function __construct($cookies = []) {
42 + if (is_array($cookies) === false) {
43 + throw InvalidArgument::create(1, '$cookies', 'array', gettype($cookies));
44 + }
45 +
46 + $this->cookies = $cookies;
47 + }
48 +
49 + /**
50 + * Normalise cookie data into a \WpOrg\Requests\Cookie
51 + *
52 + * @param string|\WpOrg\Requests\Cookie $cookie Cookie header value, possibly pre-parsed (object).
53 + * @param string $key Optional. The name for this cookie.
54 + * @return \WpOrg\Requests\Cookie
55 + */
56 + public function normalize_cookie($cookie, $key = '') {
57 + if ($cookie instanceof Cookie) {
58 + return $cookie;
59 + }
60 +
61 + return Cookie::parse($cookie, $key);
62 + }
63 +
64 + /**
65 + * Check if the given item exists
66 + *
67 + * @param string $offset Item key
68 + * @return boolean Does the item exist?
69 + */
70 + #[ReturnTypeWillChange]
71 + public function offsetExists($offset) {
72 + return isset($this->cookies[$offset]);
73 + }
74 +
75 + /**
76 + * Get the value for the item
77 + *
78 + * @param string $offset Item key
79 + * @return string|null Item value (null if offsetExists is false)
80 + */
81 + #[ReturnTypeWillChange]
82 + public function offsetGet($offset) {
83 + if (!isset($this->cookies[$offset])) {
84 + return null;
85 + }
86 +
87 + return $this->cookies[$offset];
88 + }
89 +
90 + /**
91 + * Set the given item
92 + *
93 + * @param string $offset Item name
94 + * @param string $value Item value
95 + *
96 + * @throws \WpOrg\Requests\Exception On attempting to use dictionary as list (`invalidset`)
97 + */
98 + #[ReturnTypeWillChange]
99 + public function offsetSet($offset, $value) {
100 + if ($offset === null) {
101 + throw new Exception('Object is a dictionary, not a list', 'invalidset');
102 + }
103 +
104 + $this->cookies[$offset] = $value;
105 + }
106 +
107 + /**
108 + * Unset the given header
109 + *
110 + * @param string $offset The key for the item to unset.
111 + */
112 + #[ReturnTypeWillChange]
113 + public function offsetUnset($offset) {
114 + unset($this->cookies[$offset]);
115 + }
116 +
117 + /**
118 + * Get an iterator for the data
119 + *
120 + * @return \ArrayIterator
121 + */
122 + #[ReturnTypeWillChange]
123 + public function getIterator() {
124 + return new ArrayIterator($this->cookies);
125 + }
126 +
127 + /**
128 + * Register the cookie handler with the request's hooking system
129 + *
130 + * @param \WpOrg\Requests\HookManager $hooks Hooking system
131 + */
132 + public function register(HookManager $hooks) {
133 + $hooks->register('requests.before_request', [$this, 'before_request']);
134 + $hooks->register('requests.before_redirect_check', [$this, 'before_redirect_check']);
135 + }
136 +
137 + /**
138 + * Add Cookie header to a request if we have any
139 + *
140 + * As per RFC 6265, cookies are separated by '; '
141 + *
142 + * @param string $url
143 + * @param array $headers
144 + * @param array $data
145 + * @param string $type
146 + * @param array $options
147 + */
148 + public function before_request($url, &$headers, &$data, &$type, &$options) {
149 + if (!$url instanceof Iri) {
150 + $url = new Iri($url);
151 + }
152 +
153 + if (!empty($this->cookies)) {
154 + $cookies = [];
155 + foreach ($this->cookies as $key => $cookie) {
156 + $cookie = $this->normalize_cookie($cookie, $key);
157 +
158 + // Skip expired cookies
159 + if ($cookie->is_expired()) {
160 + continue;
161 + }
162 +
163 + if ($cookie->domain_matches($url->host)) {
164 + $cookies[] = $cookie->format_for_header();
165 + }
166 + }
167 +
168 + $headers['Cookie'] = implode('; ', $cookies);
169 + }
170 + }
171 +
172 + /**
173 + * Parse all cookies from a response and attach them to the response
174 + *
175 + * @param \WpOrg\Requests\Response $response Response as received.
176 + */
177 + public function before_redirect_check(Response $response) {
178 + $url = $response->url;
179 + if (!$url instanceof Iri) {
180 + $url = new Iri($url);
181 + }
182 +
183 + $cookies = Cookie::parse_from_headers($response->headers, $url);
184 + $this->cookies = array_merge($this->cookies, $cookies);
185 + $response->cookies = $this;
186 + }
187 + }
188 +