Open Journal Systems  3.3.0
ArrayCookieJar.php
1 <?php
2 
4 
10 
14 class ArrayCookieJar implements CookieJarInterface, \Serializable
15 {
17  protected $cookies = array();
18 
20  protected $strictMode;
21 
25  public function __construct($strictMode = false)
26  {
27  $this->strictMode = $strictMode;
28  }
29 
37  public function setStrictMode($strictMode)
38  {
39  $this->strictMode = $strictMode;
40  }
41 
42  public function remove($domain = null, $path = null, $name = null)
43  {
44  $cookies = $this->all($domain, $path, $name, false, false);
45  $this->cookies = array_filter($this->cookies, function (Cookie $cookie) use ($cookies) {
46  return !in_array($cookie, $cookies, true);
47  });
48 
49  return $this;
50  }
51 
52  public function removeTemporary()
53  {
54  $this->cookies = array_filter($this->cookies, function (Cookie $cookie) {
55  return !$cookie->getDiscard() && $cookie->getExpires();
56  });
57 
58  return $this;
59  }
60 
61  public function removeExpired()
62  {
63  $currentTime = time();
64  $this->cookies = array_filter($this->cookies, function (Cookie $cookie) use ($currentTime) {
65  return !$cookie->getExpires() || $currentTime < $cookie->getExpires();
66  });
67 
68  return $this;
69  }
70 
71  public function all($domain = null, $path = null, $name = null, $skipDiscardable = false, $skipExpired = true)
72  {
73  return array_values(array_filter($this->cookies, function (Cookie $cookie) use (
74  $domain,
75  $path,
76  $name,
77  $skipDiscardable,
78  $skipExpired
79  ) {
80  return false === (($name && $cookie->getName() != $name) ||
81  ($skipExpired && $cookie->isExpired()) ||
82  ($skipDiscardable && ($cookie->getDiscard() || !$cookie->getExpires())) ||
83  ($path && !$cookie->matchesPath($path)) ||
84  ($domain && !$cookie->matchesDomain($domain)));
85  }));
86  }
87 
88  public function add(Cookie $cookie)
89  {
90  // Only allow cookies with set and valid domain, name, value
91  $result = $cookie->validate();
92  if ($result !== true) {
93  if ($this->strictMode) {
94  throw new InvalidCookieException($result);
95  } else {
96  $this->removeCookieIfEmpty($cookie);
97  return false;
98  }
99  }
100 
101  // Resolve conflicts with previously set cookies
102  foreach ($this->cookies as $i => $c) {
103 
104  // Two cookies are identical, when their path, domain, port and name are identical
105  if ($c->getPath() != $cookie->getPath() ||
106  $c->getDomain() != $cookie->getDomain() ||
107  $c->getPorts() != $cookie->getPorts() ||
108  $c->getName() != $cookie->getName()
109  ) {
110  continue;
111  }
112 
113  // The previously set cookie is a discard cookie and this one is not so allow the new cookie to be set
114  if (!$cookie->getDiscard() && $c->getDiscard()) {
115  unset($this->cookies[$i]);
116  continue;
117  }
118 
119  // If the new cookie's expiration is further into the future, then replace the old cookie
120  if ($cookie->getExpires() > $c->getExpires()) {
121  unset($this->cookies[$i]);
122  continue;
123  }
124 
125  // If the value has changed, we better change it
126  if ($cookie->getValue() !== $c->getValue()) {
127  unset($this->cookies[$i]);
128  continue;
129  }
130 
131  // The cookie exists, so no need to continue
132  return false;
133  }
134 
135  $this->cookies[] = $cookie;
136 
137  return true;
138  }
139 
145  public function serialize()
146  {
147  // Only serialize long term cookies and unexpired cookies
148  return json_encode(array_map(function (Cookie $cookie) {
149  return $cookie->toArray();
150  }, $this->all(null, null, null, true, true)));
151  }
152 
156  public function unserialize($data)
157  {
158  $data = json_decode($data, true);
159  if (empty($data)) {
160  $this->cookies = array();
161  } else {
162  $this->cookies = array_map(function (array $cookie) {
163  return new Cookie($cookie);
164  }, $data);
165  }
166  }
167 
173  public function count()
174  {
175  return count($this->cookies);
176  }
177 
183  public function getIterator()
184  {
185  return new \ArrayIterator($this->cookies);
186  }
187 
188  public function addCookiesFromResponse(Response $response, RequestInterface $request = null)
189  {
190  if ($cookieHeader = $response->getHeader('Set-Cookie')) {
191  $parser = ParserRegistry::getInstance()->getParser('cookie');
192  foreach ($cookieHeader as $cookie) {
193  if ($parsed = $request
194  ? $parser->parseCookie($cookie, $request->getHost(), $request->getPath())
195  : $parser->parseCookie($cookie)
196  ) {
197  // Break up cookie v2 into multiple cookies
198  foreach ($parsed['cookies'] as $key => $value) {
199  $row = $parsed;
200  $row['name'] = $key;
201  $row['value'] = $value;
202  unset($row['cookies']);
203  $this->add(new Cookie($row));
204  }
205  }
206  }
207  }
208  }
209 
210  public function getMatchingCookies(RequestInterface $request)
211  {
212  // Find cookies that match this request
213  $cookies = $this->all($request->getHost(), $request->getPath());
214  // Remove ineligible cookies
215  foreach ($cookies as $index => $cookie) {
216  if (!$cookie->matchesPort($request->getPort()) || ($cookie->getSecure() && $request->getScheme() != 'https')) {
217  unset($cookies[$index]);
218  }
219  };
220 
221  return $cookies;
222  }
223 
230  private function removeCookieIfEmpty(Cookie $cookie)
231  {
232  $cookieValue = $cookie->getValue();
233  if ($cookieValue === null || $cookieValue === '') {
234  $this->remove($cookie->getDomain(), $cookie->getPath(), $cookie->getName());
235  }
236  }
237 }
Guzzle\Parser\ParserRegistry
Definition: ParserRegistry.php:8
Guzzle\Plugin\Cookie\Cookie\matchesDomain
matchesDomain($domain)
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php:453
Guzzle\Plugin\Cookie\Cookie\isExpired
isExpired()
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php:488
Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar\serialize
serialize()
Definition: ArrayCookieJar.php:151
Guzzle\Http\Message\RequestInterface\getPath
getPath()
Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar\removeTemporary
removeTemporary()
Definition: ArrayCookieJar.php:58
Guzzle\Http\Message\RequestInterface
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Http/Message/RequestInterface.php:16
Guzzle\Plugin\Cookie\Cookie\toArray
toArray()
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php:81
Guzzle\Http\Message\RequestInterface\getScheme
getScheme()
Guzzle\Plugin\Cookie\Cookie\validate
validate()
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php:498
Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar\getMatchingCookies
getMatchingCookies(RequestInterface $request)
Definition: ArrayCookieJar.php:216
Guzzle\Parser\ParserRegistry\getInstance
static getInstance()
Definition: ParserRegistry.php:34
Guzzle\Http\Message\Response
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Response.php:17
Guzzle\Plugin\Cookie\Cookie\getExpires
getExpires()
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php:201
Guzzle\Plugin\Cookie\Cookie\getSecure
getSecure()
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php:245
Guzzle\Http\Message\RequestInterface\getHost
getHost()
Guzzle\Plugin\Cookie\CookieJar
Definition: ArrayCookieJar.php:3
Guzzle\Plugin\Cookie\Cookie\getName
getName()
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php:91
Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar\removeExpired
removeExpired()
Definition: ArrayCookieJar.php:67
Guzzle\Plugin\Cookie\Cookie\matchesPort
matchesPort($port)
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php:478
Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar\add
add(Cookie $cookie)
Definition: ArrayCookieJar.php:94
Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar\unserialize
unserialize($data)
Definition: ArrayCookieJar.php:162
Guzzle\Plugin\Cookie\Cookie\getPath
getPath()
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php:157
Guzzle\Plugin\Cookie\Cookie\getValue
getValue()
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php:113
Guzzle\Plugin\Cookie\Cookie
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php:10
Guzzle\Plugin\Cookie\Cookie\getPorts
getPorts()
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php:333
Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar\$cookies
$cookies
Definition: ArrayCookieJar.php:20
Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar\count
count()
Definition: ArrayCookieJar.php:179
Guzzle\Http\Message\RequestInterface\getPort
getPort()
Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar\all
all($domain=null, $path=null, $name=null, $skipDiscardable=false, $skipExpired=true)
Definition: ArrayCookieJar.php:77
Guzzle\Plugin\Cookie\Cookie\getDiscard
getDiscard()
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php:267
Guzzle\Plugin\Cookie\Cookie\getDomain
getDomain()
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php:135
Guzzle\Plugin\Cookie\Cookie\matchesPath
matchesPath($path)
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php:416
Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar
Definition: ArrayCookieJar.php:14
Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar\getIterator
getIterator()
Definition: ArrayCookieJar.php:189
Guzzle\Plugin\Cookie\CookieJar\CookieJarInterface
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/CookieJarInterface.php:12
Guzzle\Plugin\Cookie\Exception\InvalidCookieException
Definition: InvalidCookieException.php:7
Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar\addCookiesFromResponse
addCookiesFromResponse(Response $response, RequestInterface $request=null)
Definition: ArrayCookieJar.php:194
Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar\$strictMode
$strictMode
Definition: ArrayCookieJar.php:26
Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar\setStrictMode
setStrictMode($strictMode)
Definition: ArrayCookieJar.php:43
GuzzleHttp\json_encode
json_encode($value, $options=0, $depth=512)
Definition: guzzlehttp/guzzle/src/functions.php:324
Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar\__construct
__construct($strictMode=false)
Definition: ArrayCookieJar.php:31