143 lines
4.7 KiB
PHP
143 lines
4.7 KiB
PHP
<?php
|
|
/** DomFramework
|
|
* @package domframework
|
|
* @author Dominique Fournier <dominique@fournier38.fr>
|
|
* @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;
|
|
}
|
|
// }}}
|
|
}
|