PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.20.0
GiveWP – Donation Plugin and Fundraising Platform v2.20.0
4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / vendor / symfony / http-foundation / ResponseHeaderBag.php
give / vendor / symfony / http-foundation Last commit date
Exception 4 years ago File 4 years ago Session 4 years ago Tests 4 years ago AcceptHeader.php 4 years ago AcceptHeaderItem.php 4 years ago ApacheRequest.php 4 years ago BinaryFileResponse.php 4 years ago Cookie.php 4 years ago ExpressionRequestMatcher.php 4 years ago FileBag.php 4 years ago HeaderBag.php 4 years ago IpUtils.php 4 years ago JsonResponse.php 4 years ago LICENSE 4 years ago ParameterBag.php 4 years ago RedirectResponse.php 4 years ago Request.php 4 years ago RequestMatcher.php 4 years ago RequestMatcherInterface.php 4 years ago RequestStack.php 4 years ago Response.php 4 years ago ResponseHeaderBag.php 4 years ago ServerBag.php 4 years ago StreamedResponse.php 4 years ago
ResponseHeaderBag.php
344 lines
1 <?php
2
3 /*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12 namespace Symfony\Component\HttpFoundation;
13
14 /**
15 * ResponseHeaderBag is a container for Response HTTP headers.
16 *
17 * @author Fabien Potencier <fabien@symfony.com>
18 */
19 class ResponseHeaderBag extends HeaderBag
20 {
21 const COOKIES_FLAT = 'flat';
22 const COOKIES_ARRAY = 'array';
23
24 const DISPOSITION_ATTACHMENT = 'attachment';
25 const DISPOSITION_INLINE = 'inline';
26
27 protected $computedCacheControl = [];
28 protected $cookies = [];
29 protected $headerNames = [];
30
31 public function __construct(array $headers = [])
32 {
33 parent::__construct($headers);
34
35 if (!isset($this->headers['cache-control'])) {
36 $this->set('Cache-Control', '');
37 }
38
39 /* RFC2616 - 14.18 says all Responses need to have a Date */
40 if (!isset($this->headers['date'])) {
41 $this->initDate();
42 }
43 }
44
45 /**
46 * Returns the headers, with original capitalizations.
47 *
48 * @return array An array of headers
49 */
50 public function allPreserveCase()
51 {
52 $headers = [];
53 foreach ($this->all() as $name => $value) {
54 $headers[isset($this->headerNames[$name]) ? $this->headerNames[$name] : $name] = $value;
55 }
56
57 return $headers;
58 }
59
60 public function allPreserveCaseWithoutCookies()
61 {
62 $headers = $this->allPreserveCase();
63 if (isset($this->headerNames['set-cookie'])) {
64 unset($headers[$this->headerNames['set-cookie']]);
65 }
66
67 return $headers;
68 }
69
70 /**
71 * {@inheritdoc}
72 */
73 public function replace(array $headers = [])
74 {
75 $this->headerNames = [];
76
77 parent::replace($headers);
78
79 if (!isset($this->headers['cache-control'])) {
80 $this->set('Cache-Control', '');
81 }
82
83 if (!isset($this->headers['date'])) {
84 $this->initDate();
85 }
86 }
87
88 /**
89 * {@inheritdoc}
90 */
91 public function all()
92 {
93 $headers = parent::all();
94 foreach ($this->getCookies() as $cookie) {
95 $headers['set-cookie'][] = (string) $cookie;
96 }
97
98 return $headers;
99 }
100
101 /**
102 * {@inheritdoc}
103 */
104 public function set($key, $values, $replace = true)
105 {
106 $uniqueKey = str_replace('_', '-', strtolower($key));
107
108 if ('set-cookie' === $uniqueKey) {
109 if ($replace) {
110 $this->cookies = [];
111 }
112 foreach ((array) $values as $cookie) {
113 $this->setCookie(Cookie::fromString($cookie));
114 }
115 $this->headerNames[$uniqueKey] = $key;
116
117 return;
118 }
119
120 $this->headerNames[$uniqueKey] = $key;
121
122 parent::set($key, $values, $replace);
123
124 // ensure the cache-control header has sensible defaults
125 if (\in_array($uniqueKey, ['cache-control', 'etag', 'last-modified', 'expires'], true)) {
126 $computed = $this->computeCacheControlValue();
127 $this->headers['cache-control'] = [$computed];
128 $this->headerNames['cache-control'] = 'Cache-Control';
129 $this->computedCacheControl = $this->parseCacheControl($computed);
130 }
131 }
132
133 /**
134 * {@inheritdoc}
135 */
136 public function remove($key)
137 {
138 $uniqueKey = str_replace('_', '-', strtolower($key));
139 unset($this->headerNames[$uniqueKey]);
140
141 if ('set-cookie' === $uniqueKey) {
142 $this->cookies = [];
143
144 return;
145 }
146
147 parent::remove($key);
148
149 if ('cache-control' === $uniqueKey) {
150 $this->computedCacheControl = [];
151 }
152
153 if ('date' === $uniqueKey) {
154 $this->initDate();
155 }
156 }
157
158 /**
159 * {@inheritdoc}
160 */
161 public function hasCacheControlDirective($key)
162 {
163 return \array_key_exists($key, $this->computedCacheControl);
164 }
165
166 /**
167 * {@inheritdoc}
168 */
169 public function getCacheControlDirective($key)
170 {
171 return \array_key_exists($key, $this->computedCacheControl) ? $this->computedCacheControl[$key] : null;
172 }
173
174 public function setCookie(Cookie $cookie)
175 {
176 $this->cookies[$cookie->getDomain()][$cookie->getPath()][$cookie->getName()] = $cookie;
177 $this->headerNames['set-cookie'] = 'Set-Cookie';
178 }
179
180 /**
181 * Removes a cookie from the array, but does not unset it in the browser.
182 *
183 * @param string $name
184 * @param string $path
185 * @param string $domain
186 */
187 public function removeCookie($name, $path = '/', $domain = null)
188 {
189 if (null === $path) {
190 $path = '/';
191 }
192
193 unset($this->cookies[$domain][$path][$name]);
194
195 if (empty($this->cookies[$domain][$path])) {
196 unset($this->cookies[$domain][$path]);
197
198 if (empty($this->cookies[$domain])) {
199 unset($this->cookies[$domain]);
200 }
201 }
202
203 if (empty($this->cookies)) {
204 unset($this->headerNames['set-cookie']);
205 }
206 }
207
208 /**
209 * Returns an array with all cookies.
210 *
211 * @param string $format
212 *
213 * @return Cookie[]
214 *
215 * @throws \InvalidArgumentException When the $format is invalid
216 */
217 public function getCookies($format = self::COOKIES_FLAT)
218 {
219 if (!\in_array($format, [self::COOKIES_FLAT, self::COOKIES_ARRAY])) {
220 throw new \InvalidArgumentException(sprintf('Format "%s" invalid (%s).', $format, implode(', ', [self::COOKIES_FLAT, self::COOKIES_ARRAY])));
221 }
222
223 if (self::COOKIES_ARRAY === $format) {
224 return $this->cookies;
225 }
226
227 $flattenedCookies = [];
228 foreach ($this->cookies as $path) {
229 foreach ($path as $cookies) {
230 foreach ($cookies as $cookie) {
231 $flattenedCookies[] = $cookie;
232 }
233 }
234 }
235
236 return $flattenedCookies;
237 }
238
239 /**
240 * Clears a cookie in the browser.
241 *
242 * @param string $name
243 * @param string $path
244 * @param string $domain
245 * @param bool $secure
246 * @param bool $httpOnly
247 * @param string $sameSite
248 */
249 public function clearCookie($name, $path = '/', $domain = null, $secure = false, $httpOnly = true/*, $sameSite = null*/)
250 {
251 $sameSite = \func_num_args() > 5 ? func_get_arg(5) : null;
252
253 $this->setCookie(new Cookie($name, null, 1, $path, $domain, $secure, $httpOnly, false, $sameSite));
254 }
255
256 /**
257 * Generates a HTTP Content-Disposition field-value.
258 *
259 * @param string $disposition One of "inline" or "attachment"
260 * @param string $filename A unicode string
261 * @param string $filenameFallback A string containing only ASCII characters that
262 * is semantically equivalent to $filename. If the filename is already ASCII,
263 * it can be omitted, or just copied from $filename
264 *
265 * @return string A string suitable for use as a Content-Disposition field-value
266 *
267 * @throws \InvalidArgumentException
268 *
269 * @see RFC 6266
270 */
271 public function makeDisposition($disposition, $filename, $filenameFallback = '')
272 {
273 if (!\in_array($disposition, [self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE])) {
274 throw new \InvalidArgumentException(sprintf('The disposition must be either "%s" or "%s".', self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE));
275 }
276
277 if ('' == $filenameFallback) {
278 $filenameFallback = $filename;
279 }
280
281 // filenameFallback is not ASCII.
282 if (!preg_match('/^[\x20-\x7e]*$/', $filenameFallback)) {
283 throw new \InvalidArgumentException('The filename fallback must only contain ASCII characters.');
284 }
285
286 // percent characters aren't safe in fallback.
287 if (false !== strpos($filenameFallback, '%')) {
288 throw new \InvalidArgumentException('The filename fallback cannot contain the "%" character.');
289 }
290
291 // path separators aren't allowed in either.
292 if (false !== strpos($filename, '/') || false !== strpos($filename, '\\') || false !== strpos($filenameFallback, '/') || false !== strpos($filenameFallback, '\\')) {
293 throw new \InvalidArgumentException('The filename and the fallback cannot contain the "/" and "\\" characters.');
294 }
295
296 $output = sprintf('%s; filename="%s"', $disposition, str_replace('"', '\\"', $filenameFallback));
297
298 if ($filename !== $filenameFallback) {
299 $output .= sprintf("; filename*=utf-8''%s", rawurlencode($filename));
300 }
301
302 return $output;
303 }
304
305 /**
306 * Returns the calculated value of the cache-control header.
307 *
308 * This considers several other headers and calculates or modifies the
309 * cache-control header to a sensible, conservative value.
310 *
311 * @return string
312 */
313 protected function computeCacheControlValue()
314 {
315 if (!$this->cacheControl) {
316 if ($this->has('Last-Modified') || $this->has('Expires')) {
317 return 'private, must-revalidate'; // allows for heuristic expiration (RFC 7234 Section 4.2.2) in the case of "Last-Modified"
318 }
319
320 // conservative by default
321 return 'no-cache, private';
322 }
323
324 $header = $this->getCacheControlHeader();
325 if (isset($this->cacheControl['public']) || isset($this->cacheControl['private'])) {
326 return $header;
327 }
328
329 // public if s-maxage is defined, private otherwise
330 if (!isset($this->cacheControl['s-maxage'])) {
331 return $header.', private';
332 }
333
334 return $header;
335 }
336
337 private function initDate()
338 {
339 $now = \DateTime::createFromFormat('U', time());
340 $now->setTimezone(new \DateTimeZone('UTC'));
341 $this->set('Date', $now->format('D, d M Y H:i:s').' GMT');
342 }
343 }
344