Index: wp-includes/rss.php
===================================================================
--- wp-includes/rss.php	(revision 5098)
+++ wp-includes/rss.php	(working copy)
@@ -502,6 +502,133 @@
 	} // end if ( !MAGPIE_CACHE_ON ) {
 } // end fetch_rss()
 
+function fetch_rss_timeout ($url, $timeout = false ) {
+	// initialize constants
+	init();
+
+	if ( !isset($url) ) {
+		// error("fetch_rss_timeout called without a url");
+		return false;
+	}
+
+	// if cache is disabled
+	if ( !MAGPIE_CACHE_ON || $timeout === 0) {
+		// 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 cache is ON
+	else {
+		// Flow
+		// 1. check cache using either MAGPIE_CACHE_AGE, or $timeout if set a
+		// 2. if there is a hit, make sure its 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, ( $timeout === false ? MAGPIE_CACHE_AGE : (int)$timeout ) );
+
+		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
+
+		// setup headers
+		if ( $cache_status == 'STALE' ) {
+			$rss = $cache->get( $url );
+			if ( $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 habbit 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 ) {
+} // end fetch_rss_timeout()
+
 function _fetch_remote_file ($url, $headers = "" ) {
 	// Snoopy is an HTTP client in PHP
 	$client = new Snoopy();
