sonarrradarrplexorganizrnginxdashboardhtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboardmuximuxlandingpagestartpagelanding
		
		
		
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							168 lines
						
					
					
						
							3.5 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							168 lines
						
					
					
						
							3.5 KiB
						
					
					
				| <?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. | |
|  * | |
|  * 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 = array(); | |
| 
 | |
|     /** | |
|      * @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. | |
|      * | |
|      * @param string $headerValue | |
|      * | |
|      * @return self | |
|      */ | |
|     public static function fromString($headerValue) | |
|     { | |
|         $index = 0; | |
| 
 | |
|         return new self(array_map(function ($itemValue) use (&$index) { | |
|             $item = AcceptHeaderItem::fromString($itemValue); | |
|             $item->setIndex($index++); | |
| 
 | |
|             return $item; | |
|         }, preg_split('/\s*(?:,*("[^"]+"),*|,*(\'[^\']+\'),*|,+)\s*/', $headerValue, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE))); | |
|     } | |
| 
 | |
|     /** | |
|      * Returns header value's string representation. | |
|      * | |
|      * @return string | |
|      */ | |
|     public function __toString() | |
|     { | |
|         return implode(',', $this->items); | |
|     } | |
| 
 | |
|     /** | |
|      * Tests if header has given value. | |
|      * | |
|      * @param string $value | |
|      * | |
|      * @return bool | |
|      */ | |
|     public function has($value) | |
|     { | |
|         return isset($this->items[$value]); | |
|     } | |
| 
 | |
|     /** | |
|      * Returns given value's item, if exists. | |
|      * | |
|      * @param string $value | |
|      * | |
|      * @return AcceptHeaderItem|null | |
|      */ | |
|     public function get($value) | |
|     { | |
|         return isset($this->items[$value]) ? $this->items[$value] : 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. | |
|      * | |
|      * @param string $pattern | |
|      * | |
|      * @return self | |
|      */ | |
|     public function filter($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() | |
|     { | |
|         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; | |
|         } | |
|     } | |
| }
 | |
| 
 |