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