PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.3.1
GiveWP – Donation Plugin and Fundraising Platform v3.3.1
4.16.7.1 4.16.7 4.16.6.1 4.16.6 4.16.5.1 4.16.5 4.16.4 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 / vendor-prefixed / symfony / http-foundation / ResponseHeaderBag.php
give / vendor / vendor-prefixed / symfony / http-foundation Last commit date
Exception 2 years ago File 2 years ago Session 2 years ago Tests 2 years ago AcceptHeader.php 2 years ago AcceptHeaderItem.php 2 years ago ApacheRequest.php 2 years ago BinaryFileResponse.php 2 years ago Cookie.php 2 years ago ExpressionRequestMatcher.php 2 years ago FileBag.php 2 years ago HeaderBag.php 2 years ago IpUtils.php 2 years ago JsonResponse.php 2 years ago LICENSE 2 years ago ParameterBag.php 2 years ago RedirectResponse.php 2 years ago Request.php 2 years ago RequestMatcher.php 2 years ago RequestMatcherInterface.php 2 years ago RequestStack.php 2 years ago Response.php 2 years ago ResponseHeaderBag.php 2 years ago ServerBag.php 2 years ago StreamedResponse.php 2 years ago
ResponseHeaderBag.php
347 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 * Modified by impress-org on 23-January-2024 using Strauss.
12 * @see https://github.com/BrianHenryIE/strauss
13 */
14
15 namespace Give\Vendors\Symfony\Component\HttpFoundation;
16
17 /**
18 * ResponseHeaderBag is a container for Response HTTP headers.
19 *
20 * @author Fabien Potencier <fabien@symfony.com>
21 */
22 class ResponseHeaderBag extends HeaderBag
23 {
24 const COOKIES_FLAT = 'flat';
25 const COOKIES_ARRAY = 'array';
26
27 const DISPOSITION_ATTACHMENT = 'attachment';
28 const DISPOSITION_INLINE = 'inline';
29
30 protected $computedCacheControl = [];
31 protected $cookies = [];
32 protected $headerNames = [];
33
34 public function __construct(array $headers = [])
35 {
36 parent::__construct($headers);
37
38 if (!isset($this->headers['cache-control'])) {
39 $this->set('Cache-Control', '');
40 }
41
42 /* RFC2616 - 14.18 says all Responses need to have a Date */
43 if (!isset($this->headers['date'])) {
44 $this->initDate();
45 }
46 }
47
48 /**
49 * Returns the headers, with original capitalizations.
50 *
51 * @return array An array of headers
52 */
53 public function allPreserveCase()
54 {
55 $headers = [];
56 foreach ($this->all() as $name => $value) {
57 $headers[isset($this->headerNames[$name]) ? $this->headerNames[$name] : $name] = $value;
58 }
59
60 return $headers;
61 }
62
63 public function allPreserveCaseWithoutCookies()
64 {
65 $headers = $this->allPreserveCase();
66 if (isset($this->headerNames['set-cookie'])) {
67 unset($headers[$this->headerNames['set-cookie']]);
68 }
69
70 return $headers;
71 }
72
73 /**
74 * {@inheritdoc}
75 */
76 public function replace(array $headers = [])
77 {
78 $this->headerNames = [];
79
80 parent::replace($headers);
81
82 if (!isset($this->headers['cache-control'])) {
83 $this->set('Cache-Control', '');
84 }
85
86 if (!isset($this->headers['date'])) {
87 $this->initDate();
88 }
89 }
90
91 /**
92 * {@inheritdoc}
93 */
94 public function all()
95 {
96 $headers = parent::all();
97 foreach ($this->getCookies() as $cookie) {
98 $headers['set-cookie'][] = (string) $cookie;
99 }
100
101 return $headers;
102 }
103
104 /**
105 * {@inheritdoc}
106 */
107 public function set($key, $values, $replace = true)
108 {
109 $uniqueKey = str_replace('_', '-', strtolower($key));
110
111 if ('set-cookie' === $uniqueKey) {
112 if ($replace) {
113 $this->cookies = [];
114 }
115 foreach ((array) $values as $cookie) {
116 $this->setCookie(Cookie::fromString($cookie));
117 }
118 $this->headerNames[$uniqueKey] = $key;
119
120 return;
121 }
122
123 $this->headerNames[$uniqueKey] = $key;
124
125 parent::set($key, $values, $replace);
126
127 // ensure the cache-control header has sensible defaults
128 if (\in_array($uniqueKey, ['cache-control', 'etag', 'last-modified', 'expires'], true)) {
129 $computed = $this->computeCacheControlValue();
130 $this->headers['cache-control'] = [$computed];
131 $this->headerNames['cache-control'] = 'Cache-Control';
132 $this->computedCacheControl = $this->parseCacheControl($computed);
133 }
134 }
135
136 /**
137 * {@inheritdoc}
138 */
139 public function remove($key)
140 {
141 $uniqueKey = str_replace('_', '-', strtolower($key));
142 unset($this->headerNames[$uniqueKey]);
143
144 if ('set-cookie' === $uniqueKey) {
145 $this->cookies = [];
146
147 return;
148 }
149
150 parent::remove($key);
151
152 if ('cache-control' === $uniqueKey) {
153 $this->computedCacheControl = [];
154 }
155
156 if ('date' === $uniqueKey) {
157 $this->initDate();
158 }
159 }
160
161 /**
162 * {@inheritdoc}
163 */
164 public function hasCacheControlDirective($key)
165 {
166 return \array_key_exists($key, $this->computedCacheControl);
167 }
168
169 /**
170 * {@inheritdoc}
171 */
172 public function getCacheControlDirective($key)
173 {
174 return \array_key_exists($key, $this->computedCacheControl) ? $this->computedCacheControl[$key] : null;
175 }
176
177 public function setCookie(Cookie $cookie)
178 {
179 $this->cookies[$cookie->getDomain()][$cookie->getPath()][$cookie->getName()] = $cookie;
180 $this->headerNames['set-cookie'] = 'Set-Cookie';
181 }
182
183 /**
184 * Removes a cookie from the array, but does not unset it in the browser.
185 *
186 * @param string $name
187 * @param string $path
188 * @param string $domain
189 */
190 public function removeCookie($name, $path = '/', $domain = null)
191 {
192 if (null === $path) {
193 $path = '/';
194 }
195
196 unset($this->cookies[$domain][$path][$name]);
197
198 if (empty($this->cookies[$domain][$path])) {
199 unset($this->cookies[$domain][$path]);
200
201 if (empty($this->cookies[$domain])) {
202 unset($this->cookies[$domain]);
203 }
204 }
205
206 if (empty($this->cookies)) {
207 unset($this->headerNames['set-cookie']);
208 }
209 }
210
211 /**
212 * Returns an array with all cookies.
213 *
214 * @param string $format
215 *
216 * @return Cookie[]
217 *
218 * @throws \InvalidArgumentException When the $format is invalid
219 */
220 public function getCookies($format = self::COOKIES_FLAT)
221 {
222 if (!\in_array($format, [self::COOKIES_FLAT, self::COOKIES_ARRAY])) {
223 throw new \InvalidArgumentException(sprintf('Format "%s" invalid (%s).', $format, implode(', ', [self::COOKIES_FLAT, self::COOKIES_ARRAY])));
224 }
225
226 if (self::COOKIES_ARRAY === $format) {
227 return $this->cookies;
228 }
229
230 $flattenedCookies = [];
231 foreach ($this->cookies as $path) {
232 foreach ($path as $cookies) {
233 foreach ($cookies as $cookie) {
234 $flattenedCookies[] = $cookie;
235 }
236 }
237 }
238
239 return $flattenedCookies;
240 }
241
242 /**
243 * Clears a cookie in the browser.
244 *
245 * @param string $name
246 * @param string $path
247 * @param string $domain
248 * @param bool $secure
249 * @param bool $httpOnly
250 * @param string $sameSite
251 */
252 public function clearCookie($name, $path = '/', $domain = null, $secure = false, $httpOnly = true/*, $sameSite = null*/)
253 {
254 $sameSite = \func_num_args() > 5 ? func_get_arg(5) : null;
255
256 $this->setCookie(new Cookie($name, null, 1, $path, $domain, $secure, $httpOnly, false, $sameSite));
257 }
258
259 /**
260 * Generates a HTTP Content-Disposition field-value.
261 *
262 * @param string $disposition One of "inline" or "attachment"
263 * @param string $filename A unicode string
264 * @param string $filenameFallback A string containing only ASCII characters that
265 * is semantically equivalent to $filename. If the filename is already ASCII,
266 * it can be omitted, or just copied from $filename
267 *
268 * @return string A string suitable for use as a Content-Disposition field-value
269 *
270 * @throws \InvalidArgumentException
271 *
272 * @see RFC 6266
273 */
274 public function makeDisposition($disposition, $filename, $filenameFallback = '')
275 {
276 if (!\in_array($disposition, [self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE])) {
277 throw new \InvalidArgumentException(sprintf('The disposition must be either "%s" or "%s".', self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE));
278 }
279
280 if ('' == $filenameFallback) {
281 $filenameFallback = $filename;
282 }
283
284 // filenameFallback is not ASCII.
285 if (!preg_match('/^[\x20-\x7e]*$/', $filenameFallback)) {
286 throw new \InvalidArgumentException('The filename fallback must only contain ASCII characters.');
287 }
288
289 // percent characters aren't safe in fallback.
290 if (false !== strpos($filenameFallback, '%')) {
291 throw new \InvalidArgumentException('The filename fallback cannot contain the "%" character.');
292 }
293
294 // path separators aren't allowed in either.
295 if (false !== strpos($filename, '/') || false !== strpos($filename, '\\') || false !== strpos($filenameFallback, '/') || false !== strpos($filenameFallback, '\\')) {
296 throw new \InvalidArgumentException('The filename and the fallback cannot contain the "/" and "\\" characters.');
297 }
298
299 $output = sprintf('%s; filename="%s"', $disposition, str_replace('"', '\\"', $filenameFallback));
300
301 if ($filename !== $filenameFallback) {
302 $output .= sprintf("; filename*=utf-8''%s", rawurlencode($filename));
303 }
304
305 return $output;
306 }
307
308 /**
309 * Returns the calculated value of the cache-control header.
310 *
311 * This considers several other headers and calculates or modifies the
312 * cache-control header to a sensible, conservative value.
313 *
314 * @return string
315 */
316 protected function computeCacheControlValue()
317 {
318 if (!$this->cacheControl) {
319 if ($this->has('Last-Modified') || $this->has('Expires')) {
320 return 'private, must-revalidate'; // allows for heuristic expiration (RFC 7234 Section 4.2.2) in the case of "Last-Modified"
321 }
322
323 // conservative by default
324 return 'no-cache, private';
325 }
326
327 $header = $this->getCacheControlHeader();
328 if (isset($this->cacheControl['public']) || isset($this->cacheControl['private'])) {
329 return $header;
330 }
331
332 // public if s-maxage is defined, private otherwise
333 if (!isset($this->cacheControl['s-maxage'])) {
334 return $header.', private';
335 }
336
337 return $header;
338 }
339
340 private function initDate()
341 {
342 $now = \DateTime::createFromFormat('U', time());
343 $now->setTimezone(new \DateTimeZone('UTC'));
344 $this->set('Date', $now->format('D, d M Y H:i:s').' GMT');
345 }
346 }
347