| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 | <?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;// Help opcache.preload discover always-needed symbolsclass_exists(AcceptHeaderItem::class);/** * Represents an Accept-* header. * * An accept header is compound with a list of items, * sorted by descending quality. * * @author Jean-François Simon <contact@jfsimon.fr> */class AcceptHeader{    /**     * @var AcceptHeaderItem[]     */    private $items = [];    /**     * @var bool     */    private $sorted = true;    /**     * @param AcceptHeaderItem[] $items     */    public function __construct(array $items)    {        foreach ($items as $item) {            $this->add($item);        }    }    /**     * Builds an AcceptHeader instance from a string.     *     * @return self     */    public static function fromString(?string $headerValue)    {        $index = 0;        $parts = HeaderUtils::split($headerValue ?? '', ',;=');        return new self(array_map(function ($subParts) use (&$index) {            $part = array_shift($subParts);            $attributes = HeaderUtils::combine($subParts);            $item = new AcceptHeaderItem($part[0], $attributes);            $item->setIndex($index++);            return $item;        }, $parts));    }    /**     * Returns header value's string representation.     *     * @return string     */    public function __toString()    {        return implode(',', $this->items);    }    /**     * Tests if header has given value.     *     * @return bool     */    public function has(string $value)    {        return isset($this->items[$value]);    }    /**     * Returns given value's item, if exists.     *     * @return AcceptHeaderItem|null     */    public function get(string $value)    {        return $this->items[$value] ?? $this->items[explode('/', $value)[0].'/*'] ?? $this->items['*/*'] ?? $this->items['*'] ?? null;    }    /**     * Adds an item.     *     * @return $this     */    public function add(AcceptHeaderItem $item)    {        $this->items[$item->getValue()] = $item;        $this->sorted = false;        return $this;    }    /**     * Returns all items.     *     * @return AcceptHeaderItem[]     */    public function all()    {        $this->sort();        return $this->items;    }    /**     * Filters items on their value using given regex.     *     * @return self     */    public function filter(string $pattern)    {        return new self(array_filter($this->items, function (AcceptHeaderItem $item) use ($pattern) {            return preg_match($pattern, $item->getValue());        }));    }    /**     * Returns first item.     *     * @return AcceptHeaderItem|null     */    public function first()    {        $this->sort();        return !empty($this->items) ? reset($this->items) : null;    }    /**     * Sorts items by descending quality.     */    private function sort(): void    {        if (!$this->sorted) {            uasort($this->items, function (AcceptHeaderItem $a, AcceptHeaderItem $b) {                $qA = $a->getQuality();                $qB = $b->getQuality();                if ($qA === $qB) {                    return $a->getIndex() > $b->getIndex() ? 1 : -1;                }                return $qA > $qB ? -1 : 1;            });            $this->sorted = true;        }    }}
 |