diff --git a/src/wp-includes/feed.php b/src/wp-includes/feed.php index d2fd25ecb0..d56ce8b18e 100644 --- a/src/wp-includes/feed.php +++ b/src/wp-includes/feed.php @@ -519,6 +519,35 @@ function atom_enclosure() { if ( 'enclosure' === $key ) { foreach ( (array) $val as $enc ) { $enclosure = explode( "\n", $enc ); + + $url = ''; + $type = ''; + $length = 0; + + $mimes = get_allowed_mime_types(); + + // Parse url + if ( isset( $enclosure[0] ) && is_string( $enclosure[0] ) ) { + $url = trim( $enclosure[0] ); + } + + // Parse length and type + foreach ( range( 1, 2 ) as $i ) { + if ( isset( $enclosure[ $i ] ) ) { + if ( is_numeric( $enclosure[ $i ] ) ) { + $length = trim( $enclosure[ $i ] ); + } elseif ( in_array( $enclosure[ $i ], $mimes ) ) { + $type = trim( $enclosure[ $i ] ); + } + } + } + + $html_link_tag = sprintf( + "\n", + esc_url( $url ), + esc_attr( $length ), + esc_attr( $type ) + ); /** * Filters the atom enclosure HTML link tag for the current post. * @@ -526,7 +555,7 @@ function atom_enclosure() { * * @param string $html_link_tag The HTML link tag with a URI and other attributes. */ - echo apply_filters( 'atom_enclosure', '' . "\n" ); + echo apply_filters( 'atom_enclosure', $html_link_tag ); } } } diff --git a/tests/phpunit/tests/feed/atom.php b/tests/phpunit/tests/feed/atom.php index 56f15e5d0d..0fe0413233 100644 --- a/tests/phpunit/tests/feed/atom.php +++ b/tests/phpunit/tests/feed/atom.php @@ -205,4 +205,75 @@ class Tests_Feeds_Atom extends WP_UnitTestCase { } } } + + /** + * @test 33591 + */ + function test_atom_enclosure_with_extended_url_length_type_parsing() { + $enclosures = array( + array( + 'actual' => "https://wordpress.dev/wp-content/uploads/2017/09/movie.mp4\n318465\nvideo/mp4", // url length type + 'expected' => array( + 'href' => 'https://wordpress.dev/wp-content/uploads/2017/09/movie.mp4', + 'length' => 318465, + 'type' => 'video/mp4', + ), + ), + array( + 'actual' => "https://wordpress.dev/wp-content/uploads/2017/09/movie.mp4\nvideo/mp4\n318465", // url type length + 'expected' => array( + 'href' => 'https://wordpress.dev/wp-content/uploads/2017/09/movie.mp4', + 'length' => 318465, + 'type' => 'video/mp4', + ), + ), + array( + 'actual' => "https://wordpress.dev/wp-content/uploads/2017/09/movie.mp4\n318465", // url length + 'expected' => array( + 'href' => 'https://wordpress.dev/wp-content/uploads/2017/09/movie.mp4', + 'length' => 318465, + 'type' => '', + ), + ), + array( + 'actual' => "https://wordpress.dev/wp-content/uploads/2017/01/audio.mp3\n\naudio/mpeg", // url type + 'expected' => array( + 'href' => 'https://wordpress.dev/wp-content/uploads/2017/01/audio.mp3', + 'length' => 0, + 'type' => 'audio/mpeg', + ), + ), + array( + 'actual' => 'https://wordpress.dev/wp-content/uploads/2016/01/test.mp4', // url + 'expected' => array( + 'href' => 'https://wordpress.dev/wp-content/uploads/2016/01/test.mp4', + 'length' => 0, + 'type' => '', + ), + ), + ); + + $post_id = end( self::$posts ); + foreach ( $enclosures as $enclosure ) { + add_post_meta( $post_id, 'enclosure', $enclosure['actual'] ); + } + $this->go_to( '/?feed=atom' ); + $feed = $this->do_atom(); + $xml = xml_to_array( $feed ); + $entries = xml_find( $xml, 'feed', 'entry' ); + $entries = array_slice( $entries, 0, 1 ); + + foreach ( $entries as $key => $entry ) { + $links = xml_find( $entries[ $key ]['child'], 'link' ); + $i = 0; + foreach ( (array) $links as $link ) { + if ( 'enclosure' == $link['attributes']['rel'] ) { + $this->assertEquals( $enclosures[ $i ]['expected']['href'], $link['attributes']['href'] ); + $this->assertEquals( $enclosures[ $i ]['expected']['length'], $link['attributes']['length'] ); + $this->assertEquals( $enclosures[ $i ]['expected']['type'], $link['attributes']['type'] ); + $i++; + } + } + } + } }