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

HeaderBag.php

Zuletzt modifiziert: 02.04.2025, 15:02 - 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