<?php
 
class CURLQuery {
 
 
    protected $_post;
 
    protected $_options;
 
    protected $_ch;
 
 
    public function __construct($url) {
 
        if (!extension_loaded('curl')) {
 
            throw new Exception("cURL extension not enabled.");
 
        }
 
        $this->_ch = curl_init($url);
 
        $this->_options = array();
 
    }
 
 
    public function __get($name) {
 
        $resultat = NULL;
 
        if (defined($name)) {
 
            $value = constant($name);
 
            if (isset($this->_options[$value])) {
 
                $resultat = $this->_options[$value];
 
            }
 
        }
 
        return $resultat;
 
    }
 
 
    public function __set($name, $value) {
 
        if (defined($name) && preg_match('/^CURLOPT_(?!POSTFIELDS)/', $name)) {
 
            $this->_options[constant($name)] = $value;
 
        } else {
 
            throw new Exception("Invalid or protected option '$name'.");
 
        }
 
    }
 
 
    public function __isset($name) {
 
        return ( defined($name) && isset($this->_options[constant($name)]) );
 
    }
 
 
    public function __unset($name) {
 
        if (defined($name) && isset($this->_options[constant($name)])) {
 
            unset($this->_options[constant($name)]);
 
        }
 
    }
 
 
    public function __toString() {
 
        return sprintf("%s (%s)", __CLASS__, curl_getinfo($this->_ch, CURLINFO_EFFECTIVE_URL));
 
    }
 
 
    public function setTimeout($timeout) {
 
        $timeout = intval($timeout);
 
        if ($timeout > 0) {
 
            $this->CURLOPT_TIMEOUT = $timeout;
 
            $this->CURLOPT_CONNECTTIMEOUT = $timeout;
 
        }
 
    }
 
 
    public function addPostData($field_name, $value) {
 
        if (!isset($this->_post[$field_name]) && !is_array($value)) {
 
            $this->_post[$field_name] = $value;
 
            return TRUE;
 
        } else {
 
            return FALSE;
 
        }
 
    }
 
 
    public function addPostFile($field_name, $file) {
 
        if (is_file($file)) {
 
            $this->_post[$field_name] = '@' . realpath($file);
 
        } else {
 
            throw new Exception("The file '$file' does not exist or is not a regular file");
 
        }
 
    }
 
 
    public function doRequest($output_file = FALSE) {
 
        if ($this->_options) {
 
            if (function_exists('curl_setopt_array')) {
 
                curl_setopt_array($this->_ch, $this->_options);
 
            } else {
 
                foreach ($this->_options as $option => $value) {
 
                    curl_setopt($this->_ch, $option, $value);
 
                }
 
            }
 
        }
 
        if ($output_file) {
 
            @$fp = fopen($output_file, 'w');
 
            if (!$fp) {
 
                throw new Exception("Can not open file '$output_file' for writing.");
 
            }
 
            curl_setopt($this->_ch, CURLOPT_FILE, $fp);
 
        } else {
 
            curl_setopt($this->_ch, CURLOPT_RETURNTRANSFER, TRUE);
 
        }
 
        if ($this->_post) {
 
            curl_setopt($this->_ch, CURLOPT_POST, TRUE);
 
            curl_setopt($this->_ch, CURLOPT_POSTFIELDS, $this->_post);
 
        }
 
        $ret = curl_exec($this->_ch);
 
        if ($output_file) {
 
            fclose($fp);
 
        }
 
        if ($ret === FALSE) {
 
            throw new Exception("An error occurred : '" . curl_error($this->_ch) . "'");
 
        }
 
        return $ret;
 
    }
 
 
    public function __destruct() {
 
        unset($this->_options);
 
        unset($this->_post);
 
        curl_close($this->_ch);
 
    }
 
 
}
 
 
 |