Advertisements

fetch_rss

Definition:
function fetch_rss ($url) {}

Build Magpie object based on RSS from URL.

Parameters

  • string $url: URL to retrieve feed

Return values

returns:false on failure or MagpieRSS object on success.

Source code

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 cache is ON

	else {

		// Flow

		// 1. check cache

		// 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, 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 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()

1062

Advertisements

No comments yet... Be the first to leave a reply!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: