Public paste
CORE
By: fruffl | Date: Jan 11 2010 00:42 | Format: PHP | Expires: never | Size: 17.6 KB | Hits: 1142

  1. <?PHP
  2.  
  3.         FINAL CLASS FRUFFL_ExceptionCore EXTENDS FRUFFL_Exception{}
  4.        
  5.         FINAL CLASS FRUFFL_Core extends FRUFFL_InstancieOpziener
  6.         {      
  7.                
  8.                 public static function init(FRUFFL_BootConstructeur $FRUFFL_BootConstructeur)
  9.                 {
  10.                         return self::instance(__CLASS__);
  11.                 }
  12.                        
  13.                 public function run(FRUFFL_BootConstructeur $FRUFFL_BootConstructeur)
  14.                 {
  15.                         try
  16.                         {
  17.                                 if(!FRUFFL::registryExists('FRUFFL_EXECUTED_FRUFFL_Store'))
  18.                                         throw new FRUFFL_ExceptionDispatcher
  19.                                                 ('Unable to init Dispatcher. FRUFFL_Store not executed.');
  20.                                                
  21.                                 if(!FRUFFL::registryExists('FRUFFL_EXECUTED_FRUFFL_Instellingen'))
  22.                                         throw new FRUFFL_ExceptionDispatcher
  23.                                                 ('Unable to init Dispatcher. FRUFFL_Instellingen not executed.');
  24.                         }
  25.                         catch(FRUFFL_Exception $e){FRUFFL_Exception::w($e);}
  26.                        
  27.                         $this->activate(__CLASS__);
  28.                         $this->execute();
  29.                         return $this;
  30.                 }
  31.                        
  32.                 protected function execute()
  33.                 {
  34.                         try
  35.                         {
  36.                                 if
  37.                                 (
  38.                                         !$this->phpTest
  39.                                         (
  40.                                                 FRUFFL::registryGet('FRUFFL_PHP_MIN_VERSION'),
  41.                                                 FRUFFL::registryGet('FRUFFL_PHP_MAX_VERSION')
  42.                                         )
  43.                                 )
  44.                                         throw new FRUFFL_ExceptionCore
  45.                                                 ('Invalid PHP-Version.');
  46.                        
  47.                                 if(!$this->requestTest())
  48.                                         throw new FRUFFL_ExceptionCore
  49.                                                 ('haxx != rulez.');
  50.                                        
  51.                                 FRUFFL::registryAdd
  52.                                 (
  53.                                         'FRUFFL_ENVIRONMENT_REMOTE_IP',
  54.                                         $_SERVER['REMOTE_ADDR']
  55.                                 );
  56.                                
  57.                                 FRUFFL::registryAdd
  58.                                 (
  59.                                         'FRUFFL_ENVIRONMENT',
  60.                                         (
  61.                                                 FRUFFL::registryGet('FRUFFL_ENVIRONMENT_DEVELOPMENT_IP') == $_SERVER['REMOTE_ADDR']
  62.                                                         ? 'DEVELOPMENT'
  63.                                                         : 'PRODUCTION'
  64.                                         )
  65.                                 );
  66.                                
  67.                                 FRUFFL::registryAdd
  68.                                 (
  69.                                         'FRUFFL_ROUTING_TABLE',
  70.                                         array()
  71.                                 );
  72.                                
  73.                                
  74.                                 FRUFFL::registryAdd
  75.                                 (
  76.                                         'FRUFFL_ENVIRONMENT_URI',
  77.                                         $this->getUri()
  78.                                 );
  79.                                                        
  80.                                 FRUFFL::registryAdd
  81.                                 (
  82.                                         'FRUFFL_ENVIRONMENT_URIBASE',
  83.                                         $this->getBase
  84.                                         (
  85.                                                 FRUFFL::registryGet('FRUFFL_ENVIRONMENT_URI'),
  86.                                                 FRUFFL::registryGet('FRUFFL_ENVIRONMENT_REWRITE_BASE_'.FRUFFL::registryGet('FRUFFL_ENVIRONMENT'))
  87.                                         )
  88.                                 );
  89.                                
  90.                                 FRUFFL::registryAdd
  91.                                 (
  92.                                         'FRUFFL_ENVIRONMENT_URIPATH',
  93.                                         $this->getPath
  94.                                         (
  95.                                                 FRUFFL::registryGet('FRUFFL_ENVIRONMENT_URI'),
  96.                                                 FRUFFL::registryGet('FRUFFL_ENVIRONMENT_URIBASE')
  97.                                         )
  98.                                 );
  99.                                
  100.                                 FRUFFL::registryAdd
  101.                                 (
  102.                                         'FRUFFL_COOKIE_GLOBAL_PREFIX',
  103.                                         'FRUFFL_COOKIE_'
  104.                                                 .'_'
  105.                                                 .sha1
  106.                                                 (
  107.                                                         $_SERVER['SERVER_NAME']
  108.                                                                 .$_SERVER['SERVER_PORT']
  109.                                                                 .FRUFFL::registryGet('FRUFFL_ENVIRONMENT_URIBASE')
  110.                                                 )
  111.                                                 .'_'
  112.                                 );
  113.                                
  114.                                 FRUFFL::registryAdd
  115.                                 (
  116.                                         'FRUFFL_COOKIE_LOCAL_PREFIX',  
  117.                                         'FRUFFL_COOKIE_'
  118.                                                 .'_'
  119.                                                 .sha1
  120.                                                 (
  121.                                                         $_SERVER['SERVER_NAME']
  122.                                                                 .$_SERVER['SERVER_PORT']
  123.                                                                 .FRUFFL::registryGet('FRUFFL_ENVIRONMENT_URIBASE')
  124.                                                                 .FRUFFL::registryGet('FRUFFL_ENVIRONMENT_URIPATH')
  125.                                                 )
  126.                                                 .'_'
  127.                                 );
  128.                                
  129.                                 FRUFFL::registryAdd
  130.                                 (
  131.                                         'FRUFFL_SESSION_NAME',
  132.                                         'FRUFFL_SESSION_'
  133.                                                 .'_'
  134.                                                 .sha1
  135.                                                 (
  136.                                                         $_SERVER['SERVER_NAME']
  137.                                                                 .$_SERVER['SERVER_PORT']
  138.                                                                 .FRUFFL::registryGet('FRUFFL_ENVIRONMENT_URIBASE')
  139.                                                 )
  140.                                                 .'_'
  141.                                 );
  142.                                
  143.                                 FRUFFL::registryAdd
  144.                                 (
  145.                                         'FRUFFL_REQUEST_EXTRACTED_GET',
  146.                                         $this->cleanup_incoming
  147.                                         (
  148.                                                 $this->parse_incoming($_GET),
  149.                                                 FRUFFL::registryGet('FRUFFL_REQUEST_CLEANVARS_GET'),
  150.                                                 FRUFFL::registryGet('FRUFFL_REQUEST_CLEANVARS_GET_IGNORE'),
  151.                                                 FRUFFL::registryGet('FRUFFL_REQUEST_CLEANVARS_GET_UNSET_UNREGISTERED')
  152.                                         )
  153.                                 );                                     
  154.                                
  155.                                 FRUFFL::registryAdd
  156.                                 (
  157.                                         'FRUFFL_REQUEST_EXTRACTED_POST',
  158.                                         $this->cleanup_incoming
  159.                                         (
  160.                                                 $this->parse_incoming($_POST),
  161.                                                 FRUFFL::registryGet('FRUFFL_REQUEST_CLEANVARS_POST'),
  162.                                                 FRUFFL::registryGet('FRUFFL_REQUEST_CLEANVARS_POST_IGNORE'),
  163.                                                 FRUFFL::registryGet('FRUFFL_REQUEST_CLEANVARS_POST_UNSET_UNREGISTERED')
  164.                                         )
  165.                                 );
  166.                                
  167.                                 $tmp_cookie = $this->parse_incoming($_COOKIE);
  168.                                 FRUFFL::registryAdd
  169.                                 (
  170.                                         'FRUFFL_REQUEST_EXTRACTED_COOKIE_GLOBAL',
  171.                                         $this->parse_incoming_cookie($tmp_cookie, FRUFFL::registryGet('FRUFFL_COOKIE_GLOBAL_PREFIX'))
  172.                                 );
  173.                                 FRUFFL::registryAdd
  174.                                 (
  175.                                         'FRUFFL_REQUEST_EXTRACTED_COOKIE_LOCAL',
  176.                                         $this->parse_incoming_cookie($tmp_cookie, FRUFFL::registryGet('FRUFFL_COOKIE_LOCAL_PREFIX'))
  177.                                 );
  178.                                 unset($tmp_cookie);
  179.                                
  180.                                
  181.                                 set_magic_quotes_runtime(0);
  182.                                 $this->ini
  183.                                 (
  184.                                         array_merge
  185.                                         (
  186.                                                 FRUFFL::registryGet('FRUFFL_PHP_INI'),
  187.                                                 array(
  188.                                                         // auto-overwrites
  189.                                                         'session.name' => FRUFFL::registryGet('FRUFFL_SESSION_NAME'),
  190.                                                         'session.cookie_path' => FRUFFL::registryGet('FRUFFL_ENVIRONMENT_URIBASE'),
  191.                                                         'magic_quotes_gpc' => 0,
  192.                                                         'magic_quotes_runtime' => 0,
  193.                                                         'magic_quotes_sybase' => 0,
  194.                                                         'register_globals' => 'off'
  195.                                                 )
  196.                                         )
  197.                                 );
  198.                                
  199.                                 session_start();
  200.                                
  201.                                 if(isset($_COOKIE[FRUFFL::registryGet('FRUFFL_SESSION_NAME')]))
  202.                                 {
  203.                                         FRUFFL::registryAdd
  204.                                         (
  205.                                                 'FRUFFL_SESSION_ID',
  206.                                                 $_COOKIE[FRUFFL::registryGet('FRUFFL_SESSION_NAME')]
  207.                                         );
  208.                                         FRUFFL::registryAdd
  209.                                         (
  210.                                                 'FRUFFL_SESSION_COOKIE',
  211.                                                 true
  212.                                         );
  213.                                 }
  214.                                 else
  215.                                 {                              
  216.                                         FRUFFL::registryAdd
  217.                                         (
  218.                                                 'FRUFFL_SESSION_ID',
  219.                                                 NULL
  220.                                         );
  221.                                         FRUFFL::registryAdd
  222.                                         (
  223.                                                 'FRUFFL_SESSION_COOKIE',
  224.                                                 false
  225.                                         );
  226.                                 }
  227.                                
  228.                                 // forward to valid uri
  229.                                 if
  230.                                 (
  231.                                         $valide_uri = $this->get_cleanup
  232.                                         (
  233.                                                 FRUFFL::registryGet('FRUFFL_ENVIRONMENT_URIPATH'),
  234.                                                 FRUFFL::registryGet('FRUFFL_ENVIRONMENT_URI'),
  235.                                                 FRUFFL::registryGet('FRUFFL_ENVIRONMENT_URIBASE'),
  236.                                                 FRUFFL::registryGet('FRUFFL_REQUEST_EXTRACTED_GET')
  237.                                         )
  238.                                 )
  239.                                 {
  240.                                         FRUFFL::registryAdd
  241.                                         (
  242.                                                 'FRUFFL_HEADER_FORWARDTO',
  243.                                                 $valide_uri
  244.                                         );
  245.                                 }
  246.                                 else
  247.                                 {
  248.                                         // dump post-vars from session
  249.                                 }
  250.                         }
  251.                         catch(FRUFFL_Exception $e){FRUFFL_Exception::w($e);}
  252.                        
  253.                 }
  254.                
  255.                 private function get_cleanup($env_path, $env_uri, $env_base, array $clean_query)
  256.                 {
  257.  
  258.                         // repair broken uri-parts
  259.                         // mod_rewrite: last arg can't be a php-file
  260.                         // !mod_rewrite: last arg can't be a php-file; first arg must be index.php
  261.                         // create query-string from cleaned get-vars
  262.                        
  263.                        
  264.                         // kill query-string to compare it with path
  265.                         $uri = $env_uri;
  266.                         if(false !== ($i = strpos($uri, '?')))
  267.                                 $uri = substr($env_uri, 0, ($i));                      
  268.                         $uri = rtrim($uri, '/');                       
  269.                         $valide_uri = $uri;
  270.                        
  271.                        
  272.                         $qry = '';     
  273.                         if(!empty($clean_query))
  274.                         {                              
  275.                                 foreach($clean_query as $k => $v)
  276.                                 {
  277.                                         if(is_array($v))
  278.                                         {
  279.                                                 $str .= empty($str) ? '' : '&';
  280.                                                 $str .= $k.'='.implode('|', $clean_query[$k]);
  281.                                         }
  282.                                        
  283.                                         if(is_scalar($v) && $v !== NULL)
  284.                                         {
  285.                                                 $str .= empty($str) ? '' : '&';
  286.                                                 $str .= $k.'='.$v;
  287.                                         }
  288.                                        
  289.                                         if($v === NULL)
  290.                                         {
  291.                                                 $str .= empty($str) ? '' : '&';
  292.                                                 $str .= $k;
  293.                                         }
  294.                                 }                      
  295.                                        
  296.                                 $qry = '?'.$qry.$str;
  297.                         }
  298.                        
  299.                        
  300.                         // base ends never with '.php' if mod_rewrite is enabled: kill *.php
  301.                         if(substr(strtolower(pathinfo($env_base, PATHINFO_EXTENSION)), -3) != 'php')
  302.                         {
  303.                                        
  304.                                 if(substr(strtolower(pathinfo($uri, PATHINFO_EXTENSION)), -3) == 'php')
  305.                                         $valide_uri = str_replace('/'.substr($uri, (strlen(strtolower(pathinfo($uri, PATHINFO_FILENAME)).'.php') * -1)), NULL, $uri);
  306.                         }
  307.                         // mod_rewrite is disabled: kill all *.php-named args (ignore the location '{install_dir}/index.php')
  308.                         else
  309.                         {
  310.  
  311.                                 // if current loacation is "{install_dir}/" forward to {install_dir}/index.php[/?qry]
  312.                                 if($env_path == $uri)
  313.                                         $valide_uri =  $env_base;
  314.                                
  315.                                 // if path = '/' your current location is {install_dir}/index.php
  316.                                 if($env_path != '/')
  317.                                         // the last part in path can't be an php-file-name
  318.                                         if(substr(strtolower(pathinfo($uri, PATHINFO_EXTENSION)), -3) == 'php')
  319.                                         {
  320.                                                 // the base ({install_dir}/index.php)
  321.                                                 // + path without the last part
  322.                                                 //
  323.                                                 // {install_dir}/index.php/test.php, {install_dir}/index.php/site/test.php...
  324.                                                 // kill test.php and forward to the next parent
  325.                                                 if($uri != $env_base)
  326.                                                         $valide_uri = str_replace('/'.substr($uri, (strlen(strtolower(pathinfo($uri, PATHINFO_FILENAME)).'.php') * -1)), NULL, $uri);
  327.                                         }
  328.                         }
  329.                        
  330.                         if(preg_match('#(.*)?.php#', $env_uri))
  331.                         {
  332.                         }
  333.                        
  334.                        
  335.                         $valide_uri = $valide_uri.'/'.$qry;
  336.                         if($_SERVER['REQUEST_URI'] != $valide_uri)
  337.                                 return $valide_uri;
  338.                        
  339.                         return false;                  
  340.                 }
  341.                
  342.                 private function phpTest($min = '5', $max = '6')
  343.                 {
  344.                         if(version_compare(PHP_VERSION, $min, '>=') && version_compare(PHP_VERSION, $max, "<"))
  345.                                 return true;
  346.                         return false;
  347.                 }
  348.                
  349.                 public function requestTest()
  350.                 {
  351.                         foreach(array("_COOKIE", "_ENV", "_FILES", "_GET", "GLOBALS", "_POST", "_SERVER") as $var)
  352.                                 if(isset($_REQUEST[$var]) || isset($_FILES[$var]))
  353.                                         return false;
  354.                         return true;
  355.                 }
  356.                
  357.                 private function ini(array $array)
  358.                 {
  359.                         foreach($array as $k => $v)
  360.                         {
  361.                                 if(is_array($v))
  362.                                         implode('.', $v);
  363.                                        
  364.                                 if(is_scalar($v))
  365.                                         ini_set($k, $v);
  366.                         }
  367.                 }
  368.                
  369.                 private function parse_incoming(array $array)
  370.                 {
  371.                
  372.                         $input = array();
  373.                                                
  374.                         foreach($array as $k => $v)
  375.                         {
  376.                                 if(get_magic_quotes_gpc())
  377.                                         $input[$k] = stripslashes($array[$k]);
  378.                                
  379.                                 global $$k;
  380.                                 unset($$k);                            
  381.                                 unset($GLOBALS[$k]);
  382.                                
  383.                                 // Double unset to circumvent the
  384.                                 // zend_hash_del_key_or_index hole in PHP <4.4.3 and <5.1.4 (by Tikitiki)
  385.                                 unset($$k);
  386.                                 unset($GLOBALS[$k]);
  387.                         }
  388.                        
  389.                         return $input;
  390.                 }
  391.                
  392.                 public function parse_incoming_cookie(array $array, $prefix)
  393.                 {
  394.                
  395.                         $l = strlen($prefix);
  396.                        
  397.                         $input = array();
  398.                        
  399.                         foreach($array as $key => $val)
  400.                         {
  401.                                 $p = substr($key, 0, $l);
  402.                                 $k = str_replace($prefix, NULL, $key);
  403.                                 if($p == $prefix)
  404.                                         $input[$k] = $val;
  405.                         }
  406.                        
  407.                         return $input;
  408.                 }
  409.                
  410.                 public function cleanup_incoming(array $vars, array $clean_vars, array $ignore_vars = array(), $unset_on_unregistered = TRUE)
  411.                 {
  412.                
  413.                         $temp = array();
  414.                
  415.                         foreach($clean_vars as $t => $k)
  416.                         {
  417.                                 foreach($k as $v)
  418.                                 {
  419.                                
  420.                                         if(isset($vars[$v]))
  421.                                                 $temp[$v] = $vars[$v];
  422.                                        
  423.                                         if(in_array($v, $ignore_vars))
  424.                                                 continue;
  425.                                                
  426.                                         switch($t)
  427.                                         {
  428.                                                 case 'url':
  429.                                                                 // usefull for redirects: rawencode the given url
  430.                                                                 // and add the http://-prefix
  431.                                                                 if(isset($temp[$v]))
  432.                                                                 {
  433.                                                                         if((substr($temp[$v], 0, 7)  != 'http://') && (substr($temp[$v], 0, 8)  != 'https://'))
  434.                                                                                 $temp[$v] = 'http://'.$temp[$v];
  435.                                                                         $temp[$v] = rawurlencode($temp[$v]);
  436.                                                                 }
  437.                                                         break;
  438.                                                 case 'path':
  439.                                                                 // determine all crapy slashes and dot-slash-mixes from a path-var
  440.                                                                 // and convert it into a clean '/dir/dir/n/'-path
  441.                                                                 if(isset($temp[$v]))
  442.                                                                 {
  443.                                                                         $temp[$v] = str_replace(array(chr(0x5C),chr(0x2F).chr(0x2E).chr(0x2E).chr(0x2F),
  444.                                                                                                 chr(0x2E).chr(0x2E).chr(0x2F),chr(0x2F).chr(0x2E).
  445.                                                                                                 chr(0x2E),chr(0x2F).chr(0x2E),chr(0x2E).chr(0x2F),
  446.                                                                                                 chr(0x2A)), chr(0x2F), $temp[$v]);
  447.                                                                         $temp[$v] = ereg_replace(chr(0x28).chr(0x2F).chr(0x2B).chr(0x29), chr(0x2F), $temp[$v]);
  448.                                                                         $temp[$v] = (substr($temp[$v], 0, 1)  != chr(0x2F)) ? chr(0x2F).$temp[$v] : $temp[$v];
  449.                                                                         $temp[$v] = (substr($temp[$v], -1, 1) == chr(0x2F)) ? substr($temp[$v],0,strlen($temp[$v])-1) : $temp[$v];
  450.                                                                         $temp[$v] = implode(chr(0x2F), array_map("rawurlencode", (explode(chr(0x2F), $temp[$v]))));
  451.                                                                 }
  452.                                                         break;
  453.                                                 case 'numeric':
  454.                                                                 // numeric-test only
  455.                                                                 if(isset($temp[$v]))
  456.                                                                         if(is_numeric($temp[$v]))
  457.                                                                                 $temp[$v] = $temp[$v];
  458.                                                         break;
  459.                                                 case 'integer':
  460.                                                                 // convert all keys in this case into an integer
  461.                                                                 if(isset($temp[$v]))
  462.                                                                         $temp[$v] = intval($temp[$v]);
  463.                                                         break;
  464.                                                 case 'integer_array':
  465.                                                                 // same as 'integer'...
  466.                                                                 // an integer-group is separated by pipe i. e. '89|654|1|5|1|sc|7'
  467.                                                                 // this case sort the values by size and kill doublets;
  468.                                                                 // the result is an array(0,1,5,7,89,654)
  469.                                                                 if(isset($temp[$v]))
  470.                                                                 {
  471.                                                                         $temp[$v] = @array_unique
  472.                                                                         (
  473.                                                                                 @array_map
  474.                                                                                 (
  475.                                                                                         'abs',
  476.                                                                                         @array_map
  477.                                                                                         (
  478.                                                                                                 'intval',
  479.                                                                                                 @explode
  480.                                                                                                 (
  481.                                                                                                         '|',
  482.                                                                                                         $temp[$v]
  483.                                                                                                 )
  484.                                                                                         )
  485.                                                                                 )
  486.                                                                         );
  487.                                                                         @sort($temp[$v]);
  488.                                                                 }
  489.                                                         break;
  490.                                                 case 'float':
  491.                                                                 // convert all keys in this case into an integer
  492.                                                                 if(isset($temp[$v]))
  493.                                                                         $temp[$v] = floatval($temp[$v]);
  494.                                                         break;
  495.                                                 case 'float_array':
  496.                                                                 // same a integer-array for float-vars
  497.                                                                 if(isset($temp[$v]))
  498.                                                                 {
  499.                                                                         $temp[$v] = @array_unique
  500.                                                                         (
  501.                                                                                 @array_map
  502.                                                                                 (
  503.                                                                                         'abs',
  504.                                                                                         @array_map
  505.                                                                                         (
  506.                                                                                                 'floatval',
  507.                                                                                                 @explode
  508.                                                                                                 (
  509.                                                                                                         '|',
  510.                                                                                                         $temp[$v]
  511.                                                                                                 )
  512.                                                                                         )
  513.                                                                                 )
  514.                                                                         );
  515.                                                                         @sort($temp[$v]);
  516.                                                                 }
  517.                                                         break;
  518.                                                 case 'null':
  519.                                                                 // those are keys without values. given values will be  killed
  520.                                                                 if(isset($temp[$v]))
  521.                                                                         $temp[$v] = NULL;
  522.                                                         break;
  523.                                                 case 'bool':
  524.                                                                 // allowes only 0 or 1
  525.                                                                 if(isset($temp[$v]))
  526.                                                                         $temp[$v] = (intval($temp[$v]) !== 1) ? 0 : 1;
  527.                                                         break;
  528.                                                 case 'hex':
  529.                                                                 // set all unallowed chars as 0
  530.                                                                 if(isset($temp[$v]))
  531.                                                                         $temp[$v] = preg_replace('/[^a-fA-F0-9]/', dechex(0), $temp[$v]);
  532.                                                         break;
  533.                                         }
  534.                                 }
  535.                         }
  536.                        
  537.                        
  538.                         if($unset_on_unregistered)
  539.                         {
  540.                                 ksort($temp);
  541.                                 return $temp;
  542.                         }
  543.                                        
  544.                         $vars = array_merge($temp, $vars);
  545.                        
  546.                         ksort($vars);                  
  547.                         return $vars;
  548.  
  549.                 }
  550.                
  551.                 private function getProtocol()
  552.                 {
  553.                         return ((is($https = $_SERVER['HTTPS']) && $https == 'on') ? 'https' : 'http');
  554.                 }
  555.                
  556.                 private function getUri($uri = NULL)
  557.                 {
  558.                                
  559.                         if($uri === NULL)
  560.                         {
  561.                                 if
  562.                                 (
  563.                                         isset($_SERVER['HTTP_X_REWRITE_URL'])
  564.                                 )
  565.                                 {
  566.                                         return rtrim($_SERVER['HTTP_X_REWRITE_URL'], '/');
  567.                                 }
  568.                                 else
  569.                                 if
  570.                                 (
  571.                                         isset($_SERVER['IIS_WasUrlRewritten']) && $_SERVER['IIS_WasUrlRewritten'] == '1'
  572.                                         &&
  573.                                         isset($_SERVER['UNENCODED_URL']) && !empty($_SERVER['UNENCODED_URL'])
  574.                                 )
  575.                                 {
  576.                                         return rtrim($_SERVER['UNENCODED_URL'], '/');
  577.                                 }
  578.                                 else
  579.                                 if
  580.                                 (
  581.                                         isset($_SERVER['REQUEST_URI'])
  582.                                 )
  583.                                 {
  584.                                         $uri = $_SERVER['REQUEST_URI'];
  585.                                        
  586.                                         $url = ($protocol = $this->getProtocol()).'://'.
  587.                                         (
  588.                                                 (
  589.                                                         is($server = $_SERVER['HTTP_HOST'])
  590.                                                         &&
  591.                                                         !empty($server)
  592.                                                 )
  593.                                                 ? $server
  594.                                                 : $protocol.
  595.                                                         (
  596.                                                                 (
  597.                                                                         ($protocol == 'http' && $port = $_SERVER['SERVER_PORT']) == 80
  598.                                                                         ||
  599.                                                                         ($protocol == 'https' && $port = 443)
  600.                                                                 )
  601.                                                                 ? $_SERVER['SERVER_NAME']
  602.                                                                 : $_SERVER['SERVER_NAME'].':'.$_SERVER_['SERVER_PORT']
  603.                                                         )
  604.                                         );
  605.                                        
  606.                                         if (strpos($uri, $url) === 0)
  607.                                             $uri = substr($uri, strlen($url));
  608.                                            
  609.                                         return rtrim($uri, '/');
  610.                                        
  611.                                 }
  612.                                 else
  613.                                 if
  614.                                 (
  615.                                         isset($_SERVER['ORIG_PATH_INFO'])
  616.                                 )
  617.                                 {
  618.                                         $uri = $_SERVER['ORIG_PATH_INFO'];
  619.                                        
  620.                                         if(!empty($_SERVER['QUERY_STRING']))
  621.                                                 $uri .= '?'.$_SERVER['QUERY_STRING'];
  622.                                                
  623.                                 }
  624.                                 else
  625.                                 {
  626.                                         return rtrim($uri, '/');
  627.                                 }                              
  628.                                
  629.                         }
  630.                        
  631.                         return rtrim($uri, '/');
  632.                 }
  633.                
  634.                 private function getBase($uri, $base = NULL)
  635.                 {
  636.                         if((null !== $base) && !is_string($base))
  637.                                 return;
  638.                        
  639.                         if($base === NULL)
  640.                         {
  641.                                  $filename = (isset($_SERVER['SCRIPT_FILENAME'])) ? basename($_SERVER['SCRIPT_FILENAME']) : '';
  642.                        
  643.                                 if((isset($_SERVER['SCRIPT_NAME']) && basename($_SERVER['SCRIPT_NAME']) === $filename))
  644.                                 {
  645.                                         $base = $_SERVER['SCRIPT_NAME'];
  646.                                 }
  647.                                 else
  648.                                 if(isset($_SERVER['PHP_SELF']) && basename($_SERVER['PHP_SELF']) === $filename)
  649.                                 {
  650.                                          $base = $_SERVER['PHP_SELF'];
  651.                                 }
  652.                                 else
  653.                                 if(isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME']) === $filename)
  654.                                 {
  655.                                          $base = $_SERVER['ORIG_SCRIPT_NAME'];
  656.                                 }
  657.                                 else
  658.                                 {
  659.                                         $self    = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : '';
  660.                                         $file    = isset($_SERVER['SCRIPT_FILENAME']) ? $_SERVER['SCRIPT_FILENAME'] : '';
  661.                                         $dirs    = array_reverse(explode('/', trim($file, '/')));
  662.                                         $base    = '';
  663.                                         $i       = 0;
  664.                                         $l       = count($dirs);
  665.                                        
  666.                                         do
  667.                                         {
  668.                                                 $base    = '/'.$dirs[$i].$base;
  669.                                                 ++$i;
  670.                                         }
  671.                                         while (($l > $i) && (false !== ($c = strpos($self, $base))) && (0 != $c));
  672.                                 }
  673.                                
  674.                                 if(0 === strpos($uri, $base))
  675.                                         return $base;
  676.                                        
  677.                                        
  678.                                 if(0 === strpos($uri, dirname($base)))
  679.                                         return rtrim(dirname($base), '/');
  680.                                
  681.                                 $basename = basename($base);
  682.                                 if(empty($basename) || !strpos($uri, $basename))
  683.                                         return '';
  684.                                        
  685.                                 if ((strlen($uri) >= strlen($base)) && ((false !== ($i = strpos($uri, $base))) && ($i !== 0)))
  686.                                         $base = substr($uri, 0, $i + strlen($base));
  687.                                        
  688.                         }
  689.                        
  690.                         return rtrim($base, '/');
  691.                        
  692.                 }
  693.                
  694.                 private function getPath($uri = NULL, $base = NULL)
  695.                 {      
  696.                         if((null !== $uri) && !is_string($uri))
  697.                                 return;
  698.                                
  699.                         if((null !== $base) && !is_string($base))
  700.                                 return;
  701.                                
  702.                         if($base == '/' || $base == '\')
  703.                                 return;
  704.                        
  705.                         if (false !== ($i = strpos($uri, '?')))
  706.                                 $uri = substr($uri, 0, ($i));
  707.                                
  708.                         $uri = rtrim($uri, '/');
  709.                                
  710.                         $path = str_replace($base, NULL, $uri);
  711.                        
  712.                         if(empty($path))
  713.                                 $path = '/';
  714.                                
  715.                         return $path;
  716.                 }
  717.         }