git-svn-id: https://svn.fournier38.fr/svn/ProgSVN/trunk@5801 bf3deb0d-5f1a-0410-827f-c0cc1f45334c
122 lines
4.3 KiB
PHP
122 lines
4.3 KiB
PHP
<?php
|
|
/** DomFramework
|
|
* @package domframework
|
|
* @author Dominique Fournier <dominique@fournier38.fr>
|
|
*/
|
|
|
|
/** 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
|
|
* @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
|
|
*/
|
|
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;
|
|
}
|
|
// Remove weights (provided by the order of the user)
|
|
// TODO : Reorganise the order if the weights are not in the right order
|
|
foreach ($userchoices as $key=>$val)
|
|
{
|
|
$vals = @explode (";q", $val);
|
|
$userchoices[$key] = $vals[0];
|
|
}
|
|
|
|
if (count ($available) === 0)
|
|
return $userchoices[0];
|
|
|
|
// Look at the best existing solution
|
|
foreach ($userchoices as $choice)
|
|
{
|
|
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;
|
|
// Case text/xml, application/csv (just compare xml or csv)
|
|
$mimes = explode ("/", $choice);
|
|
if (isset ($mimes[1]) && strtolower ($availTmp) === $mimes[1])
|
|
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;
|
|
}
|
|
// }}}
|
|
}
|