WordPress Version: 6.2
/**
* Build Magpie object based on RSS from URL.
*
* @since 1.5.0
* @package External
* @subpackage MagpieRSS
*
* @param string $url URL to retrieve feed.
* @return MagpieRSS|false MagpieRSS object on success, false on failure.
*/
function fetch_rss($url)
{
// initialize constants
init();
if (!isset($url)) {
// error("fetch_rss called without a url");
return false;
}
// if cache is disabled
if (!MAGPIE_CACHE_ON) {
// fetch file, and parse it
$resp = _fetch_remote_file($url);
if (is_success($resp->status)) {
return _response_to_rss($resp);
} else {
// error("Failed to fetch $url and cache is off");
return false;
}
} else {
// Flow
// 1. check cache
// 2. if there is a hit, make sure it's fresh
// 3. if cached obj fails freshness check, fetch remote
// 4. if remote fails, return stale object, or error
$cache = new RSSCache(MAGPIE_CACHE_DIR, MAGPIE_CACHE_AGE);
if (MAGPIE_DEBUG and $cache->ERROR) {
debug($cache->ERROR, E_USER_WARNING);
}
$cache_status = 0;
// response of check_cache
$request_headers = array();
// HTTP headers to send with fetch
$rss = 0;
// parsed RSS object
$errormsg = 0;
// errors, if any
if (!$cache->ERROR) {
// return cache HIT, MISS, or STALE
$cache_status = $cache->check_cache($url);
}
// if object cached, and cache is fresh, return cached obj
if ($cache_status == 'HIT') {
$rss = $cache->get($url);
if (isset($rss) and $rss) {
$rss->from_cache = 1;
if (MAGPIE_DEBUG > 1) {
debug("MagpieRSS: Cache HIT", E_USER_NOTICE);
}
return $rss;
}
}
// else attempt a conditional get
// set up headers
if ($cache_status == 'STALE') {
$rss = $cache->get($url);
if (isset($rss->etag) and $rss->last_modified) {
$request_headers['If-None-Match'] = $rss->etag;
$request_headers['If-Last-Modified'] = $rss->last_modified;
}
}
$resp = _fetch_remote_file($url, $request_headers);
if (isset($resp) and $resp) {
if ($resp->status == '304') {
// we have the most current copy
if (MAGPIE_DEBUG > 1) {
debug("Got 304 for {$url}");
}
// reset cache on 304 (at minutillo insistent prodding)
$cache->set($url, $rss);
return $rss;
} elseif (is_success($resp->status)) {
$rss = _response_to_rss($resp);
if ($rss) {
if (MAGPIE_DEBUG > 1) {
debug("Fetch successful");
}
// add object to cache
$cache->set($url, $rss);
return $rss;
}
} else {
$errormsg = "Failed to fetch {$url}. ";
if ($resp->error) {
# compensate for Snoopy's annoying habit to tacking
# on '\n'
$http_error = substr($resp->error, 0, -2);
$errormsg .= "(HTTP Error: {$http_error})";
} else {
$errormsg .= "(HTTP Response: " . $resp->response_code . ')';
}
}
} else {
$errormsg = "Unable to retrieve RSS file for unknown reasons.";
}
// else fetch failed
// attempt to return cached object
if ($rss) {
if (MAGPIE_DEBUG) {
debug("Returning STALE object for {$url}");
}
return $rss;
}
// else we totally failed
// error( $errormsg );
return false;
}
// end if ( !MAGPIE_CACHE_ON ) {
}