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. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
HeaderBag.php
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