HTTP API: Add a $component parameter to wp_parse_url() to give it parity with PHP's parse_url() function.

Fixes #36356
Props jrf

Built from https://develop.svn.wordpress.org/trunk@38694


git-svn-id: http://core.svn.wordpress.org/trunk@38637 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
John Blackbourn 2016-09-30 21:47:28 +00:00
parent b154ab767e
commit a51267269b
2 changed files with 53 additions and 20 deletions

View File

@ -633,35 +633,68 @@ function ms_allowed_http_request_hosts( $is_external, $host ) {
* when URL parsing failed. * when URL parsing failed.
* *
* @since 4.4.0 * @since 4.4.0
* @since 4.7.0 The $component parameter was added for parity with PHP's parse_url().
* *
* @param string $url The URL to parse. * @param string $url The URL to parse.
* @return bool|array False on failure; Array of URL components on success; * @param int $component The specific component to retrieve. Use one of the PHP
* See parse_url()'s return values. * predefined constants to specify which one.
* Defaults to -1 (= return all parts as an array).
* @see http://php.net/manual/en/function.parse-url.php
* @return mixed False on failure; Array of URL components on success;
* When a specific component has been requested: null if the component doesn't
* exist in the given URL; a sting or - in the case of PHP_URL_PORT - integer
* when it does; See parse_url()'s return values.
*/ */
function wp_parse_url( $url ) { function wp_parse_url( $url, $component = -1 ) {
$parts = @parse_url( $url ); $parts = @parse_url( $url, $component );
if ( ! $parts ) {
// < PHP 5.4.7 compat, trouble with relative paths including a scheme break in the path if ( version_compare( PHP_VERSION, '5.4.7', '>=' ) ) {
return $parts;
}
if ( false === $parts ) {
// < PHP 5.4.7 compat, trouble with relative paths including a scheme break in the path.
if ( '/' == $url[0] && false !== strpos( $url, '://' ) ) { if ( '/' == $url[0] && false !== strpos( $url, '://' ) ) {
// Since we know it's a relative path, prefix with a scheme/host placeholder and try again if ( in_array( $component, array( PHP_URL_SCHEME, PHP_URL_HOST ), true ) ) {
if ( ! $parts = @parse_url( 'placeholder://placeholder' . $url ) ) { return null;
}
// Since we know it's a relative path, prefix with a scheme/host placeholder and try again.
if ( ! $parts = @parse_url( 'placeholder://placeholder' . $url, $component ) ) {
return $parts; return $parts;
} }
// Remove the placeholder values // Remove the placeholder values.
unset( $parts['scheme'], $parts['host'] ); if ( -1 === $component ) {
unset( $parts['scheme'], $parts['host'] );
}
} else { } else {
return $parts; return $parts;
} }
} }
// < PHP 5.4.7 compat, doesn't detect schemeless URL's host field // < PHP 5.4.7 compat, doesn't detect a schemeless URL's host field.
if ( '//' == substr( $url, 0, 2 ) && ! isset( $parts['host'] ) ) { if ( '//' == substr( $url, 0, 2 ) ) {
$path_parts = explode( '/', substr( $parts['path'], 2 ), 2 ); if ( -1 === $component && ! isset( $parts['host'] ) ) {
$parts['host'] = $path_parts[0]; $path_parts = explode( '/', substr( $parts['path'], 2 ), 2 );
if ( isset( $path_parts[1] ) ) { $parts['host'] = $path_parts[0];
$parts['path'] = '/' . $path_parts[1]; if ( isset( $path_parts[1] ) ) {
} else { $parts['path'] = '/' . $path_parts[1];
unset( $parts['path'] ); } else {
unset( $parts['path'] );
}
} elseif ( PHP_URL_HOST === $component || PHP_URL_PATH === $component ) {
$all_parts = @parse_url( $url );
if ( ! isset( $all_parts['host'] ) ) {
$path_parts = explode( '/', substr( $all_parts['path'], 2 ), 2 );
if ( PHP_URL_PATH === $component ) {
if ( isset( $path_parts[1] ) ) {
$parts = '/' . $path_parts[1];
} else {
$parts = null;
}
} elseif ( PHP_URL_HOST === $component ) {
$parts = $path_parts[0];
}
}
} }
} }

View File

@ -4,7 +4,7 @@
* *
* @global string $wp_version * @global string $wp_version
*/ */
$wp_version = '4.7-alpha-38693'; $wp_version = '4.7-alpha-38694';
/** /**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema. * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.