Verzeichnisstruktur phpBB-3.3.15


Veröffentlicht
28.08.2024

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.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

ResponseHeaderBag.php

Zuletzt modifiziert: 02.04.2025, 15:02 - Dateigröße: 9.92 KiB


001  <?php
002   
003  /*
004   * This file is part of the Symfony package.
005   *
006   * (c) Fabien Potencier <fabien@symfony.com>
007   *
008   * For the full copyright and license information, please view the LICENSE
009   * file that was distributed with this source code.
010   */
011   
012  namespace Symfony\Component\HttpFoundation;
013   
014  /**
015   * ResponseHeaderBag is a container for Response HTTP headers.
016   *
017   * @author Fabien Potencier <fabien@symfony.com>
018   */
019  class ResponseHeaderBag extends HeaderBag
020  {
021      const COOKIES_FLAT = 'flat';
022      const COOKIES_ARRAY = 'array';
023   
024      const DISPOSITION_ATTACHMENT = 'attachment';
025      const DISPOSITION_INLINE = 'inline';
026   
027      protected $computedCacheControl = [];
028      protected $cookies = [];
029      protected $headerNames = [];
030   
031      public function __construct(array $headers = [])
032      {
033          parent::__construct($headers);
034   
035          if (!isset($this->headers['cache-control'])) {
036              $this->set('Cache-Control', '');
037          }
038   
039          /* RFC2616 - 14.18 says all Responses need to have a Date */
040          if (!isset($this->headers['date'])) {
041              $this->initDate();
042          }
043      }
044   
045      /**
046       * Returns the headers, with original capitalizations.
047       *
048       * @return array An array of headers
049       */
050      public function allPreserveCase()
051      {
052          $headers = [];
053          foreach ($this->all() as $name => $value) {
054              $headers[isset($this->headerNames[$name]) ? $this->headerNames[$name] : $name] = $value;
055          }
056   
057          return $headers;
058      }
059   
060      public function allPreserveCaseWithoutCookies()
061      {
062          $headers = $this->allPreserveCase();
063          if (isset($this->headerNames['set-cookie'])) {
064              unset($headers[$this->headerNames['set-cookie']]);
065          }
066   
067          return $headers;
068      }
069   
070      /**
071       * {@inheritdoc}
072       */
073      public function replace(array $headers = [])
074      {
075          $this->headerNames = [];
076   
077          parent::replace($headers);
078   
079          if (!isset($this->headers['cache-control'])) {
080              $this->set('Cache-Control', '');
081          }
082   
083          if (!isset($this->headers['date'])) {
084              $this->initDate();
085          }
086      }
087   
088      /**
089       * {@inheritdoc}
090       */
091      public function all()
092      {
093          $headers = parent::all();
094          foreach ($this->getCookies() as $cookie) {
095              $headers['set-cookie'][] = (string) $cookie;
096          }
097   
098          return $headers;
099      }
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