2014-05-22 14:16:38 +00:00
|
|
|
<?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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|