159 lines
3.0 KiB
PHP
159 lines
3.0 KiB
PHP
<?php
|
||
|
||
namespace Negotiation;
|
||
|
||
abstract class BaseAccept
|
||
{
|
||
/**
|
||
* @var float
|
||
*/
|
||
private $quality = 1.0;
|
||
|
||
/**
|
||
* @var string
|
||
*/
|
||
private $normalized;
|
||
|
||
/**
|
||
* @var string
|
||
*/
|
||
private $value;
|
||
|
||
/**
|
||
* @var array
|
||
*/
|
||
private $parameters;
|
||
|
||
/**
|
||
* @var string
|
||
*/
|
||
protected $type;
|
||
|
||
/**
|
||
* @param string $value
|
||
*/
|
||
public function __construct($value)
|
||
{
|
||
list($type, $parameters) = $this->parseParameters($value);
|
||
|
||
if (isset($parameters['q'])) {
|
||
$this->quality = (float) $parameters['q'];
|
||
unset($parameters['q']);
|
||
}
|
||
|
||
$type = trim(strtolower($type));
|
||
|
||
$this->value = $value;
|
||
$this->normalized = $type . ($parameters ? "; " . $this->buildParametersString($parameters) : '');
|
||
$this->type = $type;
|
||
$this->parameters = $parameters;
|
||
}
|
||
|
||
/**
|
||
* @return string
|
||
*/
|
||
public function getNormalizedValue()
|
||
{
|
||
return $this->normalized;
|
||
}
|
||
|
||
/**
|
||
* @return string
|
||
*/
|
||
public function getValue()
|
||
{
|
||
return $this->value;
|
||
}
|
||
|
||
/**
|
||
* @return string
|
||
*/
|
||
public function getType()
|
||
{
|
||
return $this->type;
|
||
}
|
||
|
||
/**
|
||
* @return float
|
||
*/
|
||
public function getQuality()
|
||
{
|
||
return $this->quality;
|
||
}
|
||
|
||
/**
|
||
* @return array
|
||
*/
|
||
public function getParameters()
|
||
{
|
||
return $this->parameters;
|
||
}
|
||
|
||
/**
|
||
* @param string $key
|
||
* @param mixed $default
|
||
*
|
||
* @return string|null
|
||
*/
|
||
public function getParameter($key, $default = null)
|
||
{
|
||
return isset($this->parameters[$key]) ? $this->parameters[$key] : $default;
|
||
}
|
||
|
||
/**
|
||
* @param string $key
|
||
*
|
||
* @return boolean
|
||
*/
|
||
public function hasParameter($key)
|
||
{
|
||
return isset($this->parameters[$key]);
|
||
}
|
||
|
||
/**
|
||
*
|
||
* @param string|null $acceptPart
|
||
* @return array
|
||
*/
|
||
private function parseParameters($acceptPart)
|
||
{
|
||
if ($acceptPart === null) {
|
||
return ['', []];
|
||
}
|
||
|
||
$parts = explode(';', $acceptPart);
|
||
$type = array_shift($parts);
|
||
|
||
$parameters = [];
|
||
foreach ($parts as $part) {
|
||
$part = explode('=', $part);
|
||
|
||
if (2 !== count($part)) {
|
||
continue; // TODO: throw exception here?
|
||
}
|
||
|
||
$key = strtolower(trim($part[0])); // TODO: technically not allowed space around "=". throw exception?
|
||
$parameters[$key] = trim($part[1], ' "');
|
||
}
|
||
|
||
return [ $type, $parameters ];
|
||
}
|
||
|
||
/**
|
||
* @param string $parameters
|
||
*
|
||
* @return string
|
||
*/
|
||
private function buildParametersString($parameters)
|
||
{
|
||
$parts = [];
|
||
|
||
ksort($parameters);
|
||
foreach ($parameters as $key => $val) {
|
||
$parts[] = sprintf('%s=%s', $key, $val);
|
||
}
|
||
|
||
return implode('; ', $parts);
|
||
}
|
||
}
|