]> git.immae.eu Git - github/shaarli/Shaarli.git/blobdiff - tests/http/HttpUtils/ServerUrlTest.php
namespacing: move HTTP utilities along \Shaarli\Http\ classes
[github/shaarli/Shaarli.git] / tests / http / HttpUtils / ServerUrlTest.php
diff --git a/tests/http/HttpUtils/ServerUrlTest.php b/tests/http/HttpUtils/ServerUrlTest.php
new file mode 100644 (file)
index 0000000..9caf104
--- /dev/null
@@ -0,0 +1,223 @@
+<?php
+/**
+ * HttpUtils' tests
+ */
+
+namespace Shaarli\Http;
+
+require_once 'application/http/HttpUtils.php';
+
+/**
+ * Unitary tests for server_url()
+ */
+class ServerUrlTest extends \PHPUnit\Framework\TestCase
+{
+    /**
+     * Detect if the server uses SSL
+     */
+    public function testHttpsScheme()
+    {
+        $this->assertEquals(
+            'https://host.tld',
+            server_url(
+                array(
+                    'HTTPS' => 'ON',
+                    'SERVER_NAME' => 'host.tld',
+                    'SERVER_PORT' => '443'
+                )
+            )
+        );
+
+        $this->assertEquals(
+            'https://host.tld:8080',
+            server_url(
+                array(
+                    'HTTPS' => 'ON',
+                    'SERVER_NAME' => 'host.tld',
+                    'SERVER_PORT' => '8080'
+                )
+            )
+        );
+    }
+
+    /**
+     * Detect a Proxy that sets Forwarded-Host
+     */
+    public function testHttpsProxyForwardedHost()
+    {
+        $this->assertEquals(
+            'https://host.tld:8080',
+            server_url(
+                array(
+                    'HTTP_X_FORWARDED_PROTO' => 'https',
+                    'HTTP_X_FORWARDED_PORT' => '8080',
+                    'HTTP_X_FORWARDED_HOST' => 'host.tld'
+                )
+            )
+        );
+
+        $this->assertEquals(
+            'https://host.tld:4974',
+            server_url(
+                array(
+                    'HTTP_X_FORWARDED_PROTO' => 'https, https',
+                    'HTTP_X_FORWARDED_PORT' => '4974, 80',
+                    'HTTP_X_FORWARDED_HOST' => 'host.tld, example.com'
+                )
+            )
+        );
+    }
+
+    /**
+     * Detect a Proxy with SSL enabled
+     */
+    public function testHttpsProxyForward()
+    {
+        $this->assertEquals(
+            'https://host.tld:8080',
+            server_url(
+                array(
+                    'HTTPS' => 'Off',
+                    'SERVER_NAME' => 'host.tld',
+                    'SERVER_PORT' => '80',
+                    'HTTP_X_FORWARDED_PROTO' => 'https',
+                    'HTTP_X_FORWARDED_PORT' => '8080'
+                )
+            )
+        );
+
+        $this->assertEquals(
+            'https://host.tld',
+            server_url(
+                array(
+                    'HTTPS' => 'Off',
+                    'SERVER_NAME' => 'host.tld',
+                    'SERVER_PORT' => '80',
+                    'HTTP_X_FORWARDED_PROTO' => 'https'
+                )
+            )
+        );
+
+        $this->assertEquals(
+            'https://host.tld',
+            server_url(
+                array(
+                    'HTTPS' => 'Off',
+                    'SERVER_NAME' => 'host.tld',
+                    'SERVER_PORT' => '80',
+                    'HTTP_X_FORWARDED_PROTO' => 'https',
+                    'HTTP_X_FORWARDED_PORT' => '443'
+                )
+            )
+        );
+
+        $this->assertEquals(
+            'https://host.tld:4974',
+            server_url(
+                array(
+                    'HTTPS' => 'Off',
+                    'SERVER_NAME' => 'host.tld',
+                    'SERVER_PORT' => '80',
+                    'HTTP_X_FORWARDED_PROTO' => 'https, https',
+                    'HTTP_X_FORWARDED_PORT' => '4974, 80'
+                )
+            )
+        );
+    }
+
+    /**
+     * Detect if the server uses a specific port (!= 80)
+     */
+    public function testPort()
+    {
+        // HTTP
+        $this->assertEquals(
+            'http://host.tld:8080',
+            server_url(
+                array(
+                    'HTTPS' => 'OFF',
+                    'SERVER_NAME' => 'host.tld',
+                    'SERVER_PORT' => '8080'
+                )
+            )
+        );
+
+        // HTTPS
+        $this->assertEquals(
+            'https://host.tld:8080',
+            server_url(
+                array(
+                    'HTTPS' => 'ON',
+                    'SERVER_NAME' => 'host.tld',
+                    'SERVER_PORT' => '8080'
+                )
+            )
+        );
+    }
+
+    /**
+     * HTTP server on port 80
+     */
+    public function testStandardHttpPort()
+    {
+        $this->assertEquals(
+            'http://host.tld',
+            server_url(
+                array(
+                    'HTTPS' => 'OFF',
+                    'SERVER_NAME' => 'host.tld',
+                    'SERVER_PORT' => '80'
+                )
+            )
+        );
+    }
+
+    /**
+     * HTTPS server on port 443
+     */
+    public function testStandardHttpsPort()
+    {
+        $this->assertEquals(
+            'https://host.tld',
+            server_url(
+                array(
+                    'HTTPS' => 'ON',
+                    'SERVER_NAME' => 'host.tld',
+                    'SERVER_PORT' => '443'
+                )
+            )
+        );
+    }
+
+    /**
+     * Misconfigured server (see #1022): Proxy HTTP but 443
+     */
+    public function testHttpWithPort433()
+    {
+        $this->assertEquals(
+            'https://host.tld',
+            server_url(
+                array(
+                    'HTTPS' => 'Off',
+                    'SERVER_NAME' => 'host.tld',
+                    'SERVER_PORT' => '80',
+                    'HTTP_X_FORWARDED_PROTO' => 'http',
+                    'HTTP_X_FORWARDED_PORT' => '443'
+                )
+            )
+        );
+
+        $this->assertEquals(
+            'https://host.tld',
+            server_url(
+                array(
+                    'HTTPS' => 'Off',
+                    'SERVER_NAME' => 'host.tld',
+                    'SERVER_PORT' => '80',
+                    'HTTP_X_FORWARDED_PROTO' => 'https, http',
+                    'HTTP_X_FORWARDED_PORT' => '443, 80'
+                )
+            )
+        );
+    }
+}