Add a PROTO_CANONICAL mode to wfExpandUrl(), which uses $wgCanonicalServer
authorRoan Kattouw <catrope@users.mediawiki.org>
Fri, 19 Aug 2011 15:25:50 +0000 (15:25 +0000)
committerRoan Kattouw <catrope@users.mediawiki.org>
Fri, 19 Aug 2011 15:25:50 +0000 (15:25 +0000)
includes/Defines.php
includes/GlobalFunctions.php
tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php

index 2d7e540..1dd7442 100644 (file)
@@ -248,4 +248,4 @@ define( 'PROTO_HTTP', 'http://' );
 define( 'PROTO_HTTPS', 'https://' );
 define( 'PROTO_RELATIVE', '//' );
 define( 'PROTO_CURRENT', null );
-
+define( 'PROTO_CANONICAL', 1 );
index 8e3e07c..e51cea6 100644 (file)
@@ -437,6 +437,7 @@ function wfAppendQuery( $url, $query ) {
  * PROTO_HTTPS: Output a URL starting with https://
  * PROTO_RELATIVE: Output a URL starting with // (protocol-relative URL)
  * PROTO_CURRENT: Output a URL starting with either http:// or https:// , depending on which protocol was used for the current incoming request
+ * PROTO_CANONICAL: For URLs without a domain, like /w/index.php , use $wgCanonicalServer. For protocol-relative URLs, use the protocol of $wgCanonicalServer
  *
  * @todo this won't work with current-path-relative URLs
  * like "subdir/foo.html", etc.
@@ -446,21 +447,34 @@ function wfAppendQuery( $url, $query ) {
  * @return string Fully-qualified URL
  */
 function wfExpandUrl( $url, $defaultProto = PROTO_CURRENT ) {
-       global $wgServer;
+       global $wgServer, $wgCanonicalServer;
+       $serverUrl = $defaultProto === PROTO_CANONICAL ? $wgCanonicalServer : $wgServer;
+       
        if ( $defaultProto === PROTO_CURRENT ) {
                $defaultProto = WebRequest::detectProtocol() . '://';
        }
        
-       // Analyze $wgServer to obtain its protocol
-       $bits = wfParseUrl( $wgServer );
+       // Analyze $serverUrl to obtain its protocol
+       $bits = wfParseUrl( $serverUrl );
        $serverHasProto = $bits && $bits['scheme'] != '';
+       
+       if ( $defaultProto === PROTO_CANONICAL ) {
+               if ( $serverHasProto ) {
+                       $defaultProto = $bits['scheme'] . '://';
+               } else {
+                       // $wgCanonicalServer doesn't have a protocol. This really isn't supposed to happen
+                       // Fall back to HTTP in this ridiculous case
+                       $defaultProto = PROTO_HTTP;
+               }
+       }
+       
        $defaultProtoWithoutSlashes = substr( $defaultProto, 0, -2 );
        
        if( substr( $url, 0, 2 ) == '//' ) {
                return $defaultProtoWithoutSlashes . $url;
        } elseif( substr( $url, 0, 1 ) == '/' ) {
-               // If $wgServer is protocol-relative, prepend $defaultProtoWithoutSlashes, otherwise leave it alone
-               return ( $serverHasProto ? '' : $defaultProtoWithoutSlashes ) . $wgServer . $url;
+               // If $serverUrl is protocol-relative, prepend $defaultProtoWithoutSlashes, otherwise leave it alone
+               return ( $serverHasProto ? '' : $defaultProtoWithoutSlashes ) . $serverUrl . $url;
        } else {
                return $url;
        }
index f71ace6..ab54602 100644 (file)
@@ -5,11 +5,13 @@
 
 class wfExpandUrl extends MediaWikiTestCase {
        /** @dataProvider provideExpandableUrls */
-       public function testWfExpandUrl( $fullUrl, $shortUrl, $defaultProto, $server, $httpsMode, $message ) {
-               // Fake $wgServer
-               global $wgServer;
+       public function testWfExpandUrl( $fullUrl, $shortUrl, $defaultProto, $server, $canServer, $httpsMode, $message ) {
+               // Fake $wgServer and $wgCanonicalServer
+               global $wgServer, $wgCanonicalServer;
                $oldServer = $wgServer;
+               $oldCanServer = $wgCanonicalServer;
                $wgServer = $server;
+               $wgCanonicalServer = $canServer;
                
                // Fake $_SERVER['HTTPS'] if needed
                if ( $httpsMode ) {
@@ -20,8 +22,9 @@ class wfExpandUrl extends MediaWikiTestCase {
                
                $this->assertEquals( $fullUrl, wfExpandUrl( $shortUrl, $defaultProto ), $message );
                
-               // Restore $wgServer
+               // Restore $wgServer and $wgCanonicalServer
                $wgServer = $oldServer;
+               $wgCanonicalServer = $oldCanServer;
        }
 
        /**
@@ -32,32 +35,43 @@ class wfExpandUrl extends MediaWikiTestCase {
        public function provideExpandableUrls() {
                $modes = array( 'http', 'https' );
                $servers = array( 'http' => 'http://example.com', 'https' => 'https://example.com', 'protocol-relative' => '//example.com' );
-               $defaultProtos = array( 'http' => PROTO_HTTP, 'https' => PROTO_HTTPS, 'protocol-relative' => PROTO_RELATIVE, 'current' => PROTO_CURRENT );
+               $defaultProtos = array( 'http' => PROTO_HTTP, 'https' => PROTO_HTTPS, 'protocol-relative' => PROTO_RELATIVE, 'current' => PROTO_CURRENT, 'canonical' => PROTO_CANONICAL );
                
                $retval = array();
                foreach ( $modes as $mode ) {
                        $httpsMode = $mode == 'https';
                        foreach ( $servers as $serverDesc => $server ) {
-                               foreach ( $defaultProtos as $protoDesc => $defaultProto ) {
-                                       $retval[] = array( 'http://example.com', 'http://example.com', $defaultProto, $server, $httpsMode, "Testing fully qualified http URLs (no need to expand) (defaultProto: $protoDesc , wgServer: $server, current request protocol: $mode )" );
-                                       $retval[] = array( 'https://example.com', 'https://example.com', $defaultProto, $server, $httpsMode, "Testing fully qualified https URLs (no need to expand) (defaultProto: $protoDesc , wgServer: $server, current request protocol: $mode )" );
-                                       # Would be nice to support this, see fixme on wfExpandUrl()
-                                       $retval[] = array( "wiki/FooBar", 'wiki/FooBar', $defaultProto, $server, $httpsMode, "Test non-expandable relative URLs (defaultProto: $protoDesc , wgServer: $server, current request protocol: $mode )" );
-                                       
-                                       // Determine expected protocol
-                                       $p = $protoDesc . ':'; // default case
-                                       if ( $protoDesc == 'protocol-relative' ) {
-                                               $p = '';
-                                       } else if ( $protoDesc == 'current' ) {
-                                               $p = "$mode:";
-                                       } else {
-                                               $p = $protoDesc . ':';
+                               foreach ( $modes as $canServerMode  ) {
+                                       $canServer = "$canServerMode://example2.com";
+                                       foreach ( $defaultProtos as $protoDesc => $defaultProto ) {
+                                               $retval[] = array( 'http://example.com', 'http://example.com', $defaultProto, $server, $canServer, $httpsMode, "Testing fully qualified http URLs (no need to expand) (defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )" );
+                                               $retval[] = array( 'https://example.com', 'https://example.com', $defaultProto, $server, $canServer, $httpsMode, "Testing fully qualified https URLs (no need to expand) (defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )" );
+                                               # Would be nice to support this, see fixme on wfExpandUrl()
+                                               $retval[] = array( "wiki/FooBar", 'wiki/FooBar', $defaultProto, $server, $canServer, $httpsMode, "Test non-expandable relative URLs (defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )" );
+                                               
+                                               // Determine expected protocol
+                                               $p = $protoDesc . ':'; // default case
+                                               if ( $protoDesc == 'protocol-relative' ) {
+                                                       $p = '';
+                                               } else if ( $protoDesc == 'current' ) {
+                                                       $p = "$mode:";
+                                               } else if ( $protoDesc == 'canonical' ) {
+                                                       $p = "$canServerMode:";
+                                               } else {
+                                                       $p = $protoDesc . ':';
+                                               }
+                                               // Determine expected server name
+                                               if ( $protoDesc == 'canonical' ) {
+                                                       $srv = $canServer;
+                                               } else if ( $serverDesc == 'protocol-relative' ) {
+                                                       $srv = $p . $server;
+                                               } else {
+                                                       $srv = $server;
+                                               }
+                                               
+                                               $retval[] = array( "$p//wikipedia.org", '//wikipedia.org', $defaultProto, $server, $canServer, $httpsMode, "Test protocol-relative URL (defaultProto: $protoDesc, wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )" );
+                                               $retval[] = array( "$srv/wiki/FooBar", '/wiki/FooBar', $defaultProto, $server, $canServer, $httpsMode, "Testing expanding URL beginning with / (defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )" );
                                        }
-                                       // Determine expected server name
-                                       $srv = $serverDesc == 'protocol-relative' ? $p . $server : $server;
-                                       
-                                       $retval[] = array( "$p//wikipedia.org", '//wikipedia.org', $defaultProto, $server, $httpsMode, "Test protocol-relative URL (defaultProto: $protoDesc, wgServer: $server, current request protocol: $mode )" );
-                                       $retval[] = array( "$srv/wiki/FooBar", '/wiki/FooBar', $defaultProto, $server, $httpsMode, "Testing expanding URL beginning with / (defaultProto: $protoDesc , wgServer: $server, current request protocol: $mode )" );
                                }
                        }
                }