From e30311d65820808037a3fb4eda0ef5c316227ca1 Mon Sep 17 00:00:00 2001
From: Stein Magne Bjorklund <steinmb@smbjorklund.com>
Date: Fri, 17 Sep 2021 16:34:45 +0200
Subject: [PATCH] Refactor Utils::getMirroredUri()

- Reduce logic complexity.
- Return early. Code get called on every request and should be fast.
- Remove support for mirroring multiple uri. Code uses a long gone
PHP function. Split this into a private method.
---
 classes/Utils.php                 | 70 +++++++++++++++++++------------
 classes/modules/serviceModule.php |  2 +-
 2 files changed, 44 insertions(+), 28 deletions(-)

diff --git a/classes/Utils.php b/classes/Utils.php
index 73895735..186b9381 100644
--- a/classes/Utils.php
+++ b/classes/Utils.php
@@ -215,7 +215,7 @@ class Utils
             $t = $parser->getTriples();
             $triples = array_merge($triples, $t);
         }
-        if ($lodspk['mirror_external_uris']) {
+            if (self::mirror_external_uris($lodspk)) {
             global $uri;
             global $localUri;
             $t = array();
@@ -803,38 +803,54 @@ class Utils
         return $result;
     }
 
-    public static function getMirroredUri($localUri)
+    public static function mirror_external_uris($conf): bool
     {
-        global $conf;
-        $uri = $localUri;
-        if (isset($conf['mirror_external_uris']) && $conf['mirror_external_uris'] != false) {
-            if (is_bool($conf['mirror_external_uris'])) {
-                $uri = preg_replace("|^" . $conf['basedir'] . "|", $conf['ns']['base'], $localUri);
-            } elseif (is_string($conf['mirror_external_uris'])) {
-                $uri = preg_replace("|^" . $conf['basedir'] . "|", $conf['mirror_external_uris'], $localUri);
-            } elseif (is_array($conf['mirror_external_uris'])) {
-                $defaultKey = ""; //Default namespace is empty string ""
-                $namespaceFragment = array_shift(split("/", str_replace($conf['basedir'], "", $localUri)));
+        return isset($conf['mirror_external_uris']) && $conf['mirror_external_uris'] !== false;
+    }
+
+    private static function multiple_mirror_external_uris($conf)
+    {
+        HTTPStatus::send500("Mirroring multiple external uris currently not supported in PHP 7 and 8 by Loadspeakr");
+
+        $defaultKey = ""; //Default namespace is empty string ""
+        $namespaceFragment = array_shift(split("/", str_replace($conf['basedir'], "", $localUri)));
+        $uri = preg_replace(
+          "|^" . $conf['basedir'] . "|",
+          $conf['mirror_external_uris'][$defaultKey],
+          $localUri
+        );
+        foreach ($conf['mirror_external_uris'] as $k => $v) {
+            if ($namespaceFragment == $k) {
                 $uri = preg_replace(
-                  "|^" . $conf['basedir'] . "|",
-                  $conf['mirror_external_uris'][$defaultKey],
+                  "|^" . $conf['basedir'] . $k . "/" . "|",
+                  $conf['mirror_external_uris'][$k],
                   $localUri
                 );
-                foreach ($conf['mirror_external_uris'] as $k => $v) {
-                    if ($namespaceFragment == $k) {
-                        $uri = preg_replace(
-                          "|^" . $conf['basedir'] . $k . "/" . "|",
-                          $conf['mirror_external_uris'][$k],
-                          $localUri
-                        );
-                        break;
-                    }
-                }
-            } else {
-                HTTPStatus::send500("Error in mirroring configuration");
-                exit(1);
+                break;
             }
         }
+
+    }
+
+    public static function getMirroredUri($localUri)
+    {
+        global $conf;
+        $uri = '';
+
+        if (!self::mirror_external_uris($conf)) {
+            return $localUri;
+        }
+
+        if (is_bool($conf['mirror_external_uris'])) {
+            $uri = preg_replace("|^" . $conf['basedir'] . "|", $conf['ns']['base'], $localUri);
+        } elseif (is_string($conf['mirror_external_uris'])) {
+            $uri = preg_replace("|^" . $conf['basedir'] . "|", $conf['mirror_external_uris'], $localUri);
+        } elseif (is_array($conf['mirror_external_uris'])) {
+            self::multiple_mirror_external_uris($conf);
+        } else {
+            HTTPStatus::send500("Error in mirroring configuration");
+        }
+
         return $uri;
     }
 
diff --git a/classes/modules/serviceModule.php b/classes/modules/serviceModule.php
index 7d62b68f..11d222fc 100644
--- a/classes/modules/serviceModule.php
+++ b/classes/modules/serviceModule.php
@@ -148,7 +148,7 @@ class ServiceModule extends abstractModule
             $prefixHeader = array();
 
             for ($i = 0; $i < sizeof($params); $i++) {
-                if ($conf['mirror_external_uris'] != false) {
+                if (Utils::mirror_external_uris($conf)) {
                     $altUri = Utils::curie2uri($params[$i]);
                     $altUri = preg_replace("|^" . $conf['basedir'] . "|", $conf['ns']['local'], $altUri);
                     $params[$i] = Utils::uri2curie($altUri);
-- 
GitLab