Add wfAssembleUrl and unit tests. This is the next step towards fixing
bug 32168. This function is the inverse of wfParseUrl and is useful when you need to modify part of a URL and have to put it back together. Further, with the addition of this function, there is sufficient code in core to create a proper URI class.
This commit is contained in:
parent
72f648ae91
commit
101e3cfa2d
3 changed files with 166 additions and 0 deletions
|
|
@ -135,6 +135,7 @@ production.
|
|||
* (bug 32168) Add wfRemoveDotSegments for use in wfExpandUrl
|
||||
* (bug 32358) Do not display "No higher resolution available" for dimensionless
|
||||
files (like audio files)
|
||||
* (bug 32168) Add wfAssembleUrl for use in wfExpandUrl
|
||||
|
||||
=== API changes in 1.19 ===
|
||||
* (bug 19838) siprop=interwikimap can now use the interwiki cache.
|
||||
|
|
|
|||
|
|
@ -487,6 +487,60 @@ function wfExpandUrl( $url, $defaultProto = PROTO_CURRENT ) {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This function will reassemble a URL parsed with wfParseURL. This is useful
|
||||
* if you need to edit part of a URL and put it back together.
|
||||
*
|
||||
* This is the basic structure used (brackets contain keys for $urlParts):
|
||||
* [scheme][delimiter][user]:[pass]@[host]:[port][path]?[query]#[fragment]
|
||||
*
|
||||
* @todo Need to integrate this into wfExpandUrl (bug 32168)
|
||||
*
|
||||
* @param $urlParts Array URL parts, as output from wfParseUrl
|
||||
* @return string URL assembled from its component parts
|
||||
*/
|
||||
function wfAssembleUrl( $urlParts ) {
|
||||
$result = '';
|
||||
|
||||
if ( array_key_exists( 'delimiter', $urlParts ) ) {
|
||||
if ( array_key_exists( 'scheme', $urlParts ) ) {
|
||||
$result .= $urlParts['scheme'];
|
||||
}
|
||||
|
||||
$result .= $urlParts['delimiter'];
|
||||
}
|
||||
|
||||
if ( array_key_exists( 'host', $urlParts ) ) {
|
||||
if ( array_key_exists( 'user', $urlParts ) ) {
|
||||
$result .= $urlParts['user'];
|
||||
if ( array_key_exists( 'pass', $urlParts ) ) {
|
||||
$result .= ':' . $urlParts['pass'];
|
||||
}
|
||||
$result .= '@';
|
||||
}
|
||||
|
||||
$result .= $urlParts['host'];
|
||||
|
||||
if ( array_key_exists( 'port', $urlParts ) ) {
|
||||
$result .= ':' . $urlParts['port'];
|
||||
}
|
||||
}
|
||||
|
||||
if ( array_key_exists( 'path', $urlParts ) ) {
|
||||
$result .= $urlParts['path'];
|
||||
}
|
||||
|
||||
if ( array_key_exists( 'query', $urlParts ) ) {
|
||||
$result .= '?' . $urlParts['query'];
|
||||
}
|
||||
|
||||
if ( array_key_exists( 'fragment', $urlParts ) ) {
|
||||
$result .= '#' . $urlParts['fragment'];
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove all dot-segments in the provided URL path. For example,
|
||||
* '/a/./b/../c/' becomes '/a/c/'. For details on the algorithm, please see
|
||||
|
|
|
|||
111
tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php
Normal file
111
tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
<?php
|
||||
/**
|
||||
* Unit tests for wfAssembleUrl()
|
||||
*/
|
||||
|
||||
class wfAssembleUrl extends MediaWikiTestCase {
|
||||
/** @dataProvider provideURLParts */
|
||||
public function testWfAssembleUrl( $parts, $output ) {
|
||||
$partsDump = print_r( $parts, true );
|
||||
$this->assertEquals(
|
||||
$output,
|
||||
wfAssembleUrl( $parts ),
|
||||
"Testing $partsDump assembles to $output"
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provider of URL parts for testing wfAssembleUrl()
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function provideURLParts() {
|
||||
$schemes = array(
|
||||
'' => array(),
|
||||
'//' => array(
|
||||
'delimiter' => '//',
|
||||
),
|
||||
'http://' => array(
|
||||
'scheme' => 'http',
|
||||
'delimiter' => '://',
|
||||
),
|
||||
);
|
||||
|
||||
$hosts = array(
|
||||
'' => array(),
|
||||
'example.com' => array(
|
||||
'host' => 'example.com',
|
||||
),
|
||||
'example.com:123' => array(
|
||||
'host' => 'example.com',
|
||||
'port' => 123,
|
||||
),
|
||||
'id@example.com' => array(
|
||||
'user' => 'id',
|
||||
'host' => 'example.com',
|
||||
),
|
||||
'id@example.com:123' => array(
|
||||
'user' => 'id',
|
||||
'host' => 'example.com',
|
||||
'port' => 123,
|
||||
),
|
||||
'id:key@example.com' => array(
|
||||
'user' => 'id',
|
||||
'pass' => 'key',
|
||||
'host' => 'example.com',
|
||||
),
|
||||
'id:key@example.com:123' => array(
|
||||
'user' => 'id',
|
||||
'pass' => 'key',
|
||||
'host' => 'example.com',
|
||||
'port' => 123,
|
||||
),
|
||||
);
|
||||
|
||||
$cases = array();
|
||||
foreach ( $schemes as $scheme => $schemeParts ) {
|
||||
foreach ( $hosts as $host => $hostParts ) {
|
||||
foreach ( array( '', '/path' ) as $path ) {
|
||||
foreach ( array( '', 'query' ) as $query ) {
|
||||
foreach ( array( '', 'fragment' ) as $fragment ) {
|
||||
$parts = array_merge(
|
||||
$schemeParts,
|
||||
$hostParts
|
||||
);
|
||||
$url = $scheme .
|
||||
$host .
|
||||
$path;
|
||||
|
||||
if ( $path ) {
|
||||
$parts['path'] = $path;
|
||||
}
|
||||
if ( $query ) {
|
||||
$parts['query'] = $query;
|
||||
$url .= '?' . $query;
|
||||
}
|
||||
if( $fragment ) {
|
||||
$parts['fragment'] = $fragment;
|
||||
$url .= '#' . $fragment;
|
||||
}
|
||||
|
||||
|
||||
$cases[] = array(
|
||||
$parts,
|
||||
$url,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$complexURL = 'http://id:key@example.org:321' .
|
||||
'/over/there?name=ferret&foo=bar#nose';
|
||||
$cases[] = array(
|
||||
wfParseUrl( $complexURL ),
|
||||
$complexURL,
|
||||
);
|
||||
|
||||
return $cases;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue