Add a PROTO_CANONICAL mode to wfExpandUrl(), which uses $wgCanonicalServer
This commit is contained in:
parent
8fc36a535a
commit
39f8bf86cd
3 changed files with 58 additions and 30 deletions
|
|
@ -248,4 +248,4 @@ define( 'PROTO_HTTP', 'http://' );
|
|||
define( 'PROTO_HTTPS', 'https://' );
|
||||
define( 'PROTO_RELATIVE', '//' );
|
||||
define( 'PROTO_CURRENT', null );
|
||||
|
||||
define( 'PROTO_CANONICAL', 1 );
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 )" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue