From 39f8bf86cd6a519eadef8cfee3be8e2705aa44eb Mon Sep 17 00:00:00 2001 From: Roan Kattouw Date: Fri, 19 Aug 2011 15:25:50 +0000 Subject: [PATCH] Add a PROTO_CANONICAL mode to wfExpandUrl(), which uses $wgCanonicalServer --- includes/Defines.php | 2 +- includes/GlobalFunctions.php | 24 +++++-- .../GlobalFunctions/wfExpandUrlTest.php | 62 ++++++++++++------- 3 files changed, 58 insertions(+), 30 deletions(-) diff --git a/includes/Defines.php b/includes/Defines.php index 2d7e540e3f..1dd7442b50 100644 --- a/includes/Defines.php +++ b/includes/Defines.php @@ -248,4 +248,4 @@ define( 'PROTO_HTTP', 'http://' ); define( 'PROTO_HTTPS', 'https://' ); define( 'PROTO_RELATIVE', '//' ); define( 'PROTO_CURRENT', null ); - +define( 'PROTO_CANONICAL', 1 ); diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index 8e3e07c366..e51cea6764 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -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; } diff --git a/tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php b/tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php index f71ace658d..ab54602606 100644 --- a/tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php +++ b/tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php @@ -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 )" ); } } } -- 2.20.1