<?php /** * Humble HTTP Agent extension for SimplePie_File * * This class is designed to extend and override SimplePie_File * in order to prevent duplicate HTTP requests being sent out. * The idea is to initialise an instance of Humble HTTP Agent * and attach it, to a static class variable, of this class. * SimplePie will then automatically initialise this class * * @date 2011-02-28 */ class SimplePie_HumbleHttpAgent extends SimplePie_File { protected static $agent; var $url; var $useragent; var $success = true; var $headers = array(); var $body; var $status_code; var $redirects = 0; var $error; var $method = SIMPLEPIE_FILE_SOURCE_NONE; public static function set_agent(HumbleHttpAgent $agent) { self::$agent = $agent; } public function __construct($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false) { if (class_exists('idna_convert')) { $idn = new idna_convert(); $parsed = SimplePie_Misc::parse_url($url); $url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']); } $this->url = $url; $this->useragent = $useragent; if (preg_match('/^http(s)?:\/\//i', $url)) { if (!is_array($headers)) { $headers = array(); } $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_CURL; $headers2 = array(); foreach ($headers as $key => $value) { $headers2[] = "$key: $value"; } //TODO: allow for HTTP headers // curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2); $response = self::$agent->get($url); if ($response === false || !isset($response['status_code'])) { $this->error = 'failed to fetch URL'; $this->success = false; } else { // The extra lines at the end are there to satisfy SimplePie's HTTP parser. // The class expects a full HTTP message, whereas we're giving it only // headers - the new lines indicate the start of the body. $parser = new SimplePie_HTTP_Parser($response['headers']."\r\n\r\n"); if ($parser->parse()) { $this->headers = $parser->headers; //$this->body = $parser->body; $this->body = $response['body']; $this->status_code = $parser->status_code; } } } else { $this->error = 'invalid URL'; $this->success = false; } } } ?>