Version 1
[yaffs-website] / vendor / symfony / http-foundation / AcceptHeaderItem.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 item.
16  *
17  * @author Jean-François Simon <contact@jfsimon.fr>
18  */
19 class AcceptHeaderItem
20 {
21     /**
22      * @var string
23      */
24     private $value;
25
26     /**
27      * @var float
28      */
29     private $quality = 1.0;
30
31     /**
32      * @var int
33      */
34     private $index = 0;
35
36     /**
37      * @var array
38      */
39     private $attributes = array();
40
41     /**
42      * Constructor.
43      *
44      * @param string $value
45      * @param array  $attributes
46      */
47     public function __construct($value, array $attributes = array())
48     {
49         $this->value = $value;
50         foreach ($attributes as $name => $value) {
51             $this->setAttribute($name, $value);
52         }
53     }
54
55     /**
56      * Builds an AcceptHeaderInstance instance from a string.
57      *
58      * @param string $itemValue
59      *
60      * @return self
61      */
62     public static function fromString($itemValue)
63     {
64         $bits = preg_split('/\s*(?:;*("[^"]+");*|;*(\'[^\']+\');*|;+)\s*/', $itemValue, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
65         $value = array_shift($bits);
66         $attributes = array();
67
68         $lastNullAttribute = null;
69         foreach ($bits as $bit) {
70             if (($start = substr($bit, 0, 1)) === ($end = substr($bit, -1)) && ($start === '"' || $start === '\'')) {
71                 $attributes[$lastNullAttribute] = substr($bit, 1, -1);
72             } elseif ('=' === $end) {
73                 $lastNullAttribute = $bit = substr($bit, 0, -1);
74                 $attributes[$bit] = null;
75             } else {
76                 $parts = explode('=', $bit);
77                 $attributes[$parts[0]] = isset($parts[1]) && strlen($parts[1]) > 0 ? $parts[1] : '';
78             }
79         }
80
81         return new self(($start = substr($value, 0, 1)) === ($end = substr($value, -1)) && ($start === '"' || $start === '\'') ? substr($value, 1, -1) : $value, $attributes);
82     }
83
84     /**
85      * Returns header  value's string representation.
86      *
87      * @return string
88      */
89     public function __toString()
90     {
91         $string = $this->value.($this->quality < 1 ? ';q='.$this->quality : '');
92         if (count($this->attributes) > 0) {
93             $string .= ';'.implode(';', array_map(function ($name, $value) {
94                 return sprintf(preg_match('/[,;=]/', $value) ? '%s="%s"' : '%s=%s', $name, $value);
95             }, array_keys($this->attributes), $this->attributes));
96         }
97
98         return $string;
99     }
100
101     /**
102      * Set the item value.
103      *
104      * @param string $value
105      *
106      * @return $this
107      */
108     public function setValue($value)
109     {
110         $this->value = $value;
111
112         return $this;
113     }
114
115     /**
116      * Returns the item value.
117      *
118      * @return string
119      */
120     public function getValue()
121     {
122         return $this->value;
123     }
124
125     /**
126      * Set the item quality.
127      *
128      * @param float $quality
129      *
130      * @return $this
131      */
132     public function setQuality($quality)
133     {
134         $this->quality = $quality;
135
136         return $this;
137     }
138
139     /**
140      * Returns the item quality.
141      *
142      * @return float
143      */
144     public function getQuality()
145     {
146         return $this->quality;
147     }
148
149     /**
150      * Set the item index.
151      *
152      * @param int $index
153      *
154      * @return $this
155      */
156     public function setIndex($index)
157     {
158         $this->index = $index;
159
160         return $this;
161     }
162
163     /**
164      * Returns the item index.
165      *
166      * @return int
167      */
168     public function getIndex()
169     {
170         return $this->index;
171     }
172
173     /**
174      * Tests if an attribute exists.
175      *
176      * @param string $name
177      *
178      * @return bool
179      */
180     public function hasAttribute($name)
181     {
182         return isset($this->attributes[$name]);
183     }
184
185     /**
186      * Returns an attribute by its name.
187      *
188      * @param string $name
189      * @param mixed  $default
190      *
191      * @return mixed
192      */
193     public function getAttribute($name, $default = null)
194     {
195         return isset($this->attributes[$name]) ? $this->attributes[$name] : $default;
196     }
197
198     /**
199      * Returns all attributes.
200      *
201      * @return array
202      */
203     public function getAttributes()
204     {
205         return $this->attributes;
206     }
207
208     /**
209      * Set an attribute.
210      *
211      * @param string $name
212      * @param string $value
213      *
214      * @return $this
215      */
216     public function setAttribute($name, $value)
217     {
218         if ('q' === $name) {
219             $this->quality = (float) $value;
220         } else {
221             $this->attributes[$name] = (string) $value;
222         }
223
224         return $this;
225     }
226 }