* @license BSD */ //namespace Domframework; /** HTTP Helper : understand the best choices provided by browser, the HTTP * codes */ class http { /** Choose the best choice from user choices. * Can be used for languages (HTTP_ACCEPT_LANGUAGE), type of pages * (HTTP_ACCEPT)... * Ex. fr, en-gb;q=0.8, en;q=0.7 * Ex. text/html,application/xhtml+xml,application/xml;q=0.9,* /*;q=0.8 * If available is empty, then return the best priority defined by user, * and throw an exception if nothing is provided for by the user. * If nothing match, return $default * Defined in https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html * @param string $uservar The parameter provided by the user * @param array|null $available The list of available choices in the soft * @param string|null $default The choice if nothing match * @return string The prefered choice */ function bestChoice ($uservar, $available=array(), $default=FALSE) // {{{ { $uservar = str_replace (" ", "", $uservar); $userchoices = explode (",", $uservar); if (!isset ($userchoices[0])) { if ($default === FALSE) throw new \Exception ("No user choice provided to bestChoice", 500); return $default; } // If the priority is not set, must be used in priority // If the priority is set, use it if it is valid $choicesPrio = array (); foreach ($userchoices as $choice) { @list ($choice, $prio) = explode (";q=", $choice); if (trim ($choice) === "") continue; if ($prio === null) $prio = 1.0; else { $nums = explode (".", $prio); if (count ($nums) > 2) $prio = 0.0; elseif ($nums[0] !== "0") $prio = 0.0; elseif ($nums[0] < 0 || $nums[0] > 9) $prio = 0.0; } $choicesPrio[$choice] = $prio; } // Sort by priority arsort ($choicesPrio, SORT_NATURAL); if (count ($available) === 0) return $userchoices[0]; // Look at the best existing solution foreach ($choicesPrio as $choice => $priority) { if ($choice === "*/*") return $default; foreach ($available as $avail) { if (strtolower ($avail) === strtolower ($choice)) return $avail; // Case en_US $availTmp = str_replace ("_", "-", $avail); if (strtolower ($availTmp) === strtolower ($choice)) return $avail; } } // No best solution found. Use the default available solution return $default; } // }}} /** Return the associated text for a HTTP code * @param integer $code The HTTP code to translate in text */ function codetext ($code) // {{{ { switch ($code) { case 100: $text = 'Continue'; break; case 101: $text = 'Switching Protocols'; break; case 200: $text = 'OK'; break; case 201: $text = 'Created'; break; case 202: $text = 'Accepted'; break; case 203: $text = 'Non-Authoritative Information'; break; case 204: $text = 'No Content'; break; case 205: $text = 'Reset Content'; break; case 206: $text = 'Partial Content'; break; case 300: $text = 'Multiple Choices'; break; case 301: $text = 'Moved Permanently'; break; case 302: $text = 'Moved Temporarily'; break; case 303: $text = 'See Other'; break; case 304: $text = 'Not Modified'; break; case 305: $text = 'Use Proxy'; break; case 400: $text = 'Bad Request'; break; case 401: $text = 'Unauthorized'; break; case 402: $text = 'Payment Required'; break; case 403: $text = 'Forbidden'; break; case 404: $text = 'Not Found'; break; case 405: $text = 'Method Not Allowed'; break; case 406: $text = 'Not Acceptable'; break; case 407: $text = 'Proxy Authentication Required'; break; case 408: $text = 'Request Time-out'; break; case 409: $text = 'Conflict'; break; case 410: $text = 'Gone'; break; case 411: $text = 'Length Required'; break; case 412: $text = 'Precondition Failed'; break; case 413: $text = 'Request Entity Too Large'; break; case 414: $text = 'Request-URI Too Large'; break; case 415: $text = 'Unsupported Media Type'; break; case 416: $text = 'Range Not Satisfiable'; break; case 500: $text = 'Internal Server Error'; break; case 501: $text = 'Not Implemented'; break; case 502: $text = 'Bad Gateway'; break; case 503: $text = 'Service Unavailable'; break; case 504: $text = 'Gateway Time-out'; break; case 505: $text = 'HTTP Version not supported'; break; default: exit('Unknown http status code "'.htmlentities ($code).'"'); } return $text; } // }}} }