Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Symfony\Component\HttpFoundation; Chris@0: Chris@0: /** Chris@0: * Represents an Accept-* header item. Chris@0: * Chris@0: * @author Jean-François Simon Chris@0: */ Chris@0: class AcceptHeaderItem Chris@0: { Chris@0: private $value; Chris@0: private $quality = 1.0; Chris@0: private $index = 0; Chris@17: private $attributes = []; Chris@0: Chris@0: /** Chris@0: * @param string $value Chris@0: * @param array $attributes Chris@0: */ Chris@17: public function __construct($value, array $attributes = []) Chris@0: { Chris@0: $this->value = $value; Chris@0: foreach ($attributes as $name => $value) { Chris@0: $this->setAttribute($name, $value); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Builds an AcceptHeaderInstance instance from a string. Chris@0: * Chris@0: * @param string $itemValue Chris@0: * Chris@0: * @return self Chris@0: */ Chris@0: public static function fromString($itemValue) Chris@0: { Chris@0: $bits = preg_split('/\s*(?:;*("[^"]+");*|;*(\'[^\']+\');*|;+)\s*/', $itemValue, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); Chris@0: $value = array_shift($bits); Chris@17: $attributes = []; Chris@0: Chris@0: $lastNullAttribute = null; Chris@0: foreach ($bits as $bit) { Chris@14: if (($start = substr($bit, 0, 1)) === ($end = substr($bit, -1)) && ('"' === $start || '\'' === $start)) { Chris@0: $attributes[$lastNullAttribute] = substr($bit, 1, -1); Chris@0: } elseif ('=' === $end) { Chris@0: $lastNullAttribute = $bit = substr($bit, 0, -1); Chris@0: $attributes[$bit] = null; Chris@0: } else { Chris@0: $parts = explode('=', $bit); Chris@17: $attributes[$parts[0]] = isset($parts[1]) && \strlen($parts[1]) > 0 ? $parts[1] : ''; Chris@0: } Chris@0: } Chris@0: Chris@14: return new self(($start = substr($value, 0, 1)) === ($end = substr($value, -1)) && ('"' === $start || '\'' === $start) ? substr($value, 1, -1) : $value, $attributes); Chris@0: } Chris@0: Chris@0: /** Chris@17: * Returns header value's string representation. Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: public function __toString() Chris@0: { Chris@0: $string = $this->value.($this->quality < 1 ? ';q='.$this->quality : ''); Chris@17: if (\count($this->attributes) > 0) { Chris@0: $string .= ';'.implode(';', array_map(function ($name, $value) { Chris@0: return sprintf(preg_match('/[,;=]/', $value) ? '%s="%s"' : '%s=%s', $name, $value); Chris@0: }, array_keys($this->attributes), $this->attributes)); Chris@0: } Chris@0: Chris@0: return $string; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set the item value. Chris@0: * Chris@0: * @param string $value Chris@0: * Chris@0: * @return $this Chris@0: */ Chris@0: public function setValue($value) Chris@0: { Chris@0: $this->value = $value; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns the item value. Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: public function getValue() Chris@0: { Chris@0: return $this->value; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set the item quality. Chris@0: * Chris@0: * @param float $quality Chris@0: * Chris@0: * @return $this Chris@0: */ Chris@0: public function setQuality($quality) Chris@0: { Chris@0: $this->quality = $quality; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns the item quality. Chris@0: * Chris@0: * @return float Chris@0: */ Chris@0: public function getQuality() Chris@0: { Chris@0: return $this->quality; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set the item index. Chris@0: * Chris@0: * @param int $index Chris@0: * Chris@0: * @return $this Chris@0: */ Chris@0: public function setIndex($index) Chris@0: { Chris@0: $this->index = $index; Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns the item index. Chris@0: * Chris@0: * @return int Chris@0: */ Chris@0: public function getIndex() Chris@0: { Chris@0: return $this->index; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests if an attribute exists. Chris@0: * Chris@0: * @param string $name Chris@0: * Chris@0: * @return bool Chris@0: */ Chris@0: public function hasAttribute($name) Chris@0: { Chris@0: return isset($this->attributes[$name]); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns an attribute by its name. Chris@0: * Chris@0: * @param string $name Chris@0: * @param mixed $default Chris@0: * Chris@0: * @return mixed Chris@0: */ Chris@0: public function getAttribute($name, $default = null) Chris@0: { Chris@0: return isset($this->attributes[$name]) ? $this->attributes[$name] : $default; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns all attributes. Chris@0: * Chris@0: * @return array Chris@0: */ Chris@0: public function getAttributes() Chris@0: { Chris@0: return $this->attributes; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set an attribute. Chris@0: * Chris@0: * @param string $name Chris@0: * @param string $value Chris@0: * Chris@0: * @return $this Chris@0: */ Chris@0: public function setAttribute($name, $value) Chris@0: { Chris@0: if ('q' === $name) { Chris@0: $this->quality = (float) $value; Chris@0: } else { Chris@0: $this->attributes[$name] = (string) $value; Chris@0: } Chris@0: Chris@0: return $this; Chris@0: } Chris@0: }