From 204b27c8e0c1bcfa6810ee45bd12fda3f5d83960 Mon Sep 17 00:00:00 2001
From: Michael Hamann <michael@content-space.de>
Date: Sun, 16 Jan 2011 22:23:54 +0100
Subject: [PATCH] Fix getBaseURL for literal IPv6 addresses in URLs (RFC 2732)
 + test case

---
 _test/cases/inc/init_getbaseurl.test.php | 25 ++++++++++++++++++++++++
 inc/init.php                             | 13 ++++++++++--
 2 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/_test/cases/inc/init_getbaseurl.test.php b/_test/cases/inc/init_getbaseurl.test.php
index d9c76801f..a22172feb 100644
--- a/_test/cases/inc/init_getbaseurl.test.php
+++ b/_test/cases/inc/init_getbaseurl.test.php
@@ -275,6 +275,31 @@ class init_getBaseURL_test extends UnitTestCase {
           $this->assertEqual(getBaseURL(true),$correct_result);
         }
     }
+
+    /**
+     * Absolute URL with IPv6 domain name.
+     * lighttpd, fastcgi
+     *
+     * data provided by Michael Hamann <michael@content-space.de>
+     */
+    function test12() {
+        global $conf;
+        $conf['basedir'] = '';
+        $conf['baseurl'] = '';
+        $conf['canonical'] = 0;
+
+        $_SERVER['DOCUMENT_ROOT'] = '/srv/http/';
+        $_SERVER['HTTP_HOST'] = '[fd00::6592:39ed:a2ed:2c78]';
+        $_SERVER['SCRIPT_FILENAME'] = '/srv/http/~michitux/dokuwiki/doku.php';
+        $_SERVER['REQUEST_URI'] = '/~michitux/dokuwiki/doku.php?do=debug';
+        $_SERVER['SCRIPT_NAME'] = '/~michitux/dokuwiki/doku.php';
+        $_SERVER['PATH_INFO'] = null;
+        $_SERVER['PATH_TRANSLATED'] = null;
+        $_SERVER['PHP_SELF'] = '/~michitux/dokuwiki/doku.php';
+        $_SERVER['SERVER_PORT'] = '80';
+        $_SERVER['SERVER_NAME'] = '[fd00';
+        $this->assertEqual(getBaseURL(true), 'http://[fd00::6592:39ed:a2ed:2c78]/~michitux/dokuwiki/');
+    }
 }
 
 //Setup VIM: ex: et ts=2 :
diff --git a/inc/init.php b/inc/init.php
index 3b438f15b..6f4ba1ca9 100644
--- a/inc/init.php
+++ b/inc/init.php
@@ -420,9 +420,13 @@ function getBaseURL($abs=null){
 
     //split hostheader into host and port
     if(isset($_SERVER['HTTP_HOST'])){
-        list($host,$port) = explode(':',$_SERVER['HTTP_HOST']);
+        $parsed_host = parse_url('http://'.$_SERVER['HTTP_HOST']);
+        $host = $parsed_host['host'];
+        $port = $parsed_host['port'];
     }elseif(isset($_SERVER['SERVER_NAME'])){
-        list($host,$port) = explode(':',$_SERVER['SERVER_NAME']);
+        $parsed_host = parse_url('http://'.$_SERVER['SERVER_NAME']);
+        $host = $parsed_host['host'];
+        $port = $parsed_host['port'];
     }else{
         $host = php_uname('n');
         $port = '';
@@ -431,6 +435,11 @@ function getBaseURL($abs=null){
     if(!$port && isset($_SERVER['SERVER_PORT'])) {
         $port = $_SERVER['SERVER_PORT'];
     }
+
+    if(is_null($port)){
+        $port = '';
+    }
+
     if(!is_ssl()){
         $proto = 'http://';
         if ($port == '80') {
-- 
GitLab