Example #1
0
 /**
  * Parses a RFC 2616 content negotiation header field by evaluating the Quality
  * Values and splitting the options into an array list, ordered by user preference.
  *
  * @param string $rawValues The raw Accept* Header field value
  * @return array The parsed list of field values, ordered by user preference
  */
 public static function parseContentNegotiationQualityValues($rawValues)
 {
     $acceptedTypes = array_map(function ($acceptType) {
         $typeAndQuality = preg_split('/;\\s*q=/', $acceptType);
         return array($typeAndQuality[0], isset($typeAndQuality[1]) ? (double) $typeAndQuality[1] : '');
     }, preg_split('/,\\s*/', $rawValues));
     $flattenedAcceptedTypes = array();
     $valuesWithoutQualityValue = array(array(), array(), array(), array());
     foreach ($acceptedTypes as $typeAndQuality) {
         if ($typeAndQuality[1] === '') {
             $parsedType = Request::parseMediaType($typeAndQuality[0]);
             if ($parsedType['type'] === '*') {
                 $valuesWithoutQualityValue[3][$typeAndQuality[0]] = TRUE;
             } elseif ($parsedType['subtype'] === '*') {
                 $valuesWithoutQualityValue[2][$typeAndQuality[0]] = TRUE;
             } elseif ($parsedType['parameters'] === array()) {
                 $valuesWithoutQualityValue[1][$typeAndQuality[0]] = TRUE;
             } else {
                 $valuesWithoutQualityValue[0][$typeAndQuality[0]] = TRUE;
             }
         } else {
             $flattenedAcceptedTypes[$typeAndQuality[0]] = $typeAndQuality[1];
         }
     }
     $valuesWithoutQualityValue = array_merge(array_keys($valuesWithoutQualityValue[0]), array_keys($valuesWithoutQualityValue[1]), array_keys($valuesWithoutQualityValue[2]), array_keys($valuesWithoutQualityValue[3]));
     arsort($flattenedAcceptedTypes);
     $parsedValues = array_merge($valuesWithoutQualityValue, array_keys($flattenedAcceptedTypes));
     return $parsedValues;
 }