Files
DomFramework/http.php

114 lines
4.2 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 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;
}
}