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

HeaderBag.php

Zuletzt modifiziert: 01.05.2026, 11:26 - Dateigröße: 8.88 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   * HeaderBag is a container for HTTP headers.
 016   *
 017   * @author Fabien Potencier <fabien@symfony.com>
 018   */
 019  class HeaderBag implements \IteratorAggregate, \Countable
 020  {
 021      protected $headers = [];
 022      protected $cacheControl = [];
 023   
 024      /**
 025       * @param array $headers An array of HTTP headers
 026       */
 027      public function __construct(array $headers = [])
 028      {
 029          foreach ($headers as $key => $values) {
 030              $this->set($key, $values);
 031          }
 032      }
 033   
 034      /**
 035       * Returns the headers as a string.
 036       *
 037       * @return string The headers
 038       */
 039      public function __toString()
 040      {
 041          if (!$headers = $this->all()) {
 042              return '';
 043          }
 044   
 045          ksort($headers);
 046          $max = max(array_map('strlen', array_keys($headers))) + 1;
 047          $content = '';
 048          foreach ($headers as $name => $values) {
 049              $name = implode('-', array_map('ucfirst', explode('-', $name)));
 050              foreach ($values as $value) {
 051                  $content .= sprintf("%-{$max}s %s\r\n", $name.':', $value);
 052              }
 053          }
 054   
 055          return $content;
 056      }
 057   
 058      /**
 059       * Returns the headers.
 060       *
 061       * @return array An array of headers
 062       */
 063      public function all()
 064      {
 065          return $this->headers;
 066      }
 067   
 068      /**
 069       * Returns the parameter keys.
 070       *
 071       * @return array An array of parameter keys
 072       */
 073      public function keys()
 074      {
 075          return array_keys($this->all());
 076      }
 077   
 078      /**
 079       * Replaces the current HTTP headers by a new set.
 080       *
 081       * @param array $headers An array of HTTP headers
 082       */
 083      public function replace(array $headers = [])
 084      {
 085          $this->headers = [];
 086          $this->add($headers);
 087      }
 088   
 089      /**
 090       * Adds new headers the current HTTP headers set.
 091       *
 092       * @param array $headers An array of HTTP headers
 093       */
 094      public function add(array $headers)
 095      {
 096          foreach ($headers as $key => $values) {
 097              $this->set($key, $values);
 098          }
 099      }
 100   
 101      /**
 102       * Returns a header value by name.
 103       *
 104       * @param string      $key     The header name
 105       * @param string|null $default The default value
 106       * @param bool        $first   Whether to return the first value or all header values
 107       *
 108       * @return string|string[]|null The first header value or default value if $first is true, an array of values otherwise
 109       */
 110      public function get($key, $default = null, $first = true)
 111      {
 112          $key = str_replace('_', '-', strtolower($key));
 113          $headers = $this->all();
 114   
 115          if (!\array_key_exists($key, $headers)) {
 116              if (null === $default) {
 117                  return $first ? null : [];
 118              }
 119   
 120              return $first ? $default : [$default];
 121          }
 122   
 123          if ($first) {
 124              if (!$headers[$key]) {
 125                  return $default;
 126              }
 127   
 128              if (null === $headers[$key][0]) {
 129                  return null;
 130              }
 131   
 132              return (string) $headers[$key][0];
 133          }
 134   
 135          return $headers[$key];
 136      }
 137   
 138      /**
 139       * Sets a header by name.
 140       *
 141       * @param string          $key     The key
 142       * @param string|string[] $values  The value or an array of values
 143       * @param bool            $replace Whether to replace the actual value or not (true by default)
 144       */
 145      public function set($key, $values, $replace = true)
 146      {
 147          $key = str_replace('_', '-', strtolower($key));
 148   
 149          if (\is_array($values)) {
 150              $values = array_values($values);
 151   
 152              if (true === $replace || !isset($this->headers[$key])) {
 153                  $this->headers[$key] = $values;
 154              } else {
 155                  $this->headers[$key] = array_merge($this->headers[$key], $values);
 156              }
 157          } else {
 158              if (true === $replace || !isset($this->headers[$key])) {
 159                  $this->headers[$key] = [$values];
 160              } else {
 161                  $this->headers[$key][] = $values;
 162              }
 163          }
 164   
 165          if ('cache-control' === $key) {
 166              $this->cacheControl = $this->parseCacheControl(implode(', ', $this->headers[$key]));
 167          }
 168      }
 169   
 170      /**
 171       * Returns true if the HTTP header is defined.
 172       *
 173       * @param string $key The HTTP header
 174       *
 175       * @return bool true if the parameter exists, false otherwise
 176       */
 177      public function has($key)
 178      {
 179          return \array_key_exists(str_replace('_', '-', strtolower($key)), $this->all());
 180      }
 181   
 182      /**
 183       * Returns true if the given HTTP header contains the given value.
 184       *
 185       * @param string $key   The HTTP header name
 186       * @param string $value The HTTP value
 187       *
 188       * @return bool true if the value is contained in the header, false otherwise
 189       */
 190      public function contains($key, $value)
 191      {
 192          return \in_array($value, $this->get($key, null, false));
 193      }
 194   
 195      /**
 196       * Removes a header.
 197       *
 198       * @param string $key The HTTP header name
 199       */
 200      public function remove($key)
 201      {
 202          $key = str_replace('_', '-', strtolower($key));
 203   
 204          unset($this->headers[$key]);
 205   
 206          if ('cache-control' === $key) {
 207              $this->cacheControl = [];
 208          }
 209      }
 210   
 211      /**
 212       * Returns the HTTP header value converted to a date.
 213       *
 214       * @param string    $key     The parameter key
 215       * @param \DateTime $default The default value
 216       *
 217       * @return \DateTime|null The parsed DateTime or the default value if the header does not exist
 218       *
 219       * @throws \RuntimeException When the HTTP header is not parseable
 220       */
 221      public function getDate($key, \DateTime $default = null)
 222      {
 223          if (null === $value = $this->get($key)) {
 224              return $default;
 225          }
 226   
 227          if (false === $date = \DateTime::createFromFormat(\DATE_RFC2822, $value)) {
 228              throw new \RuntimeException(sprintf('The "%s" HTTP header is not parseable (%s).', $key, $value));
 229          }
 230   
 231          return $date;
 232      }
 233   
 234      /**
 235       * Adds a custom Cache-Control directive.
 236       *
 237       * @param string $key   The Cache-Control directive name
 238       * @param mixed  $value The Cache-Control directive value
 239       */
 240      public function addCacheControlDirective($key, $value = true)
 241      {
 242          $this->cacheControl[$key] = $value;
 243   
 244          $this->set('Cache-Control', $this->getCacheControlHeader());
 245      }
 246   
 247      /**
 248       * Returns true if the Cache-Control directive is defined.
 249       *
 250       * @param string $key The Cache-Control directive
 251       *
 252       * @return bool true if the directive exists, false otherwise
 253       */
 254      public function hasCacheControlDirective($key)
 255      {
 256          return \array_key_exists($key, $this->cacheControl);
 257      }
 258   
 259      /**
 260       * Returns a Cache-Control directive value by name.
 261       *
 262       * @param string $key The directive name
 263       *
 264       * @return mixed|null The directive value if defined, null otherwise
 265       */
 266      public function getCacheControlDirective($key)
 267      {
 268          return \array_key_exists($key, $this->cacheControl) ? $this->cacheControl[$key] : null;
 269      }
 270   
 271      /**
 272       * Removes a Cache-Control directive.
 273       *
 274       * @param string $key The Cache-Control directive
 275       */
 276      public function removeCacheControlDirective($key)
 277      {
 278          unset($this->cacheControl[$key]);
 279   
 280          $this->set('Cache-Control', $this->getCacheControlHeader());
 281      }
 282   
 283      /**
 284       * Returns an iterator for headers.
 285       *
 286       * @return \ArrayIterator An \ArrayIterator instance
 287       */
 288      public function getIterator()
 289      {
 290          return new \ArrayIterator($this->headers);
 291      }
 292   
 293      /**
 294       * Returns the number of headers.
 295       *
 296       * @return int The number of headers
 297       */
 298      public function count()
 299      {
 300          return \count($this->headers);
 301      }
 302   
 303      protected function getCacheControlHeader()
 304      {
 305          $parts = [];
 306          ksort($this->cacheControl);
 307          foreach ($this->cacheControl as $key => $value) {
 308              if (true === $value) {
 309                  $parts[] = $key;
 310              } else {
 311                  if (preg_match('#[^a-zA-Z0-9._-]#', $value)) {
 312                      $value = '"'.$value.'"';
 313                  }
 314   
 315                  $parts[] = "$key=$value";
 316              }
 317          }
 318   
 319          return implode(', ', $parts);
 320      }
 321   
 322      /**
 323       * Parses a Cache-Control HTTP header.
 324       *
 325       * @param string $header The value of the Cache-Control HTTP header
 326       *
 327       * @return array An array representing the attribute values
 328       */
 329      protected function parseCacheControl($header)
 330      {
 331          $cacheControl = [];
 332          preg_match_all('#([a-zA-Z][a-zA-Z_-]*)\s*(?:=(?:"([^"]*)"|([^ \t",;]*)))?#', $header, $matches, \PREG_SET_ORDER);
 333          foreach ($matches as $match) {
 334              $cacheControl[strtolower($match[1])] = isset($match[3]) ? $match[3] : (isset($match[2]) ? $match[2] : true);
 335          }
 336   
 337          return $cacheControl;
 338      }
 339  }
 340