124 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						||
/* vim: set expandtab tabstop=4 shiftwidth=4: */
 | 
						||
// +----------------------------------------------------------------------+
 | 
						||
// | PHP version 4                                                        |
 | 
						||
// +----------------------------------------------------------------------+
 | 
						||
// | Copyright (c) 1997-2003 The PHP Group                                |
 | 
						||
// +----------------------------------------------------------------------+
 | 
						||
// | This source file is subject to version 2.0 of the PHP license,       |
 | 
						||
// | that is bundled with this package in the file LICENSE, and is        |
 | 
						||
// | available through the world-wide-web at                              |
 | 
						||
// | http://www.php.net/license/2_02.txt.                                 |
 | 
						||
// | If you did not receive a copy of the PHP license and are unable to   |
 | 
						||
// | obtain it through the world-wide-web, please send a note to          |
 | 
						||
// | license@php.net so we can mail you a copy immediately.               |
 | 
						||
// +----------------------------------------------------------------------+
 | 
						||
// | Author: Marshall Roch <marshall@exclupen.com>                        |
 | 
						||
// +----------------------------------------------------------------------+
 | 
						||
//
 | 
						||
// $Id: Common.php,v 1.1.1.1 2003/09/13 15:03:53 mroch Exp $
 | 
						||
 | 
						||
/**
 | 
						||
 * @author Marshall Roch <marshall@exclupen.com>
 | 
						||
 * @copyright Copyright 2003 Marshall Roch
 | 
						||
 * @license http://www.php.net/license/2_02.txt PHP License 2.0
 | 
						||
 * @package Services_ExchangeRates
 | 
						||
 */
 | 
						||
 | 
						||
/**
 | 
						||
 * Cache_Lite is needed to cache the feeds
 | 
						||
 */
 | 
						||
if ( !class_exists('Cache_Lite') ) {
 | 
						||
	require_once 'Cache/Lite.php';
 | 
						||
}
 | 
						||
 | 
						||
/**
 | 
						||
 * Common functions for data retrieval
 | 
						||
 *
 | 
						||
 * Provides base functions to retrieve and cache data feeds in different
 | 
						||
 * formats.
 | 
						||
 *
 | 
						||
 * @package Services_ExchangeRates
 | 
						||
 */
 | 
						||
class Services_ExchangeRates_Common {
 | 
						||
 | 
						||
   /**
 | 
						||
    * Retrieves data from cache, if it's there.  If it is, but it's expired,
 | 
						||
    * it performs a conditional GET to see if the data is updated.  If it
 | 
						||
    * isn't, it down updates the modification time of the cache file and
 | 
						||
    * returns the data.  If the cache is not there, or the remote file has been
 | 
						||
    * modified, it is downloaded and cached.
 | 
						||
    *
 | 
						||
    * @param string URL of remote file to retrieve
 | 
						||
    * @param int Length of time to cache file locally before asking the server
 | 
						||
    *            if it changed.
 | 
						||
    * @return string File contents
 | 
						||
    */
 | 
						||
    function retrieveFile($url, $cacheLength, $cacheDir) {
 | 
						||
 | 
						||
        $cacheID = md5($url);
 | 
						||
 | 
						||
        $cache = new Cache_Lite(array("cacheDir" => $cacheDir,
 | 
						||
                                      "lifeTime" => $cacheLength));
 | 
						||
 | 
						||
        if ($data = $cache->get($cacheID)) {
 | 
						||
            return $data;
 | 
						||
        } else {
 | 
						||
            // we need to perform a request, so include HTTP_Request
 | 
						||
            include_once 'HTTP/Request.php';
 | 
						||
 | 
						||
            // HTTP_Request has moronic redirect "handling", turn that off (Alexey Borzov)
 | 
						||
            $req = new HTTP_Request($url, array('allowRedirects' => false));
 | 
						||
 | 
						||
            // if $cache->get($cacheID) found the file, but it was expired,
 | 
						||
            // $cache->_file will exist
 | 
						||
            if (isset($cache->_file) && file_exists($cache->_file)) {
 | 
						||
                $req->addHeader('If-Modified-Since', gmdate("D, d M Y H:i:s", filemtime($cache->_file)) ." GMT");
 | 
						||
            }
 | 
						||
			$req->addHeader('User-Agent', 'Firefox (WindowsXP) – Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6');
 | 
						||
 | 
						||
            $req->sendRequest();
 | 
						||
 | 
						||
            if (!($req->getResponseCode() == 304)) {
 | 
						||
                // data is changed, so save it to cache
 | 
						||
                $data = $req->getResponseBody();
 | 
						||
                $cache->save($data, $cacheID);
 | 
						||
                return $data;
 | 
						||
            } else {
 | 
						||
                // retrieve the data, since the first time we did this failed
 | 
						||
                if ($data = $cache->get($cacheID, 'default', true)) {
 | 
						||
                    return $data;
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        Services_ExchangeRates::raiseError("Unable to retrieve file ${url} (unknown reason)", SERVICES_EXCHANGERATES_ERROR_RETRIEVAL_FAILED);
 | 
						||
        return false;
 | 
						||
 | 
						||
    }
 | 
						||
 | 
						||
   /**
 | 
						||
    * Downloads XML file or returns it from cache
 | 
						||
    *
 | 
						||
    * @param string URL of XML file
 | 
						||
    * @param int Length of time to cache
 | 
						||
    * @return object XML_Tree object
 | 
						||
    */
 | 
						||
    function retrieveXML($url, $cacheLength, $cacheDir) {
 | 
						||
        include_once 'XML/Tree.php';
 | 
						||
 | 
						||
        if ($data = $this->retrieveFile($url, $cacheLength, $cacheDir)) {
 | 
						||
 | 
						||
            $tree = new XML_Tree();
 | 
						||
            $root = $tree->getTreeFromString($data);
 | 
						||
 | 
						||
            return $root;
 | 
						||
        }
 | 
						||
 | 
						||
        return false;
 | 
						||
    }
 | 
						||
 | 
						||
}
 | 
						||
 | 
						||
?>
 |