valid()) { $path = $uri->getPath(); $query = $uri->getQuery(); if (!empty($query)) { $path .= '?' . $query; } $this->setRequestUri($path); } else { require_once 'Zend/Controller/Request/Exception.php'; throw new Zend_Controller_Request_Exception('Invalid URI provided to constructor'); } } else { $this->setRequestUri(); } } /** * Access values contained in the superglobals as public members * Order of precedence: 1. GET, 2. POST, 3. COOKIE, 4. SERVER, 5. ENV * * @see http://msdn.microsoft.com/en-us/library/system.web.httprequest.item.aspx * @param string $key * @return mixed */ public function __get($key) { switch (true) { case isset($this->_params[$key]): return $this->_params[$key]; case isset($_GET[$key]): return $_GET[$key]; case isset($_POST[$key]): return $_POST[$key]; case isset($_COOKIE[$key]): return $_COOKIE[$key]; case ($key == 'REQUEST_URI'): return $this->getRequestUri(); case ($key == 'PATH_INFO'): return $this->getPathInfo(); case isset($_SERVER[$key]): return $_SERVER[$key]; case isset($_ENV[$key]): return $_ENV[$key]; default: return null; } } /** * Alias to __get * * @param string $key * @return mixed */ public function get($key) { return $this->__get($key); } /** * Set values * * In order to follow {@link __get()}, which operates on a number of * superglobals, setting values through overloading is not allowed and will * raise an exception. Use setParam() instead. * * @param string $key * @param mixed $value * @return void * @throws Zend_Controller_Request_Exception */ public function __set($key, $value) { require_once 'Zend/Controller/Request/Exception.php'; throw new Zend_Controller_Request_Exception('Setting values in superglobals not allowed; please use setParam()'); } /** * Alias to __set() * * @param string $key * @param mixed $value * @return void */ public function set($key, $value) { return $this->__set($key, $value); } /** * Check to see if a property is set * * @param string $key * @return boolean */ public function __isset($key) { switch (true) { case isset($this->_params[$key]): return true; case isset($_GET[$key]): return true; case isset($_POST[$key]): return true; case isset($_COOKIE[$key]): return true; case isset($_SERVER[$key]): return true; case isset($_ENV[$key]): return true; default: return false; } } /** * Alias to __isset() * * @param string $key * @return boolean */ public function has($key) { return $this->__isset($key); } /** * Set GET values * * @param string|array $spec * @param null|mixed $value * @return Zend_Controller_Request_Http */ public function setQuery($spec, $value = null) { if ((null === $value) && !is_array($spec)) { require_once 'Zend/Controller/Exception.php'; throw new Zend_Controller_Exception('Invalid value passed to setQuery(); must be either array of values or key/value pair'); } if ((null === $value) && is_array($spec)) { foreach ($spec as $key => $value) { $this->setQuery($key, $value); } return $this; } $_GET[(string) $spec] = $value; return $this; } /** * Retrieve a member of the $_GET superglobal * * If no $key is passed, returns the entire $_GET array. * * @todo How to retrieve from nested arrays * @param string $key * @param mixed $default Default value to use if key not found * @return mixed Returns null if key does not exist */ public function getQuery($key = null, $default = null) { if (null === $key) { return $_GET; } return (isset($_GET[$key])) ? $_GET[$key] : $default; } /** * Set POST values * * @param string|array $spec * @param null|mixed $value * @return Zend_Controller_Request_Http */ public function setPost($spec, $value = null) { if ((null === $value) && !is_array($spec)) { require_once 'Zend/Controller/Exception.php'; throw new Zend_Controller_Exception('Invalid value passed to setPost(); must be either array of values or key/value pair'); } if ((null === $value) && is_array($spec)) { foreach ($spec as $key => $value) { $this->setPost($key, $value); } return $this; } $_POST[(string) $spec] = $value; return $this; } /** * Retrieve a member of the $_POST superglobal * * If no $key is passed, returns the entire $_POST array. * * @todo How to retrieve from nested arrays * @param string $key * @param mixed $default Default value to use if key not found * @return mixed Returns null if key does not exist */ public function getPost($key = null, $default = null) { if (null === $key) { return $_POST; } return (isset($_POST[$key])) ? $_POST[$key] : $default; } /** * Retrieve a member of the $_COOKIE superglobal * * If no $key is passed, returns the entire $_COOKIE array. * * @todo How to retrieve from nested arrays * @param string $key * @param mixed $default Default value to use if key not found * @return mixed Returns null if key does not exist */ public function getCookie($key = null, $default = null) { if (null === $key) { return $_COOKIE; } return (isset($_COOKIE[$key])) ? $_COOKIE[$key] : $default; } /** * Retrieve a member of the $_SERVER superglobal * * If no $key is passed, returns the entire $_SERVER array. * * @param string $key * @param mixed $default Default value to use if key not found * @return mixed Returns null if key does not exist */ public function getServer($key = null, $default = null) { if (null === $key) { return $_SERVER; } return (isset($_SERVER[$key])) ? $_SERVER[$key] : $default; } /** * Retrieve a member of the $_ENV superglobal * * If no $key is passed, returns the entire $_ENV array. * * @param string $key * @param mixed $default Default value to use if key not found * @return mixed Returns null if key does not exist */ public function getEnv($key = null, $default = null) { if (null === $key) { return $_ENV; } return (isset($_ENV[$key])) ? $_ENV[$key] : $default; } /** * Set the REQUEST_URI on which the instance operates * * If no request URI is passed, uses the value in $_SERVER['REQUEST_URI'], * $_SERVER['HTTP_X_REWRITE_URL'], or $_SERVER['ORIG_PATH_INFO'] + $_SERVER['QUERY_STRING']. * * @param string $requestUri * @return Zend_Controller_Request_Http */ public function setRequestUri($requestUri = null) { if ($requestUri === null) { if (isset($_SERVER['HTTP_X_REWRITE_URL'])) { // check this first so IIS will catch $requestUri = $_SERVER['HTTP_X_REWRITE_URL']; } elseif ( // IIS7 with URL Rewrite: make sure we get the unencoded url (double slash problem) isset($_SERVER['IIS_WasUrlRewritten']) && $_SERVER['IIS_WasUrlRewritten'] == '1' && isset($_SERVER['UNENCODED_URL']) && $_SERVER['UNENCODED_URL'] != '' ) { $requestUri = $_SERVER['UNENCODED_URL']; } elseif (isset($_SERVER['REQUEST_URI'])) { $requestUri = $_SERVER['REQUEST_URI']; // Http proxy reqs setup request uri with scheme and host [and port] + the url path, only use url path $schemeAndHttpHost = $this->getScheme() . '://' . $this->getHttpHost(); if (strpos($requestUri, $schemeAndHttpHost) === 0) { $requestUri = substr($requestUri, strlen($schemeAndHttpHost)); } } elseif (isset($_SERVER['ORIG_PATH_INFO'])) { // IIS 5.0, PHP as CGI $requestUri = $_SERVER['ORIG_PATH_INFO']; if (!empty($_SERVER['QUERY_STRING'])) { $requestUri .= '?' . $_SERVER['QUERY_STRING']; } } else { return $this; } } elseif (!is_string($requestUri)) { return $this; } else { // Set GET items, if available if (false !== ($pos = strpos($requestUri, '?'))) { // Get key => value pairs and set $_GET $query = substr($requestUri, $pos + 1); parse_str($query, $vars); $this->setQuery($vars); } } $this->_requestUri = $requestUri; return $this; } /** * Returns the REQUEST_URI taking into account * platform differences between Apache and IIS * * @return string */ public function getRequestUri() { if (empty($this->_requestUri)) { $this->setRequestUri(); } return $this->_requestUri; } /** * Set the base URL of the request; i.e., the segment leading to the script name * * E.g.: * - /admin * - /myapp * - /subdir/index.php * * Do not use the full URI when providing the base. The following are * examples of what not to use: * - http://example.com/admin (should be just /admin) * - http://example.com/subdir/index.php (should be just /subdir/index.php) * * If no $baseUrl is provided, attempts to determine the base URL from the * environment, using SCRIPT_FILENAME, SCRIPT_NAME, PHP_SELF, and * ORIG_SCRIPT_NAME in its determination. * * @param mixed $baseUrl * @return Zend_Controller_Request_Http */ public function setBaseUrl($baseUrl = null) { if ((null !== $baseUrl) && !is_string($baseUrl)) { return $this; } if ($baseUrl === null) { $filename = (isset($_SERVER['SCRIPT_FILENAME'])) ? basename($_SERVER['SCRIPT_FILENAME']) : ''; if (isset($_SERVER['SCRIPT_NAME']) && basename($_SERVER['SCRIPT_NAME']) === $filename) { $baseUrl = $_SERVER['SCRIPT_NAME']; } elseif (isset($_SERVER['PHP_SELF']) && basename($_SERVER['PHP_SELF']) === $filename) { $baseUrl = $_SERVER['PHP_SELF']; } elseif (isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME']) === $filename) { $baseUrl = $_SERVER['ORIG_SCRIPT_NAME']; // 1and1 shared hosting compatibility } else { // Backtrack up the script_filename to find the portion matching // php_self $path = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : ''; $file = isset($_SERVER['SCRIPT_FILENAME']) ? $_SERVER['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(); if (0 === strpos($requestUri, $baseUrl)) { // full $baseUrl matches $this->_baseUrl = $baseUrl; return $this; } if (0 === strpos($requestUri, dirname($baseUrl))) { // directory portion of $baseUrl matches $this->_baseUrl = rtrim(dirname($baseUrl), '/'); return $this; } $truncatedRequestUri = $requestUri; if (($pos = strpos($requestUri, '?')) !== false) { $truncatedRequestUri = substr($requestUri, 0, $pos); } $basename = basename($baseUrl); if (empty($basename) || !strpos($truncatedRequestUri, $basename)) { // no match whatsoever; set it blank $this->_baseUrl = ''; return $this; } // 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)); } } $this->_baseUrl = rtrim($baseUrl, '/'); return $this; } /** * Everything in REQUEST_URI before PATH_INFO *
* * @return string */ public function getBaseUrl() { if (null === $this->_baseUrl) { $this->setBaseUrl(); } return urldecode($this->_baseUrl); } /** * Set the base path for the URL * * @param string|null $basePath * @return Zend_Controller_Request_Http */ public function setBasePath($basePath = null) { if ($basePath === null) { $filename = (isset($_SERVER['SCRIPT_FILENAME'])) ? basename($_SERVER['SCRIPT_FILENAME']) : ''; $baseUrl = $this->getBaseUrl(); if (empty($baseUrl)) { $this->_basePath = ''; return $this; } if (basename($baseUrl) === $filename) { $basePath = dirname($baseUrl); } else { $basePath = $baseUrl; } } if (substr(PHP_OS, 0, 3) === 'WIN') { $basePath = str_replace('\\', '/', $basePath); } $this->_basePath = rtrim($basePath, '/'); return $this; } /** * Everything in REQUEST_URI before PATH_INFO not including the filename *