diff --git a/src/wp-includes/class-http.php b/src/wp-includes/class-http.php index 232ef69c3b..b2b00623d8 100644 --- a/src/wp-includes/class-http.php +++ b/src/wp-includes/class-http.php @@ -675,16 +675,17 @@ class WP_Http { if ( empty( $url ) ) return $maybe_relative_path; - // Check for a scheme. - if ( false !== strpos( $maybe_relative_path, '://' ) ) - return $maybe_relative_path; - if ( ! $url_parts = @parse_url( $url ) ) return $maybe_relative_path; if ( ! $relative_url_parts = @parse_url( $maybe_relative_path ) ) return $maybe_relative_path; + // Check for a scheme on the 'relative' url + if ( ! empty( $relative_url_parts['scheme'] ) ) { + return $maybe_relative_path; + } + $absolute_path = $url_parts['scheme'] . '://' . $url_parts['host']; if ( isset( $url_parts['port'] ) ) $absolute_path .= ':' . $url_parts['port']; diff --git a/tests/phpunit/tests/http/http.php b/tests/phpunit/tests/http/http.php index 578d6e84a8..995220794f 100644 --- a/tests/phpunit/tests/http/http.php +++ b/tests/phpunit/tests/http/http.php @@ -56,7 +56,11 @@ class Tests_HTTP_HTTP extends WP_UnitTestCase { array( 'otherfile.ext?query=string', 'http://example.com/file.ext?existing=query-string', 'http://example.com/otherfile.ext?query=string' ), // A file with a leading dot - array( '.ext', 'http://example.com/', 'http://example.com/.ext' ) + array( '.ext', 'http://example.com/', 'http://example.com/.ext' ), + + // URls within URLs + array( '/expected', 'http://example.com/sub/http://site.com/sub/', 'http://example.com/expected' ), + array( '/expected/http://site.com/sub/', 'http://example.com/', 'http://example.com/expected/http://site.com/sub/' ), ); } }