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:
gicode 2011-11-15 17:38:20 +00:00
parent 72f648ae91
commit 101e3cfa2d
3 changed files with 166 additions and 0 deletions

View file

@ -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.

View file

@ -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

View 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;
}
}