]> git.mxchange.org Git - friendica.git/blobdiff - src/App/BaseURL.php
Merge remote-tracking branch 'upstream/develop' into item-notification
[friendica.git] / src / App / BaseURL.php
index ad5fd0d4ede3d360b2dd76f5f2c84d8cd95b2155..7c286514a6206e46747da3def5e3d62486f166d0 100644 (file)
@@ -2,9 +2,11 @@
 
 namespace Friendica\App;
 
-use Friendica\Core\Config\Configuration;
+use Friendica\Core\Config\IConfiguration;
+use Friendica\Core\System;
 use Friendica\Util\Network;
 use Friendica\Util\Strings;
+use Friendica\Network\HTTPException;
 
 /**
  * A class which checks and contains the basic
@@ -35,7 +37,7 @@ class BaseURL
        /**
         * The Friendica Config
         *
-        * @var Configuration
+        * @var IConfiguration
         */
        private $config;
 
@@ -251,10 +253,10 @@ class BaseURL
        }
 
        /**
-        * @param Configuration $config The Friendica configuration
+        * @param IConfiguration $config The Friendica IConfiguration
         * @param array         $server The $_SERVER array
         */
-       public function __construct(Configuration $config, array $server)
+       public function __construct(IConfiguration $config, array $server)
        {
                $this->config = $config;
                $this->server = $server;
@@ -338,12 +340,12 @@ class BaseURL
                /* Relative script path to the web server root
                 * Not all of those $_SERVER properties can be present, so we do by inverse priority order
                 */
-               $relative_script_path = '';
-               $relative_script_path = defaults($this->server, 'REDIRECT_URL', $relative_script_path);
-               $relative_script_path = defaults($this->server, 'REDIRECT_URI', $relative_script_path);
-               $relative_script_path = defaults($this->server, 'REDIRECT_SCRIPT_URL', $relative_script_path);
-               $relative_script_path = defaults($this->server, 'SCRIPT_URL', $relative_script_path);
-               $relative_script_path = defaults($this->server, 'REQUEST_URI', $relative_script_path);
+               $relative_script_path =
+                       ($this->server['REDIRECT_URL']        ?? '') ?:
+                       ($this->server['REDIRECT_URI']        ?? '') ?:
+                       ($this->server['REDIRECT_SCRIPT_URL'] ?? '') ?:
+                       ($this->server['SCRIPT_URL']          ?? '') ?:
+                        $this->server['REQUEST_URI']         ?? '';
 
                /* $relative_script_path gives /relative/path/to/friendica/module/parameter
                 * QUERY_STRING gives pagename=module/parameter
@@ -353,7 +355,7 @@ class BaseURL
                if (!empty($relative_script_path)) {
                        // Module
                        if (!empty($this->server['QUERY_STRING'])) {
-                               $this->urlPath = trim(rdirname($relative_script_path, substr_count(trim($this->server['QUERY_STRING'], '/'), '/') + 1), '/');
+                               $this->urlPath = trim(dirname($relative_script_path, substr_count(trim($this->server['QUERY_STRING'], '/'), '/') + 1), '/');
                        } else {
                                // Root page
                                $this->urlPath = trim($relative_script_path, '/');
@@ -414,4 +416,31 @@ class BaseURL
                        return $url;
                }
        }
+
+       /**
+        * Redirects to another module relative to the current Friendica base URL.
+        * If you want to redirect to a external URL, use System::externalRedirectTo()
+        *
+        * @param string $toUrl The destination URL (Default is empty, which is the default page of the Friendica node)
+        * @param bool   $ssl   if true, base URL will try to get called with https:// (works just for relative paths)
+        *
+        * @throws HTTPException\InternalServerErrorException In Case the given URL is not relative to the Friendica node
+        */
+       public function redirect($toUrl = '', $ssl = false)
+       {
+               if (!empty(parse_url($toUrl, PHP_URL_SCHEME))) {
+                       throw new HTTPException\InternalServerErrorException("'$toUrl is not a relative path, please use System::externalRedirectTo");
+               }
+
+               $redirectTo = $this->get($ssl) . '/' . ltrim($toUrl, '/');
+               System::externalRedirect($redirectTo);
+       }
+
+       /**
+        * Returns the base url as string
+        */
+       public function __toString()
+       {
+               return $this->get();
+       }
 }