<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[60490] trunk: External Libraries: Upgrade Simple Pie to 1.8.1 (patched).</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/60490">60490</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/60490","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>peterwilsoncc</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2025-07-21 01:39:41 +0000 (Mon, 21 Jul 2025)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>External Libraries: Upgrade Simple Pie to 1.8.1 (patched).

Upgrades the Simple Pie library to a patched version of [https://github.com/simplepie/simplepie/releases/tag/1.8.1 Simple Pie 1.8.1]. Much of 1.8.1 was included in the 1.8.0 upgrade committed in <a href="https://core.trac.wordpress.org/changeset/59141">r59141</a>. The following fixes from the latest release those that remain for this upgrade:

* Fix locator with website missing `Content-Type` header [https://github.com/simplepie/simplepie/pull/891 simplepie/simplepie<a href="https://core.trac.wordpress.org/ticket/891">#891</a>]
* Fix `encode` argument of `SimplePie::strip_htmltags()` [https://github.com/simplepie/simplepie/pull/894 simplepie/simplepie<a href="https://core.trac.wordpress.org/ticket/894">#894</a>]

A caching fix not included in Simple Pie 1.8.1 is also included in this upgrade, see [https://github.com/simplepie/simplepie/pull/883 simplepie/simplepie<a href="https://core.trac.wordpress.org/ticket/883">#883</a>].

A caching test for `fetch_feed()` is introduced in this pull request to ensure that the caching patch is included in future upgrades of the library.

Props kaygee79, oglekler, SergeyBiryukov, peterwilsoncc.
Fixes <a href="https://core.trac.wordpress.org/ticket/63717">#63717</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpincludesSimplePiesrcSimplePiephp">trunk/src/wp-includes/SimplePie/src/SimplePie.php</a></li>
<li><a href="#trunktestsphpunittestsfeedfetchFeedphp">trunk/tests/phpunit/tests/feed/fetchFeed.php</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunksrcwpincludesSimplePiesrcCorephp">trunk/src/wp-includes/SimplePie/src/Core.php</a></li>
<li><a href="#trunksrcwpincludesSimplePiesrcDecodeHTMLEntitiesphp">trunk/src/wp-includes/SimplePie/src/Decode/HTML/Entities.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpincludesSimplePiesrcCorephp"></a>
<div class="delfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Deleted: trunk/src/wp-includes/SimplePie/src/Core.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/SimplePie/src/Core.php      2025-07-20 15:04:37 UTC (rev 60489)
+++ trunk/src/wp-includes/SimplePie/src/Core.php        2025-07-21 01:39:41 UTC (rev 60490)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1,56 +0,0 @@
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-<?php
-/**
- * SimplePie
- *
- * A PHP-Based RSS and Atom Feed Framework.
- * Takes the hard work out of managing a complete RSS/Atom solution.
- *
- * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- *     * Redistributions of source code must retain the above copyright notice, this list of
- *       conditions and the following disclaimer.
- *
- *     * Redistributions in binary form must reproduce the above copyright notice, this list
- *       of conditions and the following disclaimer in the documentation and/or other materials
- *       provided with the distribution.
- *
- *     * Neither the name of the SimplePie Team nor the names of its contributors may be used
- *       to endorse or promote products derived from this software without specific prior
- *       written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
- * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
- * @author Ryan Parman
- * @author Sam Sneddon
- * @author Ryan McCue
- * @link http://simplepie.org/ SimplePie
- * @license http://www.opensource.org/licenses/bsd-license.php BSD License
- */
-
-/**
- * SimplePie class.
- *
- * Class for backward compatibility.
- *
- * @deprecated Use {@see SimplePie} directly
- * @package SimplePie
- * @subpackage API
- */
-class SimplePie_Core extends SimplePie
-{
-
-}
</del><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of file
</span></span></pre></div>
<a id="trunksrcwpincludesSimplePiesrcDecodeHTMLEntitiesphp"></a>
<div class="delfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Deleted: trunk/src/wp-includes/SimplePie/src/Decode/HTML/Entities.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/SimplePie/src/Decode/HTML/Entities.php      2025-07-20 15:04:37 UTC (rev 60489)
+++ trunk/src/wp-includes/SimplePie/src/Decode/HTML/Entities.php        2025-07-21 01:39:41 UTC (rev 60490)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1,610 +0,0 @@
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-<?php
-/**
- * SimplePie
- *
- * A PHP-Based RSS and Atom Feed Framework.
- * Takes the hard work out of managing a complete RSS/Atom solution.
- *
- * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- *     * Redistributions of source code must retain the above copyright notice, this list of
- *       conditions and the following disclaimer.
- *
- *     * Redistributions in binary form must reproduce the above copyright notice, this list
- *       of conditions and the following disclaimer in the documentation and/or other materials
- *       provided with the distribution.
- *
- *     * Neither the name of the SimplePie Team nor the names of its contributors may be used
- *       to endorse or promote products derived from this software without specific prior
- *       written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
- * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
- * @author Ryan Parman
- * @author Sam Sneddon
- * @author Ryan McCue
- * @link http://simplepie.org/ SimplePie
- * @license http://www.opensource.org/licenses/bsd-license.php BSD License
- */
-
-
-/**
- * Decode HTML Entities
- *
- * This implements HTML5 as of revision 967 (2007-06-28)
- *
- * @deprecated Use DOMDocument instead!
- * @package SimplePie
- */
-class SimplePie_Decode_HTML_Entities
-{
-       /**
-        * Data to be parsed
-        *
-        * @access private
-        * @var string
-        */
-       var $data = '';
-
-       /**
-        * Currently consumed bytes
-        *
-        * @access private
-        * @var string
-        */
-       var $consumed = '';
-
-       /**
-        * Position of the current byte being parsed
-        *
-        * @access private
-        * @var int
-        */
-       var $position = 0;
-
-       /**
-        * Create an instance of the class with the input data
-        *
-        * @access public
-        * @param string $data Input data
-        */
-       public function __construct($data)
-       {
-               $this->data = $data;
-       }
-
-       /**
-        * Parse the input data
-        *
-        * @access public
-        * @return string Output data
-        */
-       public function parse()
-       {
-               while (($this->position = strpos($this->data, '&', $this->position)) !== false)
-               {
-                       $this->consume();
-                       $this->entity();
-                       $this->consumed = '';
-               }
-               return $this->data;
-       }
-
-       /**
-        * Consume the next byte
-        *
-        * @access private
-        * @return mixed The next byte, or false, if there is no more data
-        */
-       public function consume()
-       {
-               if (isset($this->data[$this->position]))
-               {
-                       $this->consumed .= $this->data[$this->position];
-                       return $this->data[$this->position++];
-               }
-
-               return false;
-       }
-
-       /**
-        * Consume a range of characters
-        *
-        * @access private
-        * @param string $chars Characters to consume
-        * @return mixed A series of characters that match the range, or false
-        */
-       public function consume_range($chars)
-       {
-               if ($len = strspn($this->data, $chars, $this->position))
-               {
-                       $data = substr($this->data, $this->position, $len);
-                       $this->consumed .= $data;
-                       $this->position += $len;
-                       return $data;
-               }
-
-               return false;
-       }
-
-       /**
-        * Unconsume one byte
-        *
-        * @access private
-        */
-       public function unconsume()
-       {
-               $this->consumed = substr($this->consumed, 0, -1);
-               $this->position--;
-       }
-
-       /**
-        * Decode an entity
-        *
-        * @access private
-        */
-       public function entity()
-       {
-               switch ($this->consume())
-               {
-                       case "\x09":
-                       case "\x0A":
-                       case "\x0B":
-                       case "\x0C":
-                       case "\x20":
-                       case "\x3C":
-                       case "\x26":
-                       case false:
-                               break;
-
-                       case "\x23":
-                               switch ($this->consume())
-                               {
-                                       case "\x78":
-                                       case "\x58":
-                                               $range = '0123456789ABCDEFabcdef';
-                                               $hex = true;
-                                               break;
-
-                                       default:
-                                               $range = '0123456789';
-                                               $hex = false;
-                                               $this->unconsume();
-                                               break;
-                               }
-
-                               if ($codepoint = $this->consume_range($range))
-                               {
-                                       static $windows_1252_specials = array(0x0D => "\x0A", 0x80 => "\xE2\x82\xAC", 0x81 => "\xEF\xBF\xBD", 0x82 => "\xE2\x80\x9A", 0x83 => "\xC6\x92", 0x84 => "\xE2\x80\x9E", 0x85 => "\xE2\x80\xA6", 0x86 => "\xE2\x80\xA0", 0x87 => "\xE2\x80\xA1", 0x88 => "\xCB\x86", 0x89 => "\xE2\x80\xB0", 0x8A => "\xC5\xA0", 0x8B => "\xE2\x80\xB9", 0x8C => "\xC5\x92", 0x8D => "\xEF\xBF\xBD", 0x8E => "\xC5\xBD", 0x8F => "\xEF\xBF\xBD", 0x90 => "\xEF\xBF\xBD", 0x91 => "\xE2\x80\x98", 0x92 => "\xE2\x80\x99", 0x93 => "\xE2\x80\x9C", 0x94 => "\xE2\x80\x9D", 0x95 => "\xE2\x80\xA2", 0x96 => "\xE2\x80\x93", 0x97 => "\xE2\x80\x94", 0x98 => "\xCB\x9C", 0x99 => "\xE2\x8
 4\xA2", 0x9A => "\xC5\xA1", 0x9B => "\xE2\x80\xBA", 0x9C => "\xC5\x93", 0x9D => "\xEF\xBF\xBD", 0x9E => "\xC5\xBE", 0x9F => "\xC5\xB8");
-
-                                       if ($hex)
-                                       {
-                                               $codepoint = hexdec($codepoint);
-                                       }
-                                       else
-                                       {
-                                               $codepoint = intval($codepoint);
-                                       }
-
-                                       if (isset($windows_1252_specials[$codepoint]))
-                                       {
-                                               $replacement = $windows_1252_specials[$codepoint];
-                                       }
-                                       else
-                                       {
-                                               $replacement = SimplePie_Misc::codepoint_to_utf8($codepoint);
-                                       }
-
-                                       if (!in_array($this->consume(), array(';', false), true))
-                                       {
-                                               $this->unconsume();
-                                       }
-
-                                       $consumed_length = strlen($this->consumed);
-                                       $this->data = substr_replace($this->data, $replacement, $this->position - $consumed_length, $consumed_length);
-                                       $this->position += strlen($replacement) - $consumed_length;
-                               }
-                               break;
-
-                       default:
-                               static $entities = array(
-                                       'Aacute' => "\xC3\x81",
-                                       'aacute' => "\xC3\xA1",
-                                       'Aacute;' => "\xC3\x81",
-                                       'aacute;' => "\xC3\xA1",
-                                       'Acirc' => "\xC3\x82",
-                                       'acirc' => "\xC3\xA2",
-                                       'Acirc;' => "\xC3\x82",
-                                       'acirc;' => "\xC3\xA2",
-                                       'acute' => "\xC2\xB4",
-                                       'acute;' => "\xC2\xB4",
-                                       'AElig' => "\xC3\x86",
-                                       'aelig' => "\xC3\xA6",
-                                       'AElig;' => "\xC3\x86",
-                                       'aelig;' => "\xC3\xA6",
-                                       'Agrave' => "\xC3\x80",
-                                       'agrave' => "\xC3\xA0",
-                                       'Agrave;' => "\xC3\x80",
-                                       'agrave;' => "\xC3\xA0",
-                                       'alefsym;' => "\xE2\x84\xB5",
-                                       'Alpha;' => "\xCE\x91",
-                                       'alpha;' => "\xCE\xB1",
-                                       'AMP' => "\x26",
-                                       'amp' => "\x26",
-                                       'AMP;' => "\x26",
-                                       'amp;' => "\x26",
-                                       'and;' => "\xE2\x88\xA7",
-                                       'ang;' => "\xE2\x88\xA0",
-                                       'apos;' => "\x27",
-                                       'Aring' => "\xC3\x85",
-                                       'aring' => "\xC3\xA5",
-                                       'Aring;' => "\xC3\x85",
-                                       'aring;' => "\xC3\xA5",
-                                       'asymp;' => "\xE2\x89\x88",
-                                       'Atilde' => "\xC3\x83",
-                                       'atilde' => "\xC3\xA3",
-                                       'Atilde;' => "\xC3\x83",
-                                       'atilde;' => "\xC3\xA3",
-                                       'Auml' => "\xC3\x84",
-                                       'auml' => "\xC3\xA4",
-                                       'Auml;' => "\xC3\x84",
-                                       'auml;' => "\xC3\xA4",
-                                       'bdquo;' => "\xE2\x80\x9E",
-                                       'Beta;' => "\xCE\x92",
-                                       'beta;' => "\xCE\xB2",
-                                       'brvbar' => "\xC2\xA6",
-                                       'brvbar;' => "\xC2\xA6",
-                                       'bull;' => "\xE2\x80\xA2",
-                                       'cap;' => "\xE2\x88\xA9",
-                                       'Ccedil' => "\xC3\x87",
-                                       'ccedil' => "\xC3\xA7",
-                                       'Ccedil;' => "\xC3\x87",
-                                       'ccedil;' => "\xC3\xA7",
-                                       'cedil' => "\xC2\xB8",
-                                       'cedil;' => "\xC2\xB8",
-                                       'cent' => "\xC2\xA2",
-                                       'cent;' => "\xC2\xA2",
-                                       'Chi;' => "\xCE\xA7",
-                                       'chi;' => "\xCF\x87",
-                                       'circ;' => "\xCB\x86",
-                                       'clubs;' => "\xE2\x99\xA3",
-                                       'cong;' => "\xE2\x89\x85",
-                                       'COPY' => "\xC2\xA9",
-                                       'copy' => "\xC2\xA9",
-                                       'COPY;' => "\xC2\xA9",
-                                       'copy;' => "\xC2\xA9",
-                                       'crarr;' => "\xE2\x86\xB5",
-                                       'cup;' => "\xE2\x88\xAA",
-                                       'curren' => "\xC2\xA4",
-                                       'curren;' => "\xC2\xA4",
-                                       'Dagger;' => "\xE2\x80\xA1",
-                                       'dagger;' => "\xE2\x80\xA0",
-                                       'dArr;' => "\xE2\x87\x93",
-                                       'darr;' => "\xE2\x86\x93",
-                                       'deg' => "\xC2\xB0",
-                                       'deg;' => "\xC2\xB0",
-                                       'Delta;' => "\xCE\x94",
-                                       'delta;' => "\xCE\xB4",
-                                       'diams;' => "\xE2\x99\xA6",
-                                       'divide' => "\xC3\xB7",
-                                       'divide;' => "\xC3\xB7",
-                                       'Eacute' => "\xC3\x89",
-                                       'eacute' => "\xC3\xA9",
-                                       'Eacute;' => "\xC3\x89",
-                                       'eacute;' => "\xC3\xA9",
-                                       'Ecirc' => "\xC3\x8A",
-                                       'ecirc' => "\xC3\xAA",
-                                       'Ecirc;' => "\xC3\x8A",
-                                       'ecirc;' => "\xC3\xAA",
-                                       'Egrave' => "\xC3\x88",
-                                       'egrave' => "\xC3\xA8",
-                                       'Egrave;' => "\xC3\x88",
-                                       'egrave;' => "\xC3\xA8",
-                                       'empty;' => "\xE2\x88\x85",
-                                       'emsp;' => "\xE2\x80\x83",
-                                       'ensp;' => "\xE2\x80\x82",
-                                       'Epsilon;' => "\xCE\x95",
-                                       'epsilon;' => "\xCE\xB5",
-                                       'equiv;' => "\xE2\x89\xA1",
-                                       'Eta;' => "\xCE\x97",
-                                       'eta;' => "\xCE\xB7",
-                                       'ETH' => "\xC3\x90",
-                                       'eth' => "\xC3\xB0",
-                                       'ETH;' => "\xC3\x90",
-                                       'eth;' => "\xC3\xB0",
-                                       'Euml' => "\xC3\x8B",
-                                       'euml' => "\xC3\xAB",
-                                       'Euml;' => "\xC3\x8B",
-                                       'euml;' => "\xC3\xAB",
-                                       'euro;' => "\xE2\x82\xAC",
-                                       'exist;' => "\xE2\x88\x83",
-                                       'fnof;' => "\xC6\x92",
-                                       'forall;' => "\xE2\x88\x80",
-                                       'frac12' => "\xC2\xBD",
-                                       'frac12;' => "\xC2\xBD",
-                                       'frac14' => "\xC2\xBC",
-                                       'frac14;' => "\xC2\xBC",
-                                       'frac34' => "\xC2\xBE",
-                                       'frac34;' => "\xC2\xBE",
-                                       'frasl;' => "\xE2\x81\x84",
-                                       'Gamma;' => "\xCE\x93",
-                                       'gamma;' => "\xCE\xB3",
-                                       'ge;' => "\xE2\x89\xA5",
-                                       'GT' => "\x3E",
-                                       'gt' => "\x3E",
-                                       'GT;' => "\x3E",
-                                       'gt;' => "\x3E",
-                                       'hArr;' => "\xE2\x87\x94",
-                                       'harr;' => "\xE2\x86\x94",
-                                       'hearts;' => "\xE2\x99\xA5",
-                                       'hellip;' => "\xE2\x80\xA6",
-                                       'Iacute' => "\xC3\x8D",
-                                       'iacute' => "\xC3\xAD",
-                                       'Iacute;' => "\xC3\x8D",
-                                       'iacute;' => "\xC3\xAD",
-                                       'Icirc' => "\xC3\x8E",
-                                       'icirc' => "\xC3\xAE",
-                                       'Icirc;' => "\xC3\x8E",
-                                       'icirc;' => "\xC3\xAE",
-                                       'iexcl' => "\xC2\xA1",
-                                       'iexcl;' => "\xC2\xA1",
-                                       'Igrave' => "\xC3\x8C",
-                                       'igrave' => "\xC3\xAC",
-                                       'Igrave;' => "\xC3\x8C",
-                                       'igrave;' => "\xC3\xAC",
-                                       'image;' => "\xE2\x84\x91",
-                                       'infin;' => "\xE2\x88\x9E",
-                                       'int;' => "\xE2\x88\xAB",
-                                       'Iota;' => "\xCE\x99",
-                                       'iota;' => "\xCE\xB9",
-                                       'iquest' => "\xC2\xBF",
-                                       'iquest;' => "\xC2\xBF",
-                                       'isin;' => "\xE2\x88\x88",
-                                       'Iuml' => "\xC3\x8F",
-                                       'iuml' => "\xC3\xAF",
-                                       'Iuml;' => "\xC3\x8F",
-                                       'iuml;' => "\xC3\xAF",
-                                       'Kappa;' => "\xCE\x9A",
-                                       'kappa;' => "\xCE\xBA",
-                                       'Lambda;' => "\xCE\x9B",
-                                       'lambda;' => "\xCE\xBB",
-                                       'lang;' => "\xE3\x80\x88",
-                                       'laquo' => "\xC2\xAB",
-                                       'laquo;' => "\xC2\xAB",
-                                       'lArr;' => "\xE2\x87\x90",
-                                       'larr;' => "\xE2\x86\x90",
-                                       'lceil;' => "\xE2\x8C\x88",
-                                       'ldquo;' => "\xE2\x80\x9C",
-                                       'le;' => "\xE2\x89\xA4",
-                                       'lfloor;' => "\xE2\x8C\x8A",
-                                       'lowast;' => "\xE2\x88\x97",
-                                       'loz;' => "\xE2\x97\x8A",
-                                       'lrm;' => "\xE2\x80\x8E",
-                                       'lsaquo;' => "\xE2\x80\xB9",
-                                       'lsquo;' => "\xE2\x80\x98",
-                                       'LT' => "\x3C",
-                                       'lt' => "\x3C",
-                                       'LT;' => "\x3C",
-                                       'lt;' => "\x3C",
-                                       'macr' => "\xC2\xAF",
-                                       'macr;' => "\xC2\xAF",
-                                       'mdash;' => "\xE2\x80\x94",
-                                       'micro' => "\xC2\xB5",
-                                       'micro;' => "\xC2\xB5",
-                                       'middot' => "\xC2\xB7",
-                                       'middot;' => "\xC2\xB7",
-                                       'minus;' => "\xE2\x88\x92",
-                                       'Mu;' => "\xCE\x9C",
-                                       'mu;' => "\xCE\xBC",
-                                       'nabla;' => "\xE2\x88\x87",
-                                       'nbsp' => "\xC2\xA0",
-                                       'nbsp;' => "\xC2\xA0",
-                                       'ndash;' => "\xE2\x80\x93",
-                                       'ne;' => "\xE2\x89\xA0",
-                                       'ni;' => "\xE2\x88\x8B",
-                                       'not' => "\xC2\xAC",
-                                       'not;' => "\xC2\xAC",
-                                       'notin;' => "\xE2\x88\x89",
-                                       'nsub;' => "\xE2\x8A\x84",
-                                       'Ntilde' => "\xC3\x91",
-                                       'ntilde' => "\xC3\xB1",
-                                       'Ntilde;' => "\xC3\x91",
-                                       'ntilde;' => "\xC3\xB1",
-                                       'Nu;' => "\xCE\x9D",
-                                       'nu;' => "\xCE\xBD",
-                                       'Oacute' => "\xC3\x93",
-                                       'oacute' => "\xC3\xB3",
-                                       'Oacute;' => "\xC3\x93",
-                                       'oacute;' => "\xC3\xB3",
-                                       'Ocirc' => "\xC3\x94",
-                                       'ocirc' => "\xC3\xB4",
-                                       'Ocirc;' => "\xC3\x94",
-                                       'ocirc;' => "\xC3\xB4",
-                                       'OElig;' => "\xC5\x92",
-                                       'oelig;' => "\xC5\x93",
-                                       'Ograve' => "\xC3\x92",
-                                       'ograve' => "\xC3\xB2",
-                                       'Ograve;' => "\xC3\x92",
-                                       'ograve;' => "\xC3\xB2",
-                                       'oline;' => "\xE2\x80\xBE",
-                                       'Omega;' => "\xCE\xA9",
-                                       'omega;' => "\xCF\x89",
-                                       'Omicron;' => "\xCE\x9F",
-                                       'omicron;' => "\xCE\xBF",
-                                       'oplus;' => "\xE2\x8A\x95",
-                                       'or;' => "\xE2\x88\xA8",
-                                       'ordf' => "\xC2\xAA",
-                                       'ordf;' => "\xC2\xAA",
-                                       'ordm' => "\xC2\xBA",
-                                       'ordm;' => "\xC2\xBA",
-                                       'Oslash' => "\xC3\x98",
-                                       'oslash' => "\xC3\xB8",
-                                       'Oslash;' => "\xC3\x98",
-                                       'oslash;' => "\xC3\xB8",
-                                       'Otilde' => "\xC3\x95",
-                                       'otilde' => "\xC3\xB5",
-                                       'Otilde;' => "\xC3\x95",
-                                       'otilde;' => "\xC3\xB5",
-                                       'otimes;' => "\xE2\x8A\x97",
-                                       'Ouml' => "\xC3\x96",
-                                       'ouml' => "\xC3\xB6",
-                                       'Ouml;' => "\xC3\x96",
-                                       'ouml;' => "\xC3\xB6",
-                                       'para' => "\xC2\xB6",
-                                       'para;' => "\xC2\xB6",
-                                       'part;' => "\xE2\x88\x82",
-                                       'permil;' => "\xE2\x80\xB0",
-                                       'perp;' => "\xE2\x8A\xA5",
-                                       'Phi;' => "\xCE\xA6",
-                                       'phi;' => "\xCF\x86",
-                                       'Pi;' => "\xCE\xA0",
-                                       'pi;' => "\xCF\x80",
-                                       'piv;' => "\xCF\x96",
-                                       'plusmn' => "\xC2\xB1",
-                                       'plusmn;' => "\xC2\xB1",
-                                       'pound' => "\xC2\xA3",
-                                       'pound;' => "\xC2\xA3",
-                                       'Prime;' => "\xE2\x80\xB3",
-                                       'prime;' => "\xE2\x80\xB2",
-                                       'prod;' => "\xE2\x88\x8F",
-                                       'prop;' => "\xE2\x88\x9D",
-                                       'Psi;' => "\xCE\xA8",
-                                       'psi;' => "\xCF\x88",
-                                       'QUOT' => "\x22",
-                                       'quot' => "\x22",
-                                       'QUOT;' => "\x22",
-                                       'quot;' => "\x22",
-                                       'radic;' => "\xE2\x88\x9A",
-                                       'rang;' => "\xE3\x80\x89",
-                                       'raquo' => "\xC2\xBB",
-                                       'raquo;' => "\xC2\xBB",
-                                       'rArr;' => "\xE2\x87\x92",
-                                       'rarr;' => "\xE2\x86\x92",
-                                       'rceil;' => "\xE2\x8C\x89",
-                                       'rdquo;' => "\xE2\x80\x9D",
-                                       'real;' => "\xE2\x84\x9C",
-                                       'REG' => "\xC2\xAE",
-                                       'reg' => "\xC2\xAE",
-                                       'REG;' => "\xC2\xAE",
-                                       'reg;' => "\xC2\xAE",
-                                       'rfloor;' => "\xE2\x8C\x8B",
-                                       'Rho;' => "\xCE\xA1",
-                                       'rho;' => "\xCF\x81",
-                                       'rlm;' => "\xE2\x80\x8F",
-                                       'rsaquo;' => "\xE2\x80\xBA",
-                                       'rsquo;' => "\xE2\x80\x99",
-                                       'sbquo;' => "\xE2\x80\x9A",
-                                       'Scaron;' => "\xC5\xA0",
-                                       'scaron;' => "\xC5\xA1",
-                                       'sdot;' => "\xE2\x8B\x85",
-                                       'sect' => "\xC2\xA7",
-                                       'sect;' => "\xC2\xA7",
-                                       'shy' => "\xC2\xAD",
-                                       'shy;' => "\xC2\xAD",
-                                       'Sigma;' => "\xCE\xA3",
-                                       'sigma;' => "\xCF\x83",
-                                       'sigmaf;' => "\xCF\x82",
-                                       'sim;' => "\xE2\x88\xBC",
-                                       'spades;' => "\xE2\x99\xA0",
-                                       'sub;' => "\xE2\x8A\x82",
-                                       'sube;' => "\xE2\x8A\x86",
-                                       'sum;' => "\xE2\x88\x91",
-                                       'sup;' => "\xE2\x8A\x83",
-                                       'sup1' => "\xC2\xB9",
-                                       'sup1;' => "\xC2\xB9",
-                                       'sup2' => "\xC2\xB2",
-                                       'sup2;' => "\xC2\xB2",
-                                       'sup3' => "\xC2\xB3",
-                                       'sup3;' => "\xC2\xB3",
-                                       'supe;' => "\xE2\x8A\x87",
-                                       'szlig' => "\xC3\x9F",
-                                       'szlig;' => "\xC3\x9F",
-                                       'Tau;' => "\xCE\xA4",
-                                       'tau;' => "\xCF\x84",
-                                       'there4;' => "\xE2\x88\xB4",
-                                       'Theta;' => "\xCE\x98",
-                                       'theta;' => "\xCE\xB8",
-                                       'thetasym;' => "\xCF\x91",
-                                       'thinsp;' => "\xE2\x80\x89",
-                                       'THORN' => "\xC3\x9E",
-                                       'thorn' => "\xC3\xBE",
-                                       'THORN;' => "\xC3\x9E",
-                                       'thorn;' => "\xC3\xBE",
-                                       'tilde;' => "\xCB\x9C",
-                                       'times' => "\xC3\x97",
-                                       'times;' => "\xC3\x97",
-                                       'TRADE;' => "\xE2\x84\xA2",
-                                       'trade;' => "\xE2\x84\xA2",
-                                       'Uacute' => "\xC3\x9A",
-                                       'uacute' => "\xC3\xBA",
-                                       'Uacute;' => "\xC3\x9A",
-                                       'uacute;' => "\xC3\xBA",
-                                       'uArr;' => "\xE2\x87\x91",
-                                       'uarr;' => "\xE2\x86\x91",
-                                       'Ucirc' => "\xC3\x9B",
-                                       'ucirc' => "\xC3\xBB",
-                                       'Ucirc;' => "\xC3\x9B",
-                                       'ucirc;' => "\xC3\xBB",
-                                       'Ugrave' => "\xC3\x99",
-                                       'ugrave' => "\xC3\xB9",
-                                       'Ugrave;' => "\xC3\x99",
-                                       'ugrave;' => "\xC3\xB9",
-                                       'uml' => "\xC2\xA8",
-                                       'uml;' => "\xC2\xA8",
-                                       'upsih;' => "\xCF\x92",
-                                       'Upsilon;' => "\xCE\xA5",
-                                       'upsilon;' => "\xCF\x85",
-                                       'Uuml' => "\xC3\x9C",
-                                       'uuml' => "\xC3\xBC",
-                                       'Uuml;' => "\xC3\x9C",
-                                       'uuml;' => "\xC3\xBC",
-                                       'weierp;' => "\xE2\x84\x98",
-                                       'Xi;' => "\xCE\x9E",
-                                       'xi;' => "\xCE\xBE",
-                                       'Yacute' => "\xC3\x9D",
-                                       'yacute' => "\xC3\xBD",
-                                       'Yacute;' => "\xC3\x9D",
-                                       'yacute;' => "\xC3\xBD",
-                                       'yen' => "\xC2\xA5",
-                                       'yen;' => "\xC2\xA5",
-                                       'yuml' => "\xC3\xBF",
-                                       'Yuml;' => "\xC5\xB8",
-                                       'yuml;' => "\xC3\xBF",
-                                       'Zeta;' => "\xCE\x96",
-                                       'zeta;' => "\xCE\xB6",
-                                       'zwj;' => "\xE2\x80\x8D",
-                                       'zwnj;' => "\xE2\x80\x8C"
-                               );
-
-                               for ($i = 0, $match = null; $i < 9 && $this->consume() !== false; $i++)
-                               {
-                                       $consumed = substr($this->consumed, 1);
-                                       if (isset($entities[$consumed]))
-                                       {
-                                               $match = $consumed;
-                                       }
-                               }
-
-                               if ($match !== null)
-                               {
-                                       $this->data = substr_replace($this->data, $entities[$match], $this->position - strlen($consumed) - 1, strlen($match) + 1);
-                                       $this->position += strlen($entities[$match]) - strlen($consumed) - 1;
-                               }
-                               break;
-               }
-       }
-}
</del></span></pre></div>
<a id="trunksrcwpincludesSimplePiesrcSimplePiephp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/SimplePie/src/SimplePie.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/SimplePie/src/SimplePie.php 2025-07-20 15:04:37 UTC (rev 60489)
+++ trunk/src/wp-includes/SimplePie/src/SimplePie.php   2025-07-21 01:39:41 UTC (rev 60490)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -70,7 +70,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * SimplePie Version
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    public const VERSION = '1.8.0';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+    public const VERSION = '1.8.1';
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * SimplePie Website URL
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1373,7 +1373,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         $this->sanitize->strip_htmltags($tags);
</span><span class="cx" style="display: block; padding: 0 10px">         if ($encode !== null) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            $this->sanitize->encode_instead_of_strip($tags);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            $this->sanitize->encode_instead_of_strip($encode);
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1756,7 +1756,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                     $this->data = [];
</span><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px">                 // Check if the cache has been updated
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                elseif (isset($this->data['cache_expiration_time']) && $this->data['cache_expiration_time'] > time()) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                elseif (!isset($this->data['cache_expiration_time']) || $this->data['cache_expiration_time'] < time()) {
</ins><span class="cx" style="display: block; padding: 0 10px">                     // Want to know if we tried to send last-modified and/or etag headers
</span><span class="cx" style="display: block; padding: 0 10px">                     // when requesting this file. (Note that it's up to the file to
</span><span class="cx" style="display: block; padding: 0 10px">                     // support this, but we don't always send the headers either.)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1831,7 +1831,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">             if (!$locate->is_feed($file)) {
</span><span class="cx" style="display: block; padding: 0 10px">                 $copyStatusCode = $file->status_code;
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $copyContentType = $file->headers['content-type'];
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                $copyContentType = $file->headers['content-type'] ?? '';
</ins><span class="cx" style="display: block; padding: 0 10px">                 try {
</span><span class="cx" style="display: block; padding: 0 10px">                     $microformats = false;
</span><span class="cx" style="display: block; padding: 0 10px">                     if (class_exists('DOMXpath') && function_exists('Mf2\parse')) {
</span></span></pre></div>
<a id="trunktestsphpunittestsfeedfetchFeedphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/feed/fetchFeed.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/feed/fetchFeed.php      2025-07-20 15:04:37 UTC (rev 60489)
+++ trunk/tests/phpunit/tests/feed/fetchFeed.php        2025-07-21 01:39:41 UTC (rev 60490)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -33,6 +33,42 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertStringContainsString( '<a href="https://learn.wordpress.org/">Learn WordPress</a> is a learning resource providing workshops, quizzes, courses, lesson plans, and discussion groups so that anyone, from beginners to advanced users, can learn to do more with WordPress.', $content );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Ensure that fetch_feed() is cached on second and subsequent calls.
+        *
+        * Note: The HTTP request is mocked on the `pre_http_request` filter so
+        * this test doesn't make any HTTP requests so it doesn't need to be
+        * placed in the external-http group.
+        *
+        * @ticket 63717
+        *
+        * @group feed
+        *
+        * @covers ::fetch_feed
+        */
+       public function test_fetch_feed_cached() {
+               $filter = new MockAction();
+               add_filter( 'pre_http_request', array( $filter, 'filter' ) );
+
+               fetch_feed( 'https://wordpress.org/news/feed/' );
+               $this->assertEquals( 1, $filter->get_call_count(), 'The feed should be fetched on the first call.' );
+
+               fetch_feed( 'https://wordpress.org/news/feed/' );
+               $this->assertEquals( 1, $filter->get_call_count(), 'The feed should be cached on the second call. For SP 1.8.x upgrades, backport simplepie/simplepie#830 to resolve.' );
+       }
+
+       /**
+        * Mock response for `fetch_feed()`.
+        *
+        * This simulates a response from WordPress.org's server for the news feed
+        * to avoid making actual HTTP requests during the tests.
+        *
+        * The method runs on the `pre_http_request` filter, a low level filter
+        * to allow developers to determine whether a request would have been made
+        * under normal circumstances.
+        *
+        * @return array Mocked response data.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function mocked_rss_response() {
</span><span class="cx" style="display: block; padding: 0 10px">                $single_value_headers = array(
</span><span class="cx" style="display: block; padding: 0 10px">                        'Content-Type' => 'application/rss+xml; charset=UTF-8',
</span></span></pre>
</div>
</div>

</body>
</html>