Version 1
[yaffs-website] / vendor / symfony / http-foundation / AcceptHeader.php
1 <?php
2
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Symfony\Component\HttpFoundation;
13
14 /**
15  * Represents an Accept-* header.
16  *
17  * An accept header is compound with a list of items,
18  * sorted by descending quality.
19  *
20  * @author Jean-François Simon <contact@jfsimon.fr>
21  */
22 class AcceptHeader
23 {
24     /**
25      * @var AcceptHeaderItem[]
26      */
27     private $items = array();
28
29     /**
30      * @var bool
31      */
32     private $sorted = true;
33
34     /**
35      * Constructor.
36      *
37      * @param AcceptHeaderItem[] $items
38      */
39     public function __construct(array $items)
40     {
41         foreach ($items as $item) {
42             $this->add($item);
43         }
44     }
45
46     /**
47      * Builds an AcceptHeader instance from a string.
48      *
49      * @param string $headerValue
50      *
51      * @return self
52      */
53     public static function fromString($headerValue)
54     {
55         $index = 0;
56
57         return new self(array_map(function ($itemValue) use (&$index) {
58             $item = AcceptHeaderItem::fromString($itemValue);
59             $item->setIndex($index++);
60
61             return $item;
62         }, preg_split('/\s*(?:,*("[^"]+"),*|,*(\'[^\']+\'),*|,+)\s*/', $headerValue, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)));
63     }
64
65     /**
66      * Returns header value's string representation.
67      *
68      * @return string
69      */
70     public function __toString()
71     {
72         return implode(',', $this->items);
73     }
74
75     /**
76      * Tests if header has given value.
77      *
78      * @param string $value
79      *
80      * @return bool
81      */
82     public function has($value)
83     {
84         return isset($this->items[$value]);
85     }
86
87     /**
88      * Returns given value's item, if exists.
89      *
90      * @param string $value
91      *
92      * @return AcceptHeaderItem|null
93      */
94     public function get($value)
95     {
96         return isset($this->items[$value]) ? $this->items[$value] : null;
97     }
98
99     /**
100      * Adds an item.
101      *
102      * @param AcceptHeaderItem $item
103      *
104      * @return $this
105      */
106     public function add(AcceptHeaderItem $item)
107     {
108         $this->items[$item->getValue()] = $item;
109         $this->sorted = false;
110
111         return $this;
112     }
113
114     /**
115      * Returns all items.
116      *
117      * @return AcceptHeaderItem[]
118      */
119     public function all()
120     {
121         $this->sort();
122
123         return $this->items;
124     }
125
126     /**
127      * Filters items on their value using given regex.
128      *
129      * @param string $pattern
130      *
131      * @return self
132      */
133     public function filter($pattern)
134     {
135         return new self(array_filter($this->items, function (AcceptHeaderItem $item) use ($pattern) {
136             return preg_match($pattern, $item->getValue());
137         }));
138     }
139
140     /**
141      * Returns first item.
142      *
143      * @return AcceptHeaderItem|null
144      */
145     public function first()
146     {
147         $this->sort();
148
149         return !empty($this->items) ? reset($this->items) : null;
150     }
151
152     /**
153      * Sorts items by descending quality.
154      */
155     private function sort()
156     {
157         if (!$this->sorted) {
158             uasort($this->items, function ($a, $b) {
159                 $qA = $a->getQuality();
160                 $qB = $b->getQuality();
161
162                 if ($qA === $qB) {
163                     return $a->getIndex() > $b->getIndex() ? 1 : -1;
164                 }
165
166                 return $qA > $qB ? -1 : 1;
167             });
168
169             $this->sorted = true;
170         }
171     }
172 }