diff --git a/src/wp-includes/formatting.php b/src/wp-includes/formatting.php index eeb54dba03..91b3134ffa 100644 --- a/src/wp-includes/formatting.php +++ b/src/wp-includes/formatting.php @@ -3398,7 +3398,7 @@ function esc_url( $url, $protocols = null, $_context = 'display' ) { if ( ( false !== strpos( $url, '[' ) ) || ( false !== strpos( $url, ']' ) ) ) { - $parsed = parse_url( $url ); + $parsed = wp_parse_url( $url ); $front = ''; if ( isset( $parsed['scheme'] ) ) { diff --git a/tests/phpunit/tests/formatting/EscUrl.php b/tests/phpunit/tests/formatting/EscUrl.php index b77fbc3b21..0d3e2359c7 100644 --- a/tests/phpunit/tests/formatting/EscUrl.php +++ b/tests/phpunit/tests/formatting/EscUrl.php @@ -210,4 +210,18 @@ EOT; $this->assertEmpty( esc_url_raw('"^<>{}`') ); } + /** + * @ticket 34202 + */ + function test_ipv6_hosts() { + $this->assertEquals( '//[::127.0.0.1]', esc_url( '//[::127.0.0.1]' ) ); + $this->assertEquals( 'http://[::FFFF::127.0.0.1]', esc_url( 'http://[::FFFF::127.0.0.1]' ) ); + $this->assertEquals( 'http://[::127.0.0.1]', esc_url( 'http://[::127.0.0.1]' ) ); + $this->assertEquals( 'http://[::DEAD:BEEF:DEAD:BEEF:DEAD:BEEF:DEAD:BEEF]', esc_url( 'http://[::DEAD:BEEF:DEAD:BEEF:DEAD:BEEF:DEAD:BEEF]' ) ); + + // IPv6 with square brackets in the query? Why not. + $this->assertEquals( '//[::FFFF::127.0.0.1]/?foo%5Bbar%5D=baz', esc_url( '//[::FFFF::127.0.0.1]/?foo[bar]=baz' ) ); + $this->assertEquals( 'http://[::FFFF::127.0.0.1]/?foo%5Bbar%5D=baz', esc_url( 'http://[::FFFF::127.0.0.1]/?foo[bar]=baz' ) ); + } + }