%PDF- %PDF-
Direktori : /proc/self/root/home1/lightco1/www/lightingrepublic.com.au/libraries/koowa/request/ |
Current File : //proc/self/root/home1/lightco1/www/lightingrepublic.com.au/libraries/koowa/request/request.php |
<?php /** * @version $Id$ * @package Koowa_Request * @copyright Copyright (C) 2007 - 2012 Johan Janssens. All rights reserved. * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> * @link http://www.nooku.org */ //Instantiate the request singleton KRequest::getInstance(); /** * Request class * * @author Johan Janssens <johan@nooku.org> * @package Koowa_Request * @uses KFilter * @uses KInflector * @uses KService * @static */ class KRequest { /** * URL of the request regardless of the server * * @var KHttpUrl */ protected static $_url = null; /** * Base path of the request. * * @var KHttpUrl */ protected static $_base = null; /** * Root path of the request. * * @var KHttpUrl */ protected static $_root = null; /** * Referrer of the request * * @var KHttpUrl */ protected static $_referrer = null; /** * The raw post or put content information * * @var array */ protected static $_content = null; /** * The request accepts information * * @var array */ protected static $_accept = null; /** * Constructor * * Prevent creating instances of this class by making the contructor private */ final private function __construct(KConfig $config) { $content = self::content(); if(self::type() == 'HTTP') { if(strpos(PHP_SAPI, 'cgi') !== false) { $authorization = KRequest::get('server.REDIRECT_HTTP_AUTHORIZATION', 'string'); } else { $authorization = KRequest::get('server.HTTP_AUTHORIZATION', 'url'); } if (strstr($authorization,"Basic")) { $parts = explode(':',base64_decode(substr($authorization, 6))); if (count($parts) == 2) { KRequest::set('server.PHP_AUTH_USER', $parts[0]); KRequest::set('server.PHP_AUTH_PW' , $parts[1]); } } } if(!empty($content['data'])) { if($content['type'] == 'application/x-www-form-urlencoded') { if (in_array(self::method(), array('PUT', 'DELETE'))) { parse_str($content['data'], $GLOBALS['_'.self::method()]); $GLOBALS['_REQUEST'] = array_merge($GLOBALS['_REQUEST'], $GLOBALS['_'.self::method()]); } } if($content['type'] == 'application/json') { if(in_array(self::method(), array('POST', 'PUT', 'DELETE'))) { $GLOBALS['_'.self::method()] = json_decode($content['data'], true); $GLOBALS['_REQUEST'] = array_merge($GLOBALS['_REQUEST'], $GLOBALS['_'.self::method()]); } } } } /** * Clone * * Prevent creating clones of this class */ final private function __clone() { } /** * Force creation of a singleton * * @return void */ public static function getInstance($config = array()) { static $instance; if ($instance === NULL) { if(!$config instanceof KConfig) { $config = new KConfig($config); } $instance = new self($config); } return $instance; } /** * Get sanitized data from the request. * * @param string Variable identifier, prefixed by hash name eg post.foo.bar * @param mixed Filter(s), can be a KFilter object, a filter name, an array of filter names or a filter identifier * @param mixed Default value when the variable doesn't exist * @throws KRequestException When an invalid filter was passed * @return mixed The sanitized data */ public static function get($identifier, $filter, $default = null) { list($hash, $keys) = self::_parseIdentifier($identifier); $result = null; if(isset($GLOBALS['_'.$hash])) { $result = $GLOBALS['_'.$hash]; foreach($keys as $key) { if(array_key_exists($key, $result)) { $result = $result[$key]; } else { $result = null; break; } } } // If the value is null return the default if(is_null($result)) { return $default; } // Handle magic quotes compatability if (get_magic_quotes_gpc() && !in_array($hash, array('FILES', 'SESSION'))) { $result = self::_stripSlashes( $result ); } if(!($filter instanceof KFilterInterface)) { $filter = KService::get('koowa:filter.factory')->instantiate($filter); } return $filter->sanitize($result); } /** * Set a variable in the request. Cookies and session data are stored persistently. * * @param mixed Variable identifier, prefixed by hash name eg post.foo.bar * @param mixed Variable value */ public static function set($identifier, $value) { list($hash, $keys) = self::_parseIdentifier($identifier); // Add to _REQUEST hash if original hash is get, post, or cookies if(in_array($hash, array('GET', 'POST', 'COOKIE'))) { self::set('request.'.implode('.', $keys), $value); } // Store cookies persistently if($hash == 'COOKIE' && strpos(KRequest::protocol(), 'http') !== false) { // rewrite the $keys as foo[bar][bar] $ckeys = $keys; // get a copy $name = array_shift($ckeys); foreach($ckeys as $ckey) { $name .= '['.$ckey.']'; } if(!setcookie($name, $value)) { throw new KRequestException("Couldn't set cookie, headers already sent."); } } // Store in $GLOBALS foreach(array_reverse($keys, true) as $key) { $value = array($key => $value); } // Add the global if it's doesn't exist if(!isset($GLOBALS['_'.$hash])) { $GLOBALS['_'.$hash] = array(); } $GLOBALS['_'.$hash] = KHelperArray::merge($GLOBALS['_'.$hash], $value); } /** * Check if a variable exists based on an identifier * * @param string Variable identifier, prefixed by hash name eg post.foo.bar * @return boolean */ public static function has($identifier) { list($hash, $keys) = self::_parseIdentifier($identifier); foreach($keys as $key) { if(isset($GLOBALS['_'.$hash]) && array_key_exists($key, $GLOBALS['_'.$hash])) { return true; } } return false; } /** * Get the POST or PUT raw content information * * The raw post data is not available with enctype="multipart/form-data". * * @param string The content data to return. Can be 'type' or 'data'. * If not set, all the data will be returned. * @return array An associative array with the content data. Valid keys are * 'type' and 'data' */ public static function content($key = null) { $result = ''; if (!isset(self::$_content) && isset($_SERVER['CONTENT_TYPE'])) { $type = $_SERVER['CONTENT_TYPE']; // strip parameters from content-type like "; charset=UTF-8" if (is_string($type)) { if (preg_match('/^([^,\;]*)/', $type, $matches)) { $type = $matches[1]; } } self::$_content['type'] = $type; $data = ''; if (isset($_SERVER['CONTENT_LENGTH']) && $_SERVER['CONTENT_LENGTH'] > 0) { $input = fopen('php://input', 'r'); while ($chunk = fread($input, 1024)) { $data .= $chunk; } fclose($input); } self::$_content['data'] = $data; } return isset($key) ? self::$_content[$key] : self::$_content; } /** * Get the accept request information * * @param string The accept data to return. Can be 'format', 'encoding' or 'language'. * If not set, all the accept data will be returned. * @return array An associative array with the content data. Valid keys are * 'format', 'encoding' and 'language' */ public static function accept($type = null) { if (!isset(self::$_accept) && isset($_SERVER['HTTP_ACCEPT'])) { $accept = KRequest::get('server.HTTP_ACCEPT', 'string'); self::$_accept['format'] = self::_parseAccept($accept); if (isset($_SERVER['HTTP_ACCEPT_ENCODING'])) { $accept = KRequest::get('server.HTTP_ACCEPT_ENCODING', 'string'); self::$_accept['encoding'] = self::_parseAccept($accept); } if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { $accept = KRequest::get('server.HTTP_ACCEPT_LANGUAGE', 'string'); self::$_accept['language'] = self::_parseAccept($accept); } } return $type ? self::$_accept[$type] : self::$_accept; } /** * Returns the client information doing the request * * @return string $_SERVER['HTTP_USER_AGENT'] or an empty string if it's not supplied in the request */ public static function client() { return isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; } /** * Returns the HTTP referrer. * * 'referer' a commonly used misspelling word for 'referrer' * @see http://en.wikipedia.org/wiki/HTTP_referrer * * @param boolean Only allow internal url's * @return KHttpUrl A KHttpUrl object */ public static function referrer($isInternal = true) { if(!isset(self::$_referrer)) { if($referrer = KRequest::get('server.HTTP_REFERER', 'url')) { self::$_referrer = KService::get('koowa:http.url', array('url' => $referrer)); } } if($isInternal) { if(!KService::get('koowa:filter.internalurl')->validate((string)self::$_referrer)) { return null; } } return self::$_referrer; } /** * Return the URI of the request regardless of the server * * @return KHttpUrl A KHttpUri object */ public static function url() { if(!isset(self::$_url)) { $url = self::protocol().'://'; if (PHP_SAPI !== 'cli') { /* * Since we are assigning the URI from the server variables, we first need * to determine if we are running on apache or IIS. If PHP_SELF and REQUEST_URI * are present, we will assume we are running on apache. */ if (!empty ($_SERVER['PHP_SELF']) && !empty ($_SERVER['REQUEST_URI'])) { /* * To build the entire URI we need to prepend the protocol, and the http host * to the URI string. */ $url .= $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; /* * Since we do not have REQUEST_URI to work with, we will assume we are * running on IIS and will therefore need to work some magic with the SCRIPT_NAME and * QUERY_STRING environment variables. */ } else { // IIS uses the SCRIPT_NAME variable instead of a REQUEST_URI variable $url .= $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']; // If the query string exists append it to the URI string if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) { $url .= '?' . $_SERVER['QUERY_STRING']; } } } else $url .= 'koowa'; // Sanitize the url since we can't trust the server var $url = KService::get('koowa:filter.url')->sanitize($url); // Create the URI object self::$_url = KService::get('koowa:http.url', array('url' => $url)); } return self::$_url; } /** * Returns the base path of the request. * * @return object A KHttpUrl object */ public static function base() { if(!isset(self::$_base)) { // Get the base request path if (strpos(PHP_SAPI, 'cgi') !== false && !ini_get('cgi.fix_pathinfo') && !empty($_SERVER['REQUEST_URI'])) { // PHP-CGI on Apache with "cgi.fix_pathinfo = 0" // We don't have user-supplied PATH_INFO in PHP_SELF $path = $_SERVER['PHP_SELF']; } else $path = $_SERVER['SCRIPT_NAME']; $path = rtrim(dirname($path), '/\\'); // Sanitize the url since we can't trust the server var $path = KService::get('koowa:filter.url')->sanitize($path); self::$_base = KService::get('koowa:http.url', array('url' => $path)); } return self::$_base; } /** * Returns the root path of the request. * * In most case this value will be the same as KRequest::base however it can be * changed by pushing in a different value * * @return object A KHttpUrl object */ public static function root($path = null) { if(!is_null($path)) { if(!$path instanceof KhttpUrl) { $path = KService::get('koowa:http.url', array('url' => $path)); } self::$_root = $path; } if(is_null(self::$_root)) { self::$_root = self::$_base; } return self::$_root; } /** * Returns the current request protocol, based on $_SERVER['https']. In CLI * mode, 'cli' will be returned. * * @return string */ public static function protocol() { $protocol = 'cli'; if (PHP_SAPI !== 'cli') { $protocol = 'http'; if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS']) != 'off')) { $protocol = 'https'; } } return $protocol; } /** * Returns current request method. * * @return string */ public static function method() { $method = ''; if(PHP_SAPI != 'cli') { $method = strtoupper($_SERVER['REQUEST_METHOD']); if($method == 'POST') { if(isset($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'])) { $method = strtoupper($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']); } if(self::has('post._method')) { $method = strtoupper(self::get('post._method', 'cmd')); } } } return $method; } /** * Return the current request transport type. * * @return string */ public static function type() { $type = 'HTTP'; if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') { $type = 'AJAX'; } if( isset($_SERVER['HTTP_X_FLASH_VERSION'])) { $type = 'FLASH'; } if(preg_match('/^(Shockwave|Adobe) Flash/', KRequest::client()) == 1) { $type = 'FLASH'; } return $type; } /** * Return the request token * * @return string The request token or NULL if no token could be found */ public static function token() { $token = null; if(self::has('server.HTTP_X_TOKEN')) { $token = self::get('server.HTTP_X_TOKEN', 'md5'); } if(self::has('request._token')) { $token = self::get('request._token', 'md5'); } return $token; } /** * Return the request format * * This function tries to find the format by inspecting the accept header, * only if one accept type is specified the format will be parsed from it, * otherwise the path extension or the 'format' request variable is used. * * @return string The request format or NULL if no format could be found */ public static function format() { $format = null; if(count(self::accept('format')) == 1) { $mime = explode('/', key(self::accept('format'))); $format = $mime[1]; if($pos = strpos($format, '+')) { $format = substr($format, 0, $pos); } //Format cannot be * if($format == '*') { $format = null; } } if(self::has('request.format')) { $format = self::get('request.format', 'word'); } return $format; } /** * Parse the variable identifier * * @param string Variable identifier * @return array 0 => hash, 1 => parts */ protected static function _parseIdentifier($identifier) { $parts = array(); $hash = $identifier; // Validate the variable format if(strpos($identifier, '.') !== false) { // Split the variable name into it's parts $parts = explode('.', $identifier); // Validate the hash name $hash = array_shift($parts); } $hash = strtoupper($hash); return array($hash, $parts); } /** * Parses an accept header and returns an array (type => quality) of the * accepted types, ordered by quality. * * @param string header to parse * @param array default values * @return array */ protected static function _parseAccept( $accept, array $defaults = NULL) { if (!empty($accept)) { // Get all of the types $types = explode(',', $accept); foreach ($types as $type) { // Split the type into parts $parts = explode(';', $type); // Make the type only the MIME $type = trim(array_shift($parts)); // Default quality is 1.0 $quality = 1.0; foreach ($parts as $part) { // Prevent undefined $value notice below if (strpos($part, '=') === FALSE) { continue; } // Separate the key and value list ($key, $value) = explode('=', trim($part)); if ($key === 'q') { // There is a quality for this type $quality = (float) trim($value); } } // Add the accept type and quality $defaults[$type] = $quality; } } // Make sure that accepts is an array $accepts = (array) $defaults; // Order by quality arsort($accepts); return $accepts; } /** * Strips slashes recursively on an array * * @param array Array of (nested arrays of) strings * @return array The input array with stripshlashes applied to it */ protected static function _stripSlashes( $value ) { if(!is_object($value)) { $value = is_array( $value ) ? array_map( array( 'KRequest', '_stripSlashes' ), $value ) : stripslashes( $value ); } return $value; } }