Verzeichnisstruktur phpBB-3.2.0
- Veröffentlicht
- 06.01.2017
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
CookieJar.php
001 <?php
002 namespace GuzzleHttp\Cookie;
003
004 use GuzzleHttp\Message\RequestInterface;
005 use GuzzleHttp\Message\ResponseInterface;
006 use GuzzleHttp\ToArrayInterface;
007
008 /**
009 * Cookie jar that stores cookies an an array
010 */
011 class CookieJar implements CookieJarInterface, ToArrayInterface
012 {
013 /** @var SetCookie[] Loaded cookie data */
014 private $cookies = [];
015
016 /** @var bool */
017 private $strictMode;
018
019 /**
020 * @param bool $strictMode Set to true to throw exceptions when invalid
021 * cookies are added to the cookie jar.
022 * @param array $cookieArray Array of SetCookie objects or a hash of arrays
023 * that can be used with the SetCookie constructor
024 */
025 public function __construct($strictMode = false, $cookieArray = [])
026 {
027 $this->strictMode = $strictMode;
028
029 foreach ($cookieArray as $cookie) {
030 if (!($cookie instanceof SetCookie)) {
031 $cookie = new SetCookie($cookie);
032 }
033 $this->setCookie($cookie);
034 }
035 }
036
037 /**
038 * Create a new Cookie jar from an associative array and domain.
039 *
040 * @param array $cookies Cookies to create the jar from
041 * @param string $domain Domain to set the cookies to
042 *
043 * @return self
044 */
045 public static function fromArray(array $cookies, $domain)
046 {
047 $cookieJar = new self();
048 foreach ($cookies as $name => $value) {
049 $cookieJar->setCookie(new SetCookie([
050 'Domain' => $domain,
051 'Name' => $name,
052 'Value' => $value,
053 'Discard' => true
054 ]));
055 }
056
057 return $cookieJar;
058 }
059
060 /**
061 * Quote the cookie value if it is not already quoted and it contains
062 * problematic characters.
063 *
064 * @param string $value Value that may or may not need to be quoted
065 *
066 * @return string
067 */
068 public static function getCookieValue($value)
069 {
070 if (substr($value, 0, 1) !== '"' &&
071 substr($value, -1, 1) !== '"' &&
072 strpbrk($value, ';,')
073 ) {
074 $value = '"' . $value . '"';
075 }
076
077 return $value;
078 }
079
080 public function toArray()
081 {
082 return array_map(function (SetCookie $cookie) {
083 return $cookie->toArray();
084 }, $this->getIterator()->getArrayCopy());
085 }
086
087 public function clear($domain = null, $path = null, $name = null)
088 {
089 if (!$domain) {
090 $this->cookies = [];
091 return;
092 } elseif (!$path) {
093 $this->cookies = array_filter(
094 $this->cookies,
095 function (SetCookie $cookie) use ($path, $domain) {
096 return !$cookie->matchesDomain($domain);
097 }
098 );
099 } elseif (!$name) {
100 $this->cookies = array_filter(
101 $this->cookies,
102 function (SetCookie $cookie) use ($path, $domain) {
103 return !($cookie->matchesPath($path) &&
104 $cookie->matchesDomain($domain));
105 }
106 );
107 } else {
108 $this->cookies = array_filter(
109 $this->cookies,
110 function (SetCookie $cookie) use ($path, $domain, $name) {
111 return !($cookie->getName() == $name &&
112 $cookie->matchesPath($path) &&
113 $cookie->matchesDomain($domain));
114 }
115 );
116 }
117 }
118
119 public function clearSessionCookies()
120 {
121 $this->cookies = array_filter(
122 $this->cookies,
123 function (SetCookie $cookie) {
124 return !$cookie->getDiscard() && $cookie->getExpires();
125 }
126 );
127 }
128
129 public function setCookie(SetCookie $cookie)
130 {
131 // Only allow cookies with set and valid domain, name, value
132 $result = $cookie->validate();
133 if ($result !== true) {
134 if ($this->strictMode) {
135 throw new \RuntimeException('Invalid cookie: ' . $result);
136 } else {
137 $this->removeCookieIfEmpty($cookie);
138 return false;
139 }
140 }
141
142 // Resolve conflicts with previously set cookies
143 foreach ($this->cookies as $i => $c) {
144
145 // Two cookies are identical, when their path, and domain are
146 // identical.
147 if ($c->getPath() != $cookie->getPath() ||
148 $c->getDomain() != $cookie->getDomain() ||
149 $c->getName() != $cookie->getName()
150 ) {
151 continue;
152 }
153
154 // The previously set cookie is a discard cookie and this one is
155 // not so allow the new cookie to be set
156 if (!$cookie->getDiscard() && $c->getDiscard()) {
157 unset($this->cookies[$i]);
158 continue;
159 }
160
161 // If the new cookie's expiration is further into the future, then
162 // replace the old cookie
163 if ($cookie->getExpires() > $c->getExpires()) {
164 unset($this->cookies[$i]);
165 continue;
166 }
167
168 // If the value has changed, we better change it
169 if ($cookie->getValue() !== $c->getValue()) {
170 unset($this->cookies[$i]);
171 continue;
172 }
173
174 // The cookie exists, so no need to continue
175 return false;
176 }
177
178 $this->cookies[] = $cookie;
179
180 return true;
181 }
182
183 public function count()
184 {
185 return count($this->cookies);
186 }
187
188 public function getIterator()
189 {
190 return new \ArrayIterator(array_values($this->cookies));
191 }
192
193 public function extractCookies(
194 RequestInterface $request,
195 ResponseInterface $response
196 ) {
197 if ($cookieHeader = $response->getHeaderAsArray('Set-Cookie')) {
198 foreach ($cookieHeader as $cookie) {
199 $sc = SetCookie::fromString($cookie);
200 if (!$sc->getDomain()) {
201 $sc->setDomain($request->getHost());
202 }
203 $this->setCookie($sc);
204 }
205 }
206 }
207
208 public function addCookieHeader(RequestInterface $request)
209 {
210 $values = [];
211 $scheme = $request->getScheme();
212 $host = $request->getHost();
213 $path = $request->getPath();
214
215 foreach ($this->cookies as $cookie) {
216 if ($cookie->matchesPath($path) &&
217 $cookie->matchesDomain($host) &&
218 !$cookie->isExpired() &&
219 (!$cookie->getSecure() || $scheme == 'https')
220 ) {
221 $values[] = $cookie->getName() . '='
222 . self::getCookieValue($cookie->getValue());
223 }
224 }
225
226 if ($values) {
227 $request->setHeader('Cookie', implode('; ', $values));
228 }
229 }
230
231 /**
232 * If a cookie already exists and the server asks to set it again with a
233 * null value, the cookie must be deleted.
234 *
235 * @param SetCookie $cookie
236 */
237 private function removeCookieIfEmpty(SetCookie $cookie)
238 {
239 $cookieValue = $cookie->getValue();
240 if ($cookieValue === null || $cookieValue === '') {
241 $this->clear(
242 $cookie->getDomain(),
243 $cookie->getPath(),
244 $cookie->getName()
245 );
246 }
247 }
248 }
249