Exemple #1
0
 public function testGlue()
 {
     $this->assertEquals('a', path::glue('a'));
     $this->assertEquals('a', path::glue('a', ''));
     $this->assertEquals('a', path::glue('', 'a'));
     $this->assertEquals('a', path::glue('', 'a', ''));
     $this->assertEquals('a/b', path::glue('a/b'));
     $this->assertEquals('a/b', path::glue('a/b', ''));
     $this->assertEquals('a/b', path::glue('', 'a/b'));
     $this->assertEquals('a/b', path::glue('', 'a/b', ''));
     $this->assertEquals('a/b', path::glue('a', 'b'));
     $this->assertEquals('a/b', path::glue('a', '/b'));
     $this->assertEquals('a/b', path::glue('a/', 'b'));
     $this->assertEquals('a/b', path::glue('a/', '/b'));
     $this->assertEquals('alPHA/bETa', path::glue('alPHA', 'bETa'));
     $this->assertEquals('alPHA/bETa', path::glue('alPHA/', 'bETa'));
     $this->assertEquals('alPHA/bETa', path::glue('alPHA', '/bETa'));
     $this->assertEquals('alPHA/bETa', path::glue('alPHA/', '/bETa'));
     $this->assertEquals('alPHA/bETa', path::glue('alPHA//', '/bETa'));
     $this->assertEquals('alPHA/bETa', path::glue('alPHA//', '//bETa'));
     $this->assertEquals('/alPHA/bETa', path::glue('/alPHA//', '/bETa'));
     $this->assertEquals('/alPHA/bETa', path::glue('/alPHA//', '//bETa'));
     $this->assertEquals('//alPHA/bETa', path::glue('//alPHA//', '//bETa'));
     $this->assertEquals('//alPHA/bETa', path::glue('//alPHA//', '////bETa'));
     $this->assertEquals('////alPHA/bETa', path::glue('////alPHA//', '////bETa'));
     $this->assertEquals('/alPHA/bETa', path::glue('', '/alPHA//', '/bETa'));
     $this->assertEquals('/alPHA/bETa', path::glue('', '/alPHA//', '//bETa'));
     $this->assertEquals('alPHA/bETa/gaMMa', path::glue('alPHA//', '/bETa/gaMMa'));
     $this->assertEquals('alPHA/bETa/gaMMa', path::glue('alPHA//', '//bETa/gaMMa'));
     $this->assertEquals('alPHA/bETa/gaMMa', path::glue('alPHA//', '/bETa/gaMMa/'));
     $this->assertEquals('alPHA/bETa/gaMMa', path::glue('alPHA//', '//bETa/gaMMa/', ''));
     $this->assertEquals('alPHA/bETa/gaMMa', path::glue('alPHA//', '/bETa/gaMMa///'));
     $this->assertEquals('alPHA/bETa/gaMMa', path::glue('alPHA//', '//bETa/gaMMa///', ''));
 }
Exemple #2
0
 public function __get($name)
 {
     switch ($name) {
         case 'name':
             return $this->name;
         case 'version':
             if (is_null($this->version)) {
                 $versionFile = path::glue($this->basePath(), 'VERSION');
                 if (file_exists($versionFile)) {
                     $this->version = trim(file_get_contents($versionFile));
                 }
                 if (!$this->version) {
                     throw new \RuntimeException('missing extension version');
                 }
             }
             return $this->version;
     }
 }
Exemple #3
0
 * server or using requests including this script such as
 *
 *    <your-site>/run.php/appname/script.php
 *
 * which is then processing request for script "script.php" of application
 * "appname".
 *
 * @author Thomas Urban
 *
 */
try {
    include 'rewritten.php';
    // get application actually requested
    $application = txf::getContext()->application;
    // get script of application actually requested
    $script = path::glue($application->pathname, $application->script);
    // change to that folder for supporting homogenic use of relative pathnames
    chdir(dirname($script));
    // include selected script
    include_once $script;
    // due to disabled shutdown handler we are required to call related handler manually
    view::current()->onShutdown();
} catch (http_exception $e) {
    header($e->getResponse());
    view::variable('exception', $e);
    view::addBodyClass('exception');
    view::addBodyClass('http-exception');
    $data = variable_space::create('reason', $e);
    try {
        view::main(view::engine()->render('error/' . $e->getCode(), $data));
    } catch (\UnexpectedValueException $dummy) {
Exemple #4
0
 /**
  * Compiles URL addressing selected script of current application.
  *
  * @param string $scriptName pathname of script relative to application folder
  * @param array $parameters set of parameters to pass in query
  * @param mixed $selector first of multiple optional selectors to include
  * @return string URL of addressed script including optional parameters
  */
 public function scriptURL($scriptName, $parameters = array(), $selector = null)
 {
     if (!is_array($parameters)) {
         throw new \InvalidArgumentException('parameters must be array');
     }
     if (substr($scriptName, -4) == '.php') {
         $scriptName = substr($scriptName, 0, -4);
     }
     $selectors = func_get_args();
     $selectors = array_slice($selectors, 2);
     if (count($selectors) == 1 && is_array($selectors[0])) {
         $selectors = array_shift($selectors);
     }
     $selectors = implode('/', array_map(function ($selector) {
         return rawurlencode($selector);
     }, $selectors));
     switch (txf::getContextMode()) {
         case txf::CTXMODE_NORMAL:
         default:
             $url = path::glue($this->url, $scriptName, $selectors);
             break;
         case txf::CTXMODE_REWRITTEN:
             $proxy = $this->usedProxy === true ? '' : $this->usedProxy;
             if ($this->gotNameFromEnvironment) {
                 $url = path::glue($this->context->url, $proxy, $scriptName, $selectors);
             } else {
                 $url = path::glue($this->context->url, $proxy, $this->name, $scriptName, $selectors);
             }
             break;
     }
     return $url . (count($parameters) ? '?' . http_build_query($parameters) : '');
 }
Exemple #5
0
 /**
  * Looks for resource file selected by its relative pathname.
  *
  * This method is used to overload resources in framework by resources in
  * current application.
  *
  * @throws \InvalidArgumentException on providing empty or non-string pathname
  * @param string $resourcePathname relative pathname of resource to look for
  * @return string|null absolute pathname of found resource, null on mismatch
  */
 public function findResource($resourcePathname)
 {
     if (!is_string($resourcePathname) || ($resourcePathname = trim($resourcePathname)) === '') {
         throw new \InvalidArgumentException('invalid or missing resource pathname');
     }
     if ($this->context) {
         if ($this->context->application) {
             $pathname = path::glue($this->context->applicationPathname, $resourcePathname);
             if (is_dir($pathname)) {
                 return $pathname;
             }
         }
         $pathname = path::glue($this->context->frameworkPathname, $resourcePathname);
         if (is_dir($pathname)) {
             return $pathname;
         }
     }
     // no such extension
     return null;
 }
Exemple #6
0
 public function __construct()
 {
     // include some initial assertions on current context providing minimum
     // set of expected information
     assert('$_SERVER["HTTP_HOST"]');
     assert('$_SERVER["DOCUMENT_ROOT"]');
     assert('$_SERVER["SCRIPT_FILENAME"]');
     /*
      * PHASE 1: Detect basic pathnames and URL components
      */
     $this->frameworkPathname = dirname(dirname(__FILE__));
     $this->installationPathname = dirname($this->frameworkPathname);
     $this->isHTTPS = $_SERVER['HTTPS'] != false || $_SERVER['HTTP_X_HTTPS'] != false;
     // analyse special case of working behind reverse proxy
     if (array_key_exists('HTTP_X_ORIGINAL_URL', $_SERVER)) {
         $url = parse_url($_SERVER['HTTP_X_ORIGINAL_URL']);
         $this->hostname = $url['host'];
         $proxyPrefix = $url['path'];
     } else {
         $proxyPrefix = false;
     }
     if (trim($this->hostname) === '') {
         $this->hostname = $_SERVER['HTTP_HOST'];
     }
     /*
      * PHASE 2: Validate and detect current application
      */
     // validate location of processing script ...
     // ... must be inside document root
     if (path::isInWebfolder($_SERVER['SCRIPT_FILENAME']) === false) {
         throw new \InvalidArgumentException('script is not part of webspace');
     }
     // ... must be inside installation folder of TXF
     $this->scriptPathname = path::relativeToAnother($this->installationPathname, realpath($_SERVER['SCRIPT_FILENAME']));
     if ($this->scriptPathname === false) {
         throw new \InvalidArgumentException('script is not part of TXF installation');
     }
     // derive URL's path prefix to select folder containing TXF installation
     $this->prefixPathname = path::relativeToAnother(realpath(static::getDocumentRoot()), $this->installationPathname);
     if ($this->prefixPathname === false) {
         // installation's folder might be linked into document root using symlink
         // --> comparing pathname of current script with document root will fail then
         //     --> try alternative method to find prefix pathname
         $this->prefixPathname = path::relativeToAnother(static::getDocumentRoot(), dirname($_SERVER['SCRIPT_FILENAME']));
     }
     // running behind reverse proxy?
     if ($proxyPrefix) {
         // detect prefix used to control that reverse proxy
         $request = implode('/', $this->getRequestedScriptUri($dummy));
         $split = strpos($proxyPrefix, $request);
         if ($split >= 0) {
             // extract prefix required by reverse proxy
             $proxyPrefix = substr($proxyPrefix, 0, $split);
             // prepend extracted prefix of reverse proxy to previously
             // detected prefix used to address installation of TXF locally
             $this->prefixPathname = path::glue($proxyPrefix, $this->prefixPathname);
         }
     }
     // cache some derivable names
     list($this->applicationPathname, $this->applicationScriptPathname) = path::stripCommonPrefix($this->scriptPathname, $this->prefixPathname, null);
     // compile base URL of current installation
     $this->url = path::glue(($this->isHTTPS ? 'https://' : 'http://') . $this->hostname, $this->prefixPathname);
     // detect current application
     $this->application = application::current($this);
 }