*
* @package CodeIgniter
* @author ExpressionEngine Dev Team
- * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @copyright Copyright (c) 2008 - 2009, EllisLab, Inc.
* @license http://codeigniter.com/user_guide/license.html
* @link http://codeigniter.com
* @since Version 1.0
* normally as other classes are.
*
* @access public
- */
+ */
function CI_URI()
{
$this->config =& load_class('Config');
log_message('debug', "URI Class Initialized");
}
-
-
+
+
// --------------------------------------------------------------------
-
+
/**
* Get the URI String
*
* @access private
* @return string
- */
+ */
function _fetch_uri_string()
{
if (strtoupper($this->config->item('uri_protocol')) == 'AUTO')
$this->uri_string = key($_GET);
return;
}
-
+
// Is there a PATH_INFO variable?
- // Note: some servers seem to have trouble with getenv() so we'll test it two ways
- $path = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');
+ // Note: some servers seem to have trouble with getenv() so we'll test it two ways
+ $path = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');
if (trim($path, '/') != '' && $path != "/".SELF)
{
$this->uri_string = $path;
return;
}
-
+
// No PATH_INFO?... What about QUERY_STRING?
- $path = (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING');
+ $path = (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING');
if (trim($path, '/') != '')
{
$this->uri_string = $path;
return;
}
-
+
// No QUERY_STRING?... Maybe the ORIG_PATH_INFO variable exists?
- $path = (isset($_SERVER['ORIG_PATH_INFO'])) ? $_SERVER['ORIG_PATH_INFO'] : @getenv('ORIG_PATH_INFO');
+ $path = str_replace($_SERVER['SCRIPT_NAME'], '', (isset($_SERVER['ORIG_PATH_INFO'])) ? $_SERVER['ORIG_PATH_INFO'] : @getenv('ORIG_PATH_INFO'));
if (trim($path, '/') != '' && $path != "/".SELF)
{
// remove path and script information so we have good URI data
- $this->uri_string = str_replace($_SERVER['SCRIPT_NAME'], '', $path);
+ $this->uri_string = $path;
return;
}
else
{
$uri = strtoupper($this->config->item('uri_protocol'));
-
+
if ($uri == 'REQUEST_URI')
{
$this->uri_string = $this->_parse_request_uri();
return;
}
-
+
$this->uri_string = (isset($_SERVER[$uri])) ? $_SERVER[$uri] : @getenv($uri);
}
-
+
// If the URI contains only a slash we'll kill it
if ($this->uri_string == '/')
{
$this->uri_string = '';
- }
+ }
}
// --------------------------------------------------------------------
-
+
/**
* Parse the REQUEST_URI
*
*
* @access private
* @return string
- */
+ */
function _parse_request_uri()
{
if ( ! isset($_SERVER['REQUEST_URI']) OR $_SERVER['REQUEST_URI'] == '')
{
return '';
}
-
+
$request_uri = preg_replace("|/(.*)|", "\\1", str_replace("\\", "/", $_SERVER['REQUEST_URI']));
if ($request_uri == '' OR $request_uri == SELF)
{
return '';
}
-
- $fc_path = FCPATH;
+
+ $fc_path = FCPATH.SELF;
if (strpos($request_uri, '?') !== FALSE)
{
$fc_path .= '?';
}
-
+
$parsed_uri = explode("/", $request_uri);
-
+
$i = 0;
foreach(explode("/", $fc_path) as $segment)
{
$i++;
}
}
-
+
$parsed_uri = implode("/", array_slice($parsed_uri, $i));
-
+
if ($parsed_uri != '')
{
$parsed_uri = '/'.$parsed_uri;
}
// --------------------------------------------------------------------
-
+
/**
* Filter segments for malicious characters
*
* @access private
* @param string
* @return string
- */
+ */
function _filter_uri($str)
{
if ($str != '' && $this->config->item('permitted_uri_chars') != '' && $this->config->item('enable_query_strings') == FALSE)
{
- if ( ! preg_match("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", $str))
+ // preg_quote() in PHP 5.3 escapes -, so the str_replace() and addition of - to preg_quote() is to maintain backwards
+ // compatibility as many are unaware of how characters in the permitted_uri_chars will be parsed as a regex pattern
+ if ( ! preg_match("|^[".str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-'))."]+$|i", $str))
{
- exit('The URI you submitted has disallowed characters.');
+ show_error('The URI you submitted has disallowed characters.', 400);
}
- }
-
+ }
+
// Convert programatic characters to entities
$bad = array('$', '(', ')', '%28', '%29');
$good = array('$', '(', ')', '(', ')');
-
+
return str_replace($bad, $good, $str);
}
// --------------------------------------------------------------------
-
+
/**
* Remove the suffix from the URL if needed
*
* @access private
* @return void
- */
+ */
function _remove_url_suffix()
{
if ($this->config->item('url_suffix') != "")
$this->uri_string = preg_replace("|".preg_quote($this->config->item('url_suffix'))."$|", "", $this->uri_string);
}
}
-
+
// --------------------------------------------------------------------
-
+
/**
* Explode the URI Segments. The individual segments will
- * be stored in the $this->segments array.
+ * be stored in the $this->segments array.
*
* @access private
* @return void
- */
+ */
function _explode_segments()
{
foreach(explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $val)
{
// Filter segments for security
$val = trim($this->_filter_uri($val));
-
+
if ($val != '')
{
$this->segments[] = $val;
}
}
}
-
- // --------------------------------------------------------------------
+
+ // --------------------------------------------------------------------
/**
* Re-index Segments
*
*
* @access private
* @return void
- */
+ */
function _reindex_segments()
{
array_unshift($this->segments, NULL);
array_unshift($this->rsegments, NULL);
unset($this->segments[0]);
unset($this->rsegments[0]);
- }
-
+ }
+
// --------------------------------------------------------------------
-
+
/**
* Fetch a URI Segment
*
}
// --------------------------------------------------------------------
-
+
/**
* Fetch a URI "routed" Segment
*
}
// --------------------------------------------------------------------
-
+
/**
* Generate a key value pair from the URI string
*
}
// --------------------------------------------------------------------
-
+
/**
* Generate a key value pair from the URI string or Re-routed URI string
*
$total_segments = 'total_rsegments';
$segment_array = 'rsegment_array';
}
-
+
if ( ! is_numeric($n))
{
return $default;
}
-
+
if (isset($this->keyval[$n]))
{
return $this->keyval[$n];
}
-
+
if ($this->$total_segments() < $n)
{
if (count($default) == 0)
{
return array();
}
-
+
$retval = array();
foreach ($default as $val)
{
$retval[$val] = FALSE;
- }
+ }
return $retval;
}
$retval[$seg] = FALSE;
$lastval = $seg;
}
-
+
$i++;
}
* @access public
* @param array an associative array of key/values
* @return array
- */
+ */
function assoc_to_uri($array)
- {
+ {
$temp = array();
foreach ((array)$array as $key => $val)
{
$temp[] = $key;
$temp[] = $val;
}
-
+
return implode('/', $temp);
}
// --------------------------------------------------------------------
-
+
/**
* Fetch a URI Segment and add a trailing slash
*
}
// --------------------------------------------------------------------
-
+
/**
* Fetch a URI Segment and add a trailing slash
*
{
return $this->_slash_segment($n, $where, 'rsegment');
}
-
+
// --------------------------------------------------------------------
-
+
/**
* Fetch a URI Segment and add a trailing slash - helper function
*
* @return string
*/
function _slash_segment($n, $where = 'trailing', $which = 'segment')
- {
+ {
if ($where == 'trailing')
{
$trailing = '/';
}
return $leading.$this->$which($n).$trailing;
}
-
+
// --------------------------------------------------------------------
-
+
/**
* Segment Array
*
}
// --------------------------------------------------------------------
-
+
/**
* Routed Segment Array
*
{
return $this->rsegments;
}
-
+
// --------------------------------------------------------------------
-
+
/**
* Total number of segments
*
}
// --------------------------------------------------------------------
-
+
/**
* Total number of routed segments
*
{
return count($this->rsegments);
}
-
+
// --------------------------------------------------------------------
-
+
/**
* Fetch the entire URI string
*
return $this->uri_string;
}
-
+
// --------------------------------------------------------------------
-
+
/**
* Fetch the entire Re-routed URI string
*