Verzeichnisstruktur phpBB-3.3.16


Veröffentlicht
27.04.2026

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: 01.05.2026, 11:26 - 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