From 51753e403fa69c0ce124ede27d300477e3e799ca Mon Sep 17 00:00:00 2001
From: VirtualTam <virtualtam@flibidi.net>
Date: Mon, 3 Dec 2018 00:34:53 +0100
Subject: namespacing: move HTTP utilities along \Shaarli\Http\ classes

Signed-off-by: VirtualTam <virtualtam@flibidi.net>
---
 tests/http/HttpUtils/ServerUrlTest.php | 223 +++++++++++++++++++++++++++++++++
 1 file changed, 223 insertions(+)
 create mode 100644 tests/http/HttpUtils/ServerUrlTest.php

(limited to 'tests/http/HttpUtils/ServerUrlTest.php')

diff --git a/tests/http/HttpUtils/ServerUrlTest.php b/tests/http/HttpUtils/ServerUrlTest.php
new file mode 100644
index 00000000..9caf1049
--- /dev/null
+++ b/tests/http/HttpUtils/ServerUrlTest.php
@@ -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'
+                )
+            )
+        );
+    }
+}
-- 
cgit v1.2.3