2012-04-04 11:22:15 -05:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\HttpFoundation ;
use Symfony\Component\HttpFoundation\Session\SessionInterface ;
/**
* Request represents an HTTP request .
*
2013-01-06 13:58:32 -06:00
* The methods dealing with URL accept / return a raw path ( % encoded ) :
* * getBasePath
* * getBaseUrl
* * getPathInfo
* * getRequestUri
* * getUri
* * getUriForPath
*
2012-04-04 11:22:15 -05:00
* @ author Fabien Potencier < fabien @ symfony . com >
*
* @ api
*/
class Request
{
2013-01-06 13:58:32 -06:00
const HEADER_CLIENT_IP = 'client_ip' ;
const HEADER_CLIENT_HOST = 'client_host' ;
const HEADER_CLIENT_PROTO = 'client_proto' ;
const HEADER_CLIENT_PORT = 'client_port' ;
protected static $trustProxy = false ;
protected static $trustedProxies = array ();
/**
* Names for headers that can be trusted when
* using trusted proxies .
*
* The default names are non - standard , but widely used
* by popular reverse proxies ( like Apache mod_proxy or Amazon EC2 ) .
*/
protected static $trustedHeaders = array (
self :: HEADER_CLIENT_IP => 'X_FORWARDED_FOR' ,
self :: HEADER_CLIENT_HOST => 'X_FORWARDED_HOST' ,
self :: HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO' ,
self :: HEADER_CLIENT_PORT => 'X_FORWARDED_PORT' ,
);
2012-04-04 11:22:15 -05:00
/**
* @ var \Symfony\Component\HttpFoundation\ParameterBag
*
* @ api
*/
public $attributes ;
/**
* @ var \Symfony\Component\HttpFoundation\ParameterBag
*
* @ api
*/
public $request ;
/**
* @ var \Symfony\Component\HttpFoundation\ParameterBag
*
* @ api
*/
public $query ;
/**
* @ var \Symfony\Component\HttpFoundation\ServerBag
*
* @ api
*/
public $server ;
/**
* @ var \Symfony\Component\HttpFoundation\FileBag
*
* @ api
*/
public $files ;
/**
* @ var \Symfony\Component\HttpFoundation\ParameterBag
*
* @ api
*/
public $cookies ;
/**
* @ var \Symfony\Component\HttpFoundation\HeaderBag
*
* @ api
*/
public $headers ;
/**
* @ var string
*/
protected $content ;
/**
2013-01-06 13:58:32 -06:00
* @ var array
2012-04-04 11:22:15 -05:00
*/
protected $languages ;
/**
2013-01-06 13:58:32 -06:00
* @ var array
2012-04-04 11:22:15 -05:00
*/
protected $charsets ;
/**
2013-01-06 13:58:32 -06:00
* @ var array
2012-04-04 11:22:15 -05:00
*/
protected $acceptableContentTypes ;
/**
* @ var string
*/
protected $pathInfo ;
/**
* @ var string
*/
protected $requestUri ;
/**
* @ var string
*/
protected $baseUrl ;
/**
* @ var string
*/
protected $basePath ;
/**
* @ var string
*/
protected $method ;
/**
* @ var string
*/
protected $format ;
/**
* @ var \Symfony\Component\HttpFoundation\Session\SessionInterface
*/
protected $session ;
/**
* @ var string
*/
protected $locale ;
/**
* @ var string
*/
protected $defaultLocale = 'en' ;
/**
2013-01-06 13:58:32 -06:00
* @ var array
2012-04-04 11:22:15 -05:00
*/
2013-01-06 13:58:32 -06:00
protected static $formats ;
2012-04-04 11:22:15 -05:00
/**
* Constructor .
*
* @ param array $query The GET parameters
* @ param array $request The POST parameters
* @ param array $attributes The request attributes ( parameters parsed from the PATH_INFO , ... )
* @ param array $cookies The COOKIE parameters
* @ param array $files The FILES parameters
* @ param array $server The SERVER parameters
* @ param string $content The raw body data
*
* @ api
*/
public function __construct ( array $query = array (), array $request = array (), array $attributes = array (), array $cookies = array (), array $files = array (), array $server = array (), $content = null )
{
$this -> initialize ( $query , $request , $attributes , $cookies , $files , $server , $content );
}
/**
* Sets the parameters for this request .
*
* This method also re - initializes all properties .
*
* @ param array $query The GET parameters
* @ param array $request The POST parameters
* @ param array $attributes The request attributes ( parameters parsed from the PATH_INFO , ... )
* @ param array $cookies The COOKIE parameters
* @ param array $files The FILES parameters
* @ param array $server The SERVER parameters
* @ param string $content The raw body data
*
* @ api
*/
public function initialize ( array $query = array (), array $request = array (), array $attributes = array (), array $cookies = array (), array $files = array (), array $server = array (), $content = null )
{
$this -> request = new ParameterBag ( $request );
$this -> query = new ParameterBag ( $query );
$this -> attributes = new ParameterBag ( $attributes );
$this -> cookies = new ParameterBag ( $cookies );
$this -> files = new FileBag ( $files );
$this -> server = new ServerBag ( $server );
$this -> headers = new HeaderBag ( $this -> server -> getHeaders ());
$this -> content = $content ;
$this -> languages = null ;
$this -> charsets = null ;
$this -> acceptableContentTypes = null ;
$this -> pathInfo = null ;
$this -> requestUri = null ;
$this -> baseUrl = null ;
$this -> basePath = null ;
$this -> method = null ;
$this -> format = null ;
}
/**
* Creates a new request with values from PHP ' s super globals .
*
* @ return Request A new request
*
* @ api
*/
2013-01-06 13:58:32 -06:00
public static function createFromGlobals ()
2012-04-04 11:22:15 -05:00
{
$request = new static ( $_GET , $_POST , array (), $_COOKIE , $_FILES , $_SERVER );
2013-01-06 13:58:32 -06:00
if ( 0 === strpos ( $request -> headers -> get ( 'CONTENT_TYPE' ), 'application/x-www-form-urlencoded' )
2012-04-04 11:22:15 -05:00
&& in_array ( strtoupper ( $request -> server -> get ( 'REQUEST_METHOD' , 'GET' )), array ( 'PUT' , 'DELETE' , 'PATCH' ))
) {
parse_str ( $request -> getContent (), $data );
$request -> request = new ParameterBag ( $data );
}
return $request ;
}
/**
* Creates a Request based on a given URI and configuration .
*
* @ param string $uri The URI
* @ param string $method The HTTP method
2013-01-06 13:58:32 -06:00
* @ param array $parameters The query ( GET ) or request ( POST ) parameters
2012-04-04 11:22:15 -05:00
* @ param array $cookies The request cookies ( $_COOKIE )
* @ param array $files The request files ( $_FILES )
* @ param array $server The server parameters ( $_SERVER )
* @ param string $content The raw body data
*
* @ return Request A Request instance
*
* @ api
*/
2013-01-06 13:58:32 -06:00
public static function create ( $uri , $method = 'GET' , $parameters = array (), $cookies = array (), $files = array (), $server = array (), $content = null )
2012-04-04 11:22:15 -05:00
{
$defaults = array (
'SERVER_NAME' => 'localhost' ,
'SERVER_PORT' => 80 ,
'HTTP_HOST' => 'localhost' ,
'HTTP_USER_AGENT' => 'Symfony/2.X' ,
'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' ,
'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5' ,
'HTTP_ACCEPT_CHARSET' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7' ,
'REMOTE_ADDR' => '127.0.0.1' ,
'SCRIPT_NAME' => '' ,
'SCRIPT_FILENAME' => '' ,
'SERVER_PROTOCOL' => 'HTTP/1.1' ,
'REQUEST_TIME' => time (),
);
$components = parse_url ( $uri );
if ( isset ( $components [ 'host' ])) {
$defaults [ 'SERVER_NAME' ] = $components [ 'host' ];
$defaults [ 'HTTP_HOST' ] = $components [ 'host' ];
}
if ( isset ( $components [ 'scheme' ])) {
if ( 'https' === $components [ 'scheme' ]) {
$defaults [ 'HTTPS' ] = 'on' ;
$defaults [ 'SERVER_PORT' ] = 443 ;
}
}
if ( isset ( $components [ 'port' ])) {
$defaults [ 'SERVER_PORT' ] = $components [ 'port' ];
$defaults [ 'HTTP_HOST' ] = $defaults [ 'HTTP_HOST' ] . ':' . $components [ 'port' ];
}
if ( isset ( $components [ 'user' ])) {
$defaults [ 'PHP_AUTH_USER' ] = $components [ 'user' ];
}
if ( isset ( $components [ 'pass' ])) {
$defaults [ 'PHP_AUTH_PW' ] = $components [ 'pass' ];
}
if ( ! isset ( $components [ 'path' ])) {
2013-01-06 13:58:32 -06:00
$components [ 'path' ] = '/' ;
2012-04-04 11:22:15 -05:00
}
switch ( strtoupper ( $method )) {
case 'POST' :
case 'PUT' :
case 'DELETE' :
$defaults [ 'CONTENT_TYPE' ] = 'application/x-www-form-urlencoded' ;
case 'PATCH' :
$request = $parameters ;
$query = array ();
break ;
default :
$request = array ();
$query = $parameters ;
break ;
}
if ( isset ( $components [ 'query' ])) {
2013-01-06 13:58:32 -06:00
parse_str ( html_entity_decode ( $components [ 'query' ]), $qs );
$query = array_replace ( $qs , $query );
2012-04-04 11:22:15 -05:00
}
2013-01-06 13:58:32 -06:00
$queryString = http_build_query ( $query , '' , '&' );
2012-04-04 11:22:15 -05:00
2013-01-06 13:58:32 -06:00
$uri = $components [ 'path' ] . ( '' !== $queryString ? '?' . $queryString : '' );
2012-04-04 11:22:15 -05:00
$server = array_replace ( $defaults , $server , array (
'REQUEST_METHOD' => strtoupper ( $method ),
'PATH_INFO' => '' ,
'REQUEST_URI' => $uri ,
'QUERY_STRING' => $queryString ,
));
return new static ( $query , $request , array (), $cookies , $files , $server , $content );
}
/**
* Clones a request and overrides some of its parameters .
*
* @ param array $query The GET parameters
* @ param array $request The POST parameters
* @ param array $attributes The request attributes ( parameters parsed from the PATH_INFO , ... )
* @ param array $cookies The COOKIE parameters
* @ param array $files The FILES parameters
* @ param array $server The SERVER parameters
*
2013-01-06 13:58:32 -06:00
* @ return Request The duplicated request
*
2012-04-04 11:22:15 -05:00
* @ api
*/
public function duplicate ( array $query = null , array $request = null , array $attributes = null , array $cookies = null , array $files = null , array $server = null )
{
$dup = clone $this ;
if ( $query !== null ) {
$dup -> query = new ParameterBag ( $query );
}
if ( $request !== null ) {
$dup -> request = new ParameterBag ( $request );
}
if ( $attributes !== null ) {
$dup -> attributes = new ParameterBag ( $attributes );
}
if ( $cookies !== null ) {
$dup -> cookies = new ParameterBag ( $cookies );
}
if ( $files !== null ) {
$dup -> files = new FileBag ( $files );
}
if ( $server !== null ) {
$dup -> server = new ServerBag ( $server );
$dup -> headers = new HeaderBag ( $dup -> server -> getHeaders ());
}
$dup -> languages = null ;
$dup -> charsets = null ;
$dup -> acceptableContentTypes = null ;
$dup -> pathInfo = null ;
$dup -> requestUri = null ;
$dup -> baseUrl = null ;
$dup -> basePath = null ;
$dup -> method = null ;
$dup -> format = null ;
return $dup ;
}
/**
* Clones the current request .
*
* Note that the session is not cloned as duplicated requests
* are most of the time sub - requests of the main one .
*/
public function __clone ()
{
$this -> query = clone $this -> query ;
$this -> request = clone $this -> request ;
$this -> attributes = clone $this -> attributes ;
$this -> cookies = clone $this -> cookies ;
$this -> files = clone $this -> files ;
$this -> server = clone $this -> server ;
$this -> headers = clone $this -> headers ;
}
/**
* Returns the request as a string .
*
* @ return string The request
*/
public function __toString ()
{
return
sprintf ( '%s %s %s' , $this -> getMethod (), $this -> getRequestUri (), $this -> server -> get ( 'SERVER_PROTOCOL' )) . " \r \n " .
$this -> headers . " \r \n " .
$this -> getContent ();
}
/**
* Overrides the PHP global variables according to this request instance .
*
2013-01-06 13:58:32 -06:00
* It overrides $_GET , $_POST , $_REQUEST , $_SERVER , $_COOKIE .
* $_FILES is never override , see rfc1867
2012-04-04 11:22:15 -05:00
*
* @ api
*/
public function overrideGlobals ()
{
$_GET = $this -> query -> all ();
$_POST = $this -> request -> all ();
$_SERVER = $this -> server -> all ();
$_COOKIE = $this -> cookies -> all ();
foreach ( $this -> headers -> all () as $key => $value ) {
$key = strtoupper ( str_replace ( '-' , '_' , $key ));
if ( in_array ( $key , array ( 'CONTENT_TYPE' , 'CONTENT_LENGTH' ))) {
$_SERVER [ $key ] = implode ( ', ' , $value );
} else {
$_SERVER [ 'HTTP_' . $key ] = implode ( ', ' , $value );
}
}
2013-01-06 13:58:32 -06:00
$request = array ( 'g' => $_GET , 'p' => $_POST , 'c' => $_COOKIE );
$requestOrder = ini_get ( 'request_order' ) ? : ini_get ( 'variable_order' );
$requestOrder = preg_replace ( '#[^cgp]#' , '' , strtolower ( $requestOrder )) ? : 'gp' ;
$_REQUEST = array ();
foreach ( str_split ( $requestOrder ) as $order ) {
$_REQUEST = array_merge ( $_REQUEST , $request [ $order ]);
}
2012-04-04 11:22:15 -05:00
}
/**
* Trusts $_SERVER entries coming from proxies .
*
2013-01-06 13:58:32 -06:00
* @ deprecated Deprecated since version 2.0 , to be removed in 2.3 . Use setTrustedProxies instead .
*/
public static function trustProxyData ()
{
self :: $trustProxy = true ;
}
/**
* Sets a list of trusted proxies .
*
* You should only list the reverse proxies that you manage directly .
*
* @ param array $proxies A list of trusted proxies
2012-04-04 11:22:15 -05:00
*
* @ api
*/
2013-01-06 13:58:32 -06:00
public static function setTrustedProxies ( array $proxies )
2012-04-04 11:22:15 -05:00
{
2013-01-06 13:58:32 -06:00
self :: $trustedProxies = $proxies ;
self :: $trustProxy = $proxies ? true : false ;
}
/**
* Sets the name for trusted headers .
*
* The following header keys are supported :
*
* * Request :: HEADER_CLIENT_IP : defaults to X - Forwarded - For ( see getClientIp ())
* * Request :: HEADER_CLIENT_HOST : defaults to X - Forwarded - Host ( see getClientHost ())
* * Request :: HEADER_CLIENT_PORT : defaults to X - Forwarded - Port ( see getClientPort ())
* * Request :: HEADER_CLIENT_PROTO : defaults to X - Forwarded - Proto ( see getScheme () and isSecure ())
*
* Setting an empty value allows to disable the trusted header for the given key .
*
* @ param string $key The header key
* @ param string $value The header name
*/
public static function setTrustedHeaderName ( $key , $value )
{
if ( ! array_key_exists ( $key , self :: $trustedHeaders )) {
throw new \InvalidArgumentException ( sprintf ( 'Unable to set the trusted header name for key "%s".' , $key ));
}
self :: $trustedHeaders [ $key ] = $value ;
2012-04-04 11:22:15 -05:00
}
/**
* Returns true if $_SERVER entries coming from proxies are trusted ,
* false otherwise .
*
* @ return boolean
*/
2013-01-06 13:58:32 -06:00
public static function isProxyTrusted ()
2012-04-04 11:22:15 -05:00
{
return self :: $trustProxy ;
}
2013-01-06 13:58:32 -06:00
/**
* Normalizes a query string .
*
* It builds a normalized query string , where keys / value pairs are alphabetized ,
* have consistent escaping and unneeded delimiters are removed .
*
* @ param string $qs Query string
*
* @ return string A normalized query string for the Request
*/
public static function normalizeQueryString ( $qs )
{
if ( '' == $qs ) {
return '' ;
}
$parts = array ();
$order = array ();
foreach ( explode ( '&' , $qs ) as $param ) {
if ( '' === $param || '=' === $param [ 0 ]) {
// Ignore useless delimiters, e.g. "x=y&".
// Also ignore pairs with empty key, even if there was a value, e.g. "=value", as such nameless values cannot be retrieved anyway.
// PHP also does not include them when building _GET.
continue ;
}
$keyValuePair = explode ( '=' , $param , 2 );
// GET parameters, that are submitted from a HTML form, encode spaces as "+" by default (as defined in enctype application/x-www-form-urlencoded).
// PHP also converts "+" to spaces when filling the global _GET or when using the function parse_str. This is why we use urldecode and then normalize to
// RFC 3986 with rawurlencode.
$parts [] = isset ( $keyValuePair [ 1 ]) ?
rawurlencode ( urldecode ( $keyValuePair [ 0 ])) . '=' . rawurlencode ( urldecode ( $keyValuePair [ 1 ])) :
rawurlencode ( urldecode ( $keyValuePair [ 0 ]));
$order [] = urldecode ( $keyValuePair [ 0 ]);
}
array_multisort ( $order , SORT_ASC , $parts );
return implode ( '&' , $parts );
}
2012-04-04 11:22:15 -05:00
/**
* Gets a " parameter " value .
*
* This method is mainly useful for libraries that want to provide some flexibility .
*
2013-01-06 13:58:32 -06:00
* Order of precedence : GET , PATH , POST
2012-04-04 11:22:15 -05:00
*
* Avoid using this method in controllers :
*
* * slow
* * prefer to get from a " named " source
*
2013-01-06 13:58:32 -06:00
* It is better to explicitly get request parameters from the appropriate
* public property instead ( query , attributes , request ) .
2012-04-04 11:22:15 -05:00
*
2013-01-06 13:58:32 -06:00
* @ param string $key the key
* @ param mixed $default the default value
* @ param Boolean $deep is parameter deep in multidimensional array
2012-04-04 11:22:15 -05:00
*
* @ return mixed
*/
public function get ( $key , $default = null , $deep = false )
{
return $this -> query -> get ( $key , $this -> attributes -> get ( $key , $this -> request -> get ( $key , $default , $deep ), $deep ), $deep );
}
/**
* Gets the Session .
*
* @ return SessionInterface | null The session
*
* @ api
*/
public function getSession ()
{
return $this -> session ;
}
/**
* Whether the request contains a Session which was started in one of the
* previous requests .
*
2013-01-06 13:58:32 -06:00
* @ return Boolean
2012-04-04 11:22:15 -05:00
*
* @ api
*/
public function hasPreviousSession ()
{
// the check for $this->session avoids malicious users trying to fake a session cookie with proper name
2013-01-06 13:58:32 -06:00
return $this -> hasSession () && $this -> cookies -> has ( $this -> session -> getName ());
2012-04-04 11:22:15 -05:00
}
/**
* Whether the request contains a Session object .
*
2013-01-06 13:58:32 -06:00
* This method does not give any information about the state of the session object ,
* like whether the session is started or not . It is just a way to check if this Request
* is associated with a Session instance .
*
* @ return Boolean true when the Request contains a Session object , false otherwise
2012-04-04 11:22:15 -05:00
*
* @ api
*/
public function hasSession ()
{
return null !== $this -> session ;
}
/**
* Sets the Session .
*
* @ param SessionInterface $session The Session
*
* @ api
*/
public function setSession ( SessionInterface $session )
{
$this -> session = $session ;
}
/**
* Returns the client IP address .
*
2013-01-06 13:58:32 -06:00
* This method can read the client IP address from the " X-Forwarded-For " header
* when trusted proxies were set via " setTrustedProxies() " . The " X-Forwarded-For "
* header value is a comma + space separated list of IP addresses , the left - most
* being the original client , and each successive proxy that passed the request
* adding the IP address where it received the request from .
*
* If your reverse proxy uses a different header name than " X-Forwarded-For " ,
* ( " Client-Ip " for instance ), configure it via " setTrustedHeaderName() " with
* the " client-ip " key .
*
2012-04-04 11:22:15 -05:00
* @ return string The client IP address
*
2013-01-06 13:58:32 -06:00
* @ see http :// en . wikipedia . org / wiki / X - Forwarded - For
*
* @ deprecated The proxy argument is deprecated since version 2.0 and will be removed in 2.3 . Use setTrustedProxies instead .
*
2012-04-04 11:22:15 -05:00
* @ api
*/
public function getClientIp ()
{
2013-01-06 13:58:32 -06:00
$ip = $this -> server -> get ( 'REMOTE_ADDR' );
2012-04-04 11:22:15 -05:00
2013-01-06 13:58:32 -06:00
if ( ! self :: $trustProxy ) {
return $ip ;
}
if ( ! self :: $trustedHeaders [ self :: HEADER_CLIENT_IP ] || ! $this -> headers -> has ( self :: $trustedHeaders [ self :: HEADER_CLIENT_IP ])) {
return $ip ;
2012-04-04 11:22:15 -05:00
}
2013-01-06 13:58:32 -06:00
$clientIps = array_map ( 'trim' , explode ( ',' , $this -> headers -> get ( self :: $trustedHeaders [ self :: HEADER_CLIENT_IP ])));
$clientIps [] = $ip ;
$trustedProxies = self :: $trustProxy && ! self :: $trustedProxies ? array ( $ip ) : self :: $trustedProxies ;
$clientIps = array_diff ( $clientIps , $trustedProxies );
return array_pop ( $clientIps );
2012-04-04 11:22:15 -05:00
}
/**
* Returns current script name .
*
* @ return string
*
* @ api
*/
public function getScriptName ()
{
return $this -> server -> get ( 'SCRIPT_NAME' , $this -> server -> get ( 'ORIG_SCRIPT_NAME' , '' ));
}
/**
* Returns the path being requested relative to the executed script .
*
* The path info always starts with a /.
*
* Suppose this request is instantiated from / mysite on localhost :
*
* * http :// localhost / mysite returns an empty string
* * http :// localhost / mysite / about returns '/about'
2013-01-06 13:58:32 -06:00
* * htpp :// localhost / mysite / enco % 20 ded returns '/enco%20ded'
2012-04-04 11:22:15 -05:00
* * http :// localhost / mysite / about ? var = 1 returns '/about'
*
2013-01-06 13:58:32 -06:00
* @ return string The raw path ( i . e . not urldecoded )
2012-04-04 11:22:15 -05:00
*
* @ api
*/
public function getPathInfo ()
{
if ( null === $this -> pathInfo ) {
$this -> pathInfo = $this -> preparePathInfo ();
}
return $this -> pathInfo ;
}
/**
* Returns the root path from which this request is executed .
*
* Suppose that an index . php file instantiates this request object :
*
2013-01-06 13:58:32 -06:00
* * http :// localhost / index . php returns an empty string
* * http :// localhost / index . php / page returns an empty string
* * http :// localhost / web / index . php returns '/web'
* * http :// localhost / we % 20 b / index . php returns '/we%20b'
2012-04-04 11:22:15 -05:00
*
2013-01-06 13:58:32 -06:00
* @ return string The raw path ( i . e . not urldecoded )
2012-04-04 11:22:15 -05:00
*
* @ api
*/
public function getBasePath ()
{
if ( null === $this -> basePath ) {
$this -> basePath = $this -> prepareBasePath ();
}
return $this -> basePath ;
}
/**
* Returns the root url from which this request is executed .
*
* The base URL never ends with a /.
*
* This is similar to getBasePath (), except that it also includes the
* script filename ( e . g . index . php ) if one exists .
*
2013-01-06 13:58:32 -06:00
* @ return string The raw url ( i . e . not urldecoded )
2012-04-04 11:22:15 -05:00
*
* @ api
*/
public function getBaseUrl ()
{
if ( null === $this -> baseUrl ) {
$this -> baseUrl = $this -> prepareBaseUrl ();
}
return $this -> baseUrl ;
}
/**
* Gets the request ' s scheme .
*
* @ return string
*
* @ api
*/
public function getScheme ()
{
return $this -> isSecure () ? 'https' : 'http' ;
}
/**
* Returns the port on which the request is made .
*
2013-01-06 13:58:32 -06:00
* This method can read the client port from the " X-Forwarded-Port " header
* when trusted proxies were set via " setTrustedProxies() " .
*
* The " X-Forwarded-Port " header must contain the client port .
*
* If your reverse proxy uses a different header name than " X-Forwarded-Port " ,
* configure it via " setTrustedHeaderName() " with the " client-port " key .
*
2012-04-04 11:22:15 -05:00
* @ return string
*
* @ api
*/
public function getPort ()
{
2013-01-06 13:58:32 -06:00
if ( self :: $trustProxy && self :: $trustedHeaders [ self :: HEADER_CLIENT_PORT ] && $port = $this -> headers -> get ( self :: $trustedHeaders [ self :: HEADER_CLIENT_PORT ])) {
return $port ;
2012-04-04 11:22:15 -05:00
}
2013-01-06 13:58:32 -06:00
return $this -> server -> get ( 'SERVER_PORT' );
2012-04-04 11:22:15 -05:00
}
/**
* Returns the user .
*
* @ return string | null
*/
public function getUser ()
{
return $this -> server -> get ( 'PHP_AUTH_USER' );
}
/**
* Returns the password .
*
* @ return string | null
*/
public function getPassword ()
{
return $this -> server -> get ( 'PHP_AUTH_PW' );
}
2013-01-06 13:58:32 -06:00
/**
* Gets the user info .
*
* @ return string A user name and , optionally , scheme - specific information about how to gain authorization to access the server
*/
public function getUserInfo ()
{
$userinfo = $this -> getUser ();
$pass = $this -> getPassword ();
if ( '' != $pass ) {
$userinfo .= " : $pass " ;
}
return $userinfo ;
}
2012-04-04 11:22:15 -05:00
/**
* Returns the HTTP host being requested .
*
* The port name will be appended to the host if it ' s non - standard .
*
* @ return string
*
* @ api
*/
public function getHttpHost ()
{
$scheme = $this -> getScheme ();
$port = $this -> getPort ();
if (( 'http' == $scheme && $port == 80 ) || ( 'https' == $scheme && $port == 443 )) {
return $this -> getHost ();
}
return $this -> getHost () . ':' . $port ;
}
/**
* Returns the requested URI .
*
2013-01-06 13:58:32 -06:00
* @ return string The raw URI ( i . e . not urldecoded )
2012-04-04 11:22:15 -05:00
*
* @ api
*/
public function getRequestUri ()
{
if ( null === $this -> requestUri ) {
$this -> requestUri = $this -> prepareRequestUri ();
}
return $this -> requestUri ;
}
2013-01-06 13:58:32 -06:00
/**
* Gets the scheme and HTTP host .
*
* If the URL was called with basic authentication , the user
* and the password are not added to the generated string .
*
* @ return string The scheme and HTTP host
*/
public function getSchemeAndHttpHost ()
{
return $this -> getScheme () . '://' . $this -> getHttpHost ();
}
2012-04-04 11:22:15 -05:00
/**
* Generates a normalized URI for the Request .
*
* @ return string A normalized URI for the Request
*
* @ see getQueryString ()
*
* @ api
*/
public function getUri ()
{
$qs = $this -> getQueryString ();
if ( null !== $qs ) {
$qs = '?' . $qs ;
}
2013-01-06 13:58:32 -06:00
return $this -> getSchemeAndHttpHost () . $this -> getBaseUrl () . $this -> getPathInfo () . $qs ;
2012-04-04 11:22:15 -05:00
}
/**
* Generates a normalized URI for the given path .
*
* @ param string $path A path to use instead of the current one
*
* @ return string The normalized URI for the path
*
* @ api
*/
public function getUriForPath ( $path )
{
2013-01-06 13:58:32 -06:00
return $this -> getSchemeAndHttpHost () . $this -> getBaseUrl () . $path ;
2012-04-04 11:22:15 -05:00
}
/**
* Generates the normalized query string for the Request .
*
* It builds a normalized query string , where keys / value pairs are alphabetized
* and have consistent escaping .
*
* @ return string | null A normalized query string for the Request
*
* @ api
*/
public function getQueryString ()
{
2013-01-06 13:58:32 -06:00
$qs = static :: normalizeQueryString ( $this -> server -> get ( 'QUERY_STRING' ));
2012-04-04 11:22:15 -05:00
2013-01-06 13:58:32 -06:00
return '' === $qs ? null : $qs ;
2012-04-04 11:22:15 -05:00
}
/**
* Checks whether the request is secure or not .
*
2013-01-06 13:58:32 -06:00
* This method can read the client port from the " X-Forwarded-Proto " header
* when trusted proxies were set via " setTrustedProxies() " .
*
* The " X-Forwarded-Proto " header must contain the protocol : " https " or " http " .
*
* If your reverse proxy uses a different header name than " X-Forwarded-Proto "
* ( " SSL_HTTPS " for instance ), configure it via " setTrustedHeaderName() " with
* the " client-proto " key .
*
2012-04-04 11:22:15 -05:00
* @ return Boolean
*
* @ api
*/
public function isSecure ()
{
2013-01-06 13:58:32 -06:00
if ( self :: $trustProxy && self :: $trustedHeaders [ self :: HEADER_CLIENT_PROTO ] && $proto = $this -> headers -> get ( self :: $trustedHeaders [ self :: HEADER_CLIENT_PROTO ])) {
return in_array ( strtolower ( $proto ), array ( 'https' , 'on' , '1' ));
}
return 'on' == strtolower ( $this -> server -> get ( 'HTTPS' )) || 1 == $this -> server -> get ( 'HTTPS' );
2012-04-04 11:22:15 -05:00
}
/**
* Returns the host name .
*
2013-01-06 13:58:32 -06:00
* This method can read the client port from the " X-Forwarded-Host " header
* when trusted proxies were set via " setTrustedProxies() " .
*
* The " X-Forwarded-Host " header must contain the client host name .
*
* If your reverse proxy uses a different header name than " X-Forwarded-Host " ,
* configure it via " setTrustedHeaderName() " with the " client-host " key .
*
2012-04-04 11:22:15 -05:00
* @ return string
*
2013-01-06 13:58:32 -06:00
* @ throws \UnexpectedValueException when the host name is invalid
*
2012-04-04 11:22:15 -05:00
* @ api
*/
public function getHost ()
{
2013-01-06 13:58:32 -06:00
if ( self :: $trustProxy && self :: $trustedHeaders [ self :: HEADER_CLIENT_HOST ] && $host = $this -> headers -> get ( self :: $trustedHeaders [ self :: HEADER_CLIENT_HOST ])) {
2012-04-04 11:22:15 -05:00
$elements = explode ( ',' , $host );
2013-01-06 13:58:32 -06:00
$host = $elements [ count ( $elements ) - 1 ];
} elseif ( ! $host = $this -> headers -> get ( 'HOST' )) {
if ( ! $host = $this -> server -> get ( 'SERVER_NAME' )) {
$host = $this -> server -> get ( 'SERVER_ADDR' , '' );
2012-04-04 11:22:15 -05:00
}
}
2013-01-06 13:58:32 -06:00
// trim and remove port number from host
// host is lowercase as per RFC 952/2181
$host = strtolower ( preg_replace ( '/:\d+$/' , '' , trim ( $host )));
// as the host can come from the user (HTTP_HOST and depending on the configuration, SERVER_NAME too can come from the user)
// check that it does not contain forbidden characters (see RFC 952 and RFC 2181)
if ( $host && ! preg_match ( '/^\[?(?:[a-zA-Z0-9-:\]_]+\.?)+$/' , $host )) {
throw new \UnexpectedValueException ( 'Invalid Host' );
}
2012-04-04 11:22:15 -05:00
2013-01-06 13:58:32 -06:00
return $host ;
2012-04-04 11:22:15 -05:00
}
/**
* Sets the request method .
*
* @ param string $method
*
* @ api
*/
public function setMethod ( $method )
{
$this -> method = null ;
$this -> server -> set ( 'REQUEST_METHOD' , $method );
}
/**
* Gets the request method .
*
* The method is always an uppercased string .
*
* @ return string The request method
*
* @ api
*/
public function getMethod ()
{
if ( null === $this -> method ) {
$this -> method = strtoupper ( $this -> server -> get ( 'REQUEST_METHOD' , 'GET' ));
if ( 'POST' === $this -> method ) {
2013-01-06 13:58:32 -06:00
$this -> method = strtoupper ( $this -> headers -> get ( 'X-HTTP-METHOD-OVERRIDE' , $this -> request -> get ( '_method' , $this -> query -> get ( '_method' , 'POST' ))));
2012-04-04 11:22:15 -05:00
}
}
return $this -> method ;
}
/**
* Gets the mime type associated with the format .
*
2013-01-06 13:58:32 -06:00
* @ param string $format The format
2012-04-04 11:22:15 -05:00
*
* @ return string The associated mime type ( null if not found )
*
* @ api
*/
public function getMimeType ( $format )
{
if ( null === static :: $formats ) {
static :: initializeFormats ();
}
return isset ( static :: $formats [ $format ]) ? static :: $formats [ $format ][ 0 ] : null ;
}
/**
* Gets the format associated with the mime type .
*
2013-01-06 13:58:32 -06:00
* @ param string $mimeType The associated mime type
2012-04-04 11:22:15 -05:00
*
2013-01-06 13:58:32 -06:00
* @ return string | null The format ( null if not found )
2012-04-04 11:22:15 -05:00
*
* @ api
*/
public function getFormat ( $mimeType )
{
if ( false !== $pos = strpos ( $mimeType , ';' )) {
$mimeType = substr ( $mimeType , 0 , $pos );
}
if ( null === static :: $formats ) {
static :: initializeFormats ();
}
foreach ( static :: $formats as $format => $mimeTypes ) {
if ( in_array ( $mimeType , ( array ) $mimeTypes )) {
return $format ;
}
}
return null ;
}
/**
* Associates a format with mime types .
*
2013-01-06 13:58:32 -06:00
* @ param string $format The format
* @ param string | array $mimeTypes The associated mime types ( the preferred one must be the first as it will be used as the content type )
2012-04-04 11:22:15 -05:00
*
* @ api
*/
public function setFormat ( $format , $mimeTypes )
{
if ( null === static :: $formats ) {
static :: initializeFormats ();
}
static :: $formats [ $format ] = is_array ( $mimeTypes ) ? $mimeTypes : array ( $mimeTypes );
}
/**
* Gets the request format .
*
* Here is the process to determine the format :
*
* * format defined by the user ( with setRequestFormat ())
* * _format request parameter
* * $default
*
2013-01-06 13:58:32 -06:00
* @ param string $default The default format
2012-04-04 11:22:15 -05:00
*
* @ return string The request format
*
* @ api
*/
public function getRequestFormat ( $default = 'html' )
{
if ( null === $this -> format ) {
$this -> format = $this -> get ( '_format' , $default );
}
return $this -> format ;
}
/**
* Sets the request format .
*
* @ param string $format The request format .
*
* @ api
*/
public function setRequestFormat ( $format )
{
$this -> format = $format ;
}
/**
* Gets the format associated with the request .
*
2013-01-06 13:58:32 -06:00
* @ return string | null The format ( null if no content type is present )
2012-04-04 11:22:15 -05:00
*
* @ api
*/
public function getContentType ()
{
2013-01-06 13:58:32 -06:00
return $this -> getFormat ( $this -> headers -> get ( 'CONTENT_TYPE' ));
2012-04-04 11:22:15 -05:00
}
/**
* Sets the default locale .
*
* @ param string $locale
*
* @ api
*/
public function setDefaultLocale ( $locale )
{
2013-01-06 13:58:32 -06:00
$this -> defaultLocale = $locale ;
if ( null === $this -> locale ) {
$this -> setPhpDefaultLocale ( $locale );
}
2012-04-04 11:22:15 -05:00
}
/**
* Sets the locale .
*
* @ param string $locale
*
* @ api
*/
public function setLocale ( $locale )
{
$this -> setPhpDefaultLocale ( $this -> locale = $locale );
}
/**
* Get the locale .
*
* @ return string
*/
public function getLocale ()
{
return null === $this -> locale ? $this -> defaultLocale : $this -> locale ;
}
2013-01-06 13:58:32 -06:00
/**
* Checks if the request method is of specified type .
*
* @ param string $method Uppercase request method ( GET , POST etc ) .
*
* @ return Boolean
*/
public function isMethod ( $method )
{
return $this -> getMethod () === strtoupper ( $method );
}
2012-04-04 11:22:15 -05:00
/**
* Checks whether the method is safe or not .
*
* @ return Boolean
*
* @ api
*/
public function isMethodSafe ()
{
return in_array ( $this -> getMethod (), array ( 'GET' , 'HEAD' ));
}
/**
* Returns the request body content .
*
2013-01-06 13:58:32 -06:00
* @ param Boolean $asResource If true , a resource will be returned
2012-04-04 11:22:15 -05:00
*
* @ return string | resource The request body content or a resource to read the body stream .
*/
public function getContent ( $asResource = false )
{
if ( false === $this -> content || ( true === $asResource && null !== $this -> content )) {
throw new \LogicException ( 'getContent() can only be called once when using the resource return type.' );
}
if ( true === $asResource ) {
$this -> content = false ;
return fopen ( 'php://input' , 'rb' );
}
if ( null === $this -> content ) {
$this -> content = file_get_contents ( 'php://input' );
}
return $this -> content ;
}
/**
* Gets the Etags .
*
* @ return array The entity tags
*/
public function getETags ()
{
return preg_split ( '/\s*,\s*/' , $this -> headers -> get ( 'if_none_match' ), null , PREG_SPLIT_NO_EMPTY );
}
2013-01-06 13:58:32 -06:00
/**
* @ return Boolean
*/
2012-04-04 11:22:15 -05:00
public function isNoCache ()
{
return $this -> headers -> hasCacheControlDirective ( 'no-cache' ) || 'no-cache' == $this -> headers -> get ( 'Pragma' );
}
/**
* Returns the preferred language .
*
2013-01-06 13:58:32 -06:00
* @ param array $locales An array of ordered available locales
2012-04-04 11:22:15 -05:00
*
* @ return string | null The preferred locale
*
* @ api
*/
public function getPreferredLanguage ( array $locales = null )
{
$preferredLanguages = $this -> getLanguages ();
if ( empty ( $locales )) {
return isset ( $preferredLanguages [ 0 ]) ? $preferredLanguages [ 0 ] : null ;
}
if ( ! $preferredLanguages ) {
return $locales [ 0 ];
}
$preferredLanguages = array_values ( array_intersect ( $preferredLanguages , $locales ));
return isset ( $preferredLanguages [ 0 ]) ? $preferredLanguages [ 0 ] : $locales [ 0 ];
}
/**
* Gets a list of languages acceptable by the client browser .
*
* @ return array Languages ordered in the user browser preferences
*
* @ api
*/
public function getLanguages ()
{
if ( null !== $this -> languages ) {
return $this -> languages ;
}
$languages = $this -> splitHttpAcceptHeader ( $this -> headers -> get ( 'Accept-Language' ));
$this -> languages = array ();
foreach ( $languages as $lang => $q ) {
if ( strstr ( $lang , '-' )) {
$codes = explode ( '-' , $lang );
if ( $codes [ 0 ] == 'i' ) {
// Language not listed in ISO 639 that are not variants
// of any listed language, which can be registered with the
// i-prefix, such as i-cherokee
if ( count ( $codes ) > 1 ) {
$lang = $codes [ 1 ];
}
} else {
for ( $i = 0 , $max = count ( $codes ); $i < $max ; $i ++ ) {
if ( $i == 0 ) {
$lang = strtolower ( $codes [ 0 ]);
} else {
$lang .= '_' . strtoupper ( $codes [ $i ]);
}
}
}
}
$this -> languages [] = $lang ;
}
return $this -> languages ;
}
/**
* Gets a list of charsets acceptable by the client browser .
*
* @ return array List of charsets in preferable order
*
* @ api
*/
public function getCharsets ()
{
if ( null !== $this -> charsets ) {
return $this -> charsets ;
}
return $this -> charsets = array_keys ( $this -> splitHttpAcceptHeader ( $this -> headers -> get ( 'Accept-Charset' )));
}
/**
* Gets a list of content types acceptable by the client browser
*
* @ return array List of content types in preferable order
*
* @ api
*/
public function getAcceptableContentTypes ()
{
if ( null !== $this -> acceptableContentTypes ) {
return $this -> acceptableContentTypes ;
}
return $this -> acceptableContentTypes = array_keys ( $this -> splitHttpAcceptHeader ( $this -> headers -> get ( 'Accept' )));
}
/**
* Returns true if the request is a XMLHttpRequest .
*
* It works if your JavaScript library set an X - Requested - With HTTP header .
* It is known to work with Prototype , Mootools , jQuery .
*
* @ return Boolean true if the request is an XMLHttpRequest , false otherwise
*
* @ api
*/
public function isXmlHttpRequest ()
{
return 'XMLHttpRequest' == $this -> headers -> get ( 'X-Requested-With' );
}
/**
* Splits an Accept -* HTTP header .
*
2013-01-06 13:58:32 -06:00
* @ param string $header Header to split
2012-04-04 11:22:15 -05:00
*
* @ return array Array indexed by the values of the Accept -* header in preferred order
*/
public function splitHttpAcceptHeader ( $header )
{
if ( ! $header ) {
return array ();
}
$values = array ();
2013-01-06 13:58:32 -06:00
$groups = array ();
2012-04-04 11:22:15 -05:00
foreach ( array_filter ( explode ( ',' , $header )) as $value ) {
// Cut off any q-value that might come after a semi-colon
if ( preg_match ( '/;\s*(q=.*$)/' , $value , $match )) {
2013-01-06 13:58:32 -06:00
$q = substr ( trim ( $match [ 1 ]), 2 );
2012-04-04 11:22:15 -05:00
$value = trim ( substr ( $value , 0 , - strlen ( $match [ 0 ])));
} else {
$q = 1 ;
}
2013-01-06 13:58:32 -06:00
$groups [ $q ][] = $value ;
}
krsort ( $groups );
foreach ( $groups as $q => $items ) {
$q = ( float ) $q ;
2012-04-04 11:22:15 -05:00
if ( 0 < $q ) {
2013-01-06 13:58:32 -06:00
foreach ( $items as $value ) {
$values [ trim ( $value )] = $q ;
}
2012-04-04 11:22:15 -05:00
}
}
return $values ;
}
/*
* The following methods are derived from code of the Zend Framework ( 1.10 dev - 2010 - 01 - 24 )
*
* Code subject to the new BSD license ( http :// framework . zend . com / license / new - bsd ) .
*
* Copyright ( c ) 2005 - 2010 Zend Technologies USA Inc . ( http :// www . zend . com )
*/
protected function prepareRequestUri ()
{
$requestUri = '' ;
2013-01-06 13:58:32 -06:00
if ( $this -> headers -> has ( 'X_ORIGINAL_URL' ) && false !== stripos ( PHP_OS , 'WIN' )) {
// IIS with Microsoft Rewrite Module
$requestUri = $this -> headers -> get ( 'X_ORIGINAL_URL' );
} elseif ( $this -> headers -> has ( 'X_REWRITE_URL' ) && false !== stripos ( PHP_OS , 'WIN' )) {
// IIS with ISAPI_Rewrite
2012-04-04 11:22:15 -05:00
$requestUri = $this -> headers -> get ( 'X_REWRITE_URL' );
} elseif ( $this -> server -> get ( 'IIS_WasUrlRewritten' ) == '1' && $this -> server -> get ( 'UNENCODED_URL' ) != '' ) {
// IIS7 with URL Rewrite: make sure we get the unencoded url (double slash problem)
$requestUri = $this -> server -> get ( 'UNENCODED_URL' );
} elseif ( $this -> server -> has ( 'REQUEST_URI' )) {
$requestUri = $this -> server -> get ( 'REQUEST_URI' );
// HTTP proxy reqs setup request uri with scheme and host [and port] + the url path, only use url path
2013-01-06 13:58:32 -06:00
$schemeAndHttpHost = $this -> getSchemeAndHttpHost ();
2012-04-04 11:22:15 -05:00
if ( strpos ( $requestUri , $schemeAndHttpHost ) === 0 ) {
$requestUri = substr ( $requestUri , strlen ( $schemeAndHttpHost ));
}
} elseif ( $this -> server -> has ( 'ORIG_PATH_INFO' )) {
// IIS 5.0, PHP as CGI
$requestUri = $this -> server -> get ( 'ORIG_PATH_INFO' );
2013-01-06 13:58:32 -06:00
if ( '' != $this -> server -> get ( 'QUERY_STRING' )) {
2012-04-04 11:22:15 -05:00
$requestUri .= '?' . $this -> server -> get ( 'QUERY_STRING' );
}
}
return $requestUri ;
}
/**
* Prepares the base URL .
*
* @ return string
*/
protected function prepareBaseUrl ()
{
$filename = basename ( $this -> server -> get ( 'SCRIPT_FILENAME' ));
if ( basename ( $this -> server -> get ( 'SCRIPT_NAME' )) === $filename ) {
$baseUrl = $this -> server -> get ( 'SCRIPT_NAME' );
} elseif ( basename ( $this -> server -> get ( 'PHP_SELF' )) === $filename ) {
$baseUrl = $this -> server -> get ( 'PHP_SELF' );
} elseif ( basename ( $this -> server -> get ( 'ORIG_SCRIPT_NAME' )) === $filename ) {
$baseUrl = $this -> server -> get ( 'ORIG_SCRIPT_NAME' ); // 1and1 shared hosting compatibility
} else {
// Backtrack up the script_filename to find the portion matching
// php_self
$path = $this -> server -> get ( 'PHP_SELF' , '' );
$file = $this -> server -> get ( 'SCRIPT_FILENAME' , '' );
$segs = explode ( '/' , trim ( $file , '/' ));
$segs = array_reverse ( $segs );
$index = 0 ;
$last = count ( $segs );
$baseUrl = '' ;
do {
$seg = $segs [ $index ];
$baseUrl = '/' . $seg . $baseUrl ;
++ $index ;
} while (( $last > $index ) && ( false !== ( $pos = strpos ( $path , $baseUrl ))) && ( 0 != $pos ));
}
// Does the baseUrl have anything in common with the request_uri?
$requestUri = $this -> getRequestUri ();
2013-01-06 13:58:32 -06:00
if ( $baseUrl && false !== $prefix = $this -> getUrlencodedPrefix ( $requestUri , $baseUrl )) {
2012-04-04 11:22:15 -05:00
// full $baseUrl matches
2013-01-06 13:58:32 -06:00
return $prefix ;
2012-04-04 11:22:15 -05:00
}
2013-01-06 13:58:32 -06:00
if ( $baseUrl && false !== $prefix = $this -> getUrlencodedPrefix ( $requestUri , dirname ( $baseUrl ))) {
2012-04-04 11:22:15 -05:00
// directory portion of $baseUrl matches
2013-01-06 13:58:32 -06:00
return rtrim ( $prefix , '/' );
2012-04-04 11:22:15 -05:00
}
$truncatedRequestUri = $requestUri ;
if (( $pos = strpos ( $requestUri , '?' )) !== false ) {
$truncatedRequestUri = substr ( $requestUri , 0 , $pos );
}
$basename = basename ( $baseUrl );
2013-01-06 13:58:32 -06:00
if ( empty ( $basename ) || ! strpos ( rawurldecode ( $truncatedRequestUri ), $basename )) {
2012-04-04 11:22:15 -05:00
// no match whatsoever; set it blank
return '' ;
}
// If using mod_rewrite or ISAPI_Rewrite strip the script filename
// out of baseUrl. $pos !== 0 makes sure it is not matching a value
// from PATH_INFO or QUERY_STRING
if (( strlen ( $requestUri ) >= strlen ( $baseUrl )) && (( false !== ( $pos = strpos ( $requestUri , $baseUrl ))) && ( $pos !== 0 ))) {
$baseUrl = substr ( $requestUri , 0 , $pos + strlen ( $baseUrl ));
}
return rtrim ( $baseUrl , '/' );
}
/**
* Prepares the base path .
*
* @ return string base path
*/
protected function prepareBasePath ()
{
$filename = basename ( $this -> server -> get ( 'SCRIPT_FILENAME' ));
$baseUrl = $this -> getBaseUrl ();
if ( empty ( $baseUrl )) {
return '' ;
}
if ( basename ( $baseUrl ) === $filename ) {
$basePath = dirname ( $baseUrl );
} else {
$basePath = $baseUrl ;
}
if ( '\\' === DIRECTORY_SEPARATOR ) {
$basePath = str_replace ( '\\' , '/' , $basePath );
}
return rtrim ( $basePath , '/' );
}
/**
* Prepares the path info .
*
* @ return string path info
*/
protected function preparePathInfo ()
{
$baseUrl = $this -> getBaseUrl ();
if ( null === ( $requestUri = $this -> getRequestUri ())) {
return '/' ;
}
$pathInfo = '/' ;
// Remove the query string from REQUEST_URI
if ( $pos = strpos ( $requestUri , '?' )) {
$requestUri = substr ( $requestUri , 0 , $pos );
}
2013-01-06 13:58:32 -06:00
if (( null !== $baseUrl ) && ( false === ( $pathInfo = substr ( $requestUri , strlen ( $baseUrl ))))) {
2012-04-04 11:22:15 -05:00
// If substr() returns false then PATH_INFO is set to an empty string
return '/' ;
} elseif ( null === $baseUrl ) {
return $requestUri ;
}
return ( string ) $pathInfo ;
}
/**
* Initializes HTTP request formats .
*/
2013-01-06 13:58:32 -06:00
protected static function initializeFormats ()
2012-04-04 11:22:15 -05:00
{
static :: $formats = array (
'html' => array ( 'text/html' , 'application/xhtml+xml' ),
'txt' => array ( 'text/plain' ),
'js' => array ( 'application/javascript' , 'application/x-javascript' , 'text/javascript' ),
'css' => array ( 'text/css' ),
'json' => array ( 'application/json' , 'application/x-json' ),
'xml' => array ( 'text/xml' , 'application/xml' , 'application/x-xml' ),
'rdf' => array ( 'application/rdf+xml' ),
'atom' => array ( 'application/atom+xml' ),
'rss' => array ( 'application/rss+xml' ),
);
}
/**
* Sets the default PHP locale .
*
* @ param string $locale
*/
private function setPhpDefaultLocale ( $locale )
{
// if either the class Locale doesn't exist, or an exception is thrown when
// setting the default locale, the intl module is not installed, and
// the call can be ignored:
try {
if ( class_exists ( 'Locale' , false )) {
\Locale :: setDefault ( $locale );
}
} catch ( \Exception $e ) {
}
}
2013-01-06 13:58:32 -06:00
/*
* Returns the prefix as encoded in the string when the string starts with
* the given prefix , false otherwise .
*
* @ param string $string The urlencoded string
* @ param string $prefix The prefix not encoded
*
* @ return string | false The prefix as it is encoded in $string , or false
*/
private function getUrlencodedPrefix ( $string , $prefix )
{
if ( 0 !== strpos ( rawurldecode ( $string ), $prefix )) {
return false ;
}
$len = strlen ( $prefix );
if ( preg_match ( " #^(%[[:xdigit:]] { 2}|.) { { $len } }# " , $string , $match )) {
return $match [ 0 ];
}
return false ;
}
2012-04-04 11:22:15 -05:00
}