string */ public static function getAcceptLanguage() { $dlang = ''; if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { $acclang = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); $L = explode(';', $acclang[0]); $dlang = substr(trim($L[0]),0,2); } return $dlang; } /** @function cache Sends HTTP cache headers (304) according to a list of files and an optionnal list of timestamps. @param files array Files on which check mtime @param mod_ts array List of timestamps */ public static function cache($files,$mod_ts=array()) { if (empty($files) || !is_array($files)) { return; } array_walk($files,create_function('&$v','$v = filemtime($v);')); $array_ts = array_merge($mod_ts,$files); rsort($array_ts); $ts = $array_ts[0]; $since = NULL; if (!empty($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { $since = $_SERVER['HTTP_IF_MODIFIED_SINCE']; $since = preg_replace ('/^(.*)(Mon|Tue|Wed|Thu|Fri|Sat|Sun)(.*)(GMT)(.*)/', '$2$3 GMT', $since); $since = strtotime($since); } # Common headers list $headers[] = 'Last-Modified: '.gmdate('D, d M Y H:i:s',$ts).' GMT'; $headers[] = 'Cache-Control: must-revalidate, max-age=0'; $headers[] = 'Pragma:'; if ($since >= $ts) { self::head(304,'Not Modified'); foreach ($headers as $v) { header($v); } exit; } else { header('Date: '.gmdate('D, d M Y H:i:s').' GMT'); foreach ($headers as $v) { header($v); } } } /** @function etag Sends HTTP cache headers (304) according to a list of etags in client request @param p_content string Response page content */ public static function etag() { # We create an etag from all arguments $args = func_get_args(); if (empty($args)) { return; } $etag = md5(implode('',$args)); unset($args); header('ETag: "'.$etag.'"'); # Do we have a previously sent content? if (!empty($_SERVER['HTTP_IF_NONE_MATCH'])) { foreach (explode(',',$_SERVER['HTTP_IF_NONE_MATCH']) as $i) { if (stripslashes(trim($i)) == $etag) { self::head(304,'Not Modified'); exit; } } } } /** @function head Sends an HTTP code and message to client @param code string HTTP code @param msg string Message */ public static function head($code,$msg=null) { $status_mode = preg_match('/cgi/',php_sapi_name()); if (!$msg) { $msg_codes = array( 100 => 'Continue', 101 => 'Switching Protocols', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported' ); $msg = isset($msg_codes[$code]) ? $msg_codes[$code] : '-'; } if ($status_mode) { header('Status: '.$code.' '.$msg); } else { if (version_compare(phpversion(),'4.3.0','>=')) { header($msg, TRUE, $code); } else { header('HTTP/1.x '.$code.' '.$msg); } } } /** @function trimRequest Trims every value in GET, POST, REQUEST and COOKIE vars. Removes magic quotes if magic_quote_gpc is on. */ public static function trimRequest() { if(!empty($_GET)) { array_walk($_GET,array('self','trimRequestHandler')); } if(!empty($_POST)) { array_walk($_POST,array('self','trimRequestHandler')); } if(!empty($_REQUEST)) { array_walk($_REQUEST,array('self','trimRequestHandler')); } if(!empty($_COOKIE)) { array_walk($_COOKIE,array('self','trimRequestHandler')); } } private static function trimRequestHandler(&$v,$key) { $v = self::trimRequestInVar($v); } private static function trimRequestInVar($value) { if (is_array($value)) { $result = array(); foreach ($value as $k => $v) { if (is_array($v)) { $result[$k] = self::trimRequestInVar($v); } else { if (get_magic_quotes_gpc()) { $v = stripslashes($v); } $result[$k] = trim($v); } } return $result; } else { if (get_magic_quotes_gpc()) { $value = stripslashes($value); } return trim($value); } } /** @function unsetGlobals If register_globals is on, removes every GET, POST, COOKIE, REQUEST, SERVER, ENV, FILES vars from GLOBALS. */ public static function unsetGlobals() { if (!ini_get('register_globals')) { return; } if (isset($_REQUEST['GLOBALS'])) { throw new Exception('GLOBALS overwrite attempt detected'); } # Variables that shouldn't be unset $no_unset = array('GLOBALS','_GET','_POST','_COOKIE','_REQUEST', '_SERVER','_ENV','_FILES'); $input = array_merge($_GET,$_POST,$_COOKIE,$_SERVER,$_ENV,$_FILES, (isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array())); foreach ($input as $k => $v) { if (!in_array($k,$no_unset) && isset($GLOBALS[$k]) ) { $GLOBALS[$k] = NULL; unset($GLOBALS[$k]); } } } } ?>