--- /dev/null
+<?php
+/**
+ * curl class
+ *
+ * This is a wrapper class for curl, it is easy to use:
+ * $c = new curl();
+ * // HTTP GET Method
+ * $html = $c->get('http://moodle.org');
+ * // HTTP POST Method
+ * $html = $c->post('http://moodle.org/', array('q'=>'words', 'name'=>'moodle'));
+ *
+ * @author Dongsheng Cai <dongsheng@cvs.moodle.org>
+ * @version 0.1 dev
+ * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
+ */
+
+class curl {
+ private $header;
+ private $options;
+ private $error;
+ private $debug = false;
+
+ public function __construct($options = array()){
+
+ if(!function_exists('curl_init')) {
+ $this->error = 'cURL module must be enabled!';
+ trigger_error($this->error, E_USER_ERROR);
+ return false;
+ }
+
+ $this->header = array();
+ $this->options = array();
+ $this->setopt();
+ }
+
+ /**
+ * Set curl options
+ *
+ * @param array $options If array is null, this function will
+ * reset the options to default value.
+ *
+ */
+ public function setopt($options = array()) {
+ $this->options['CURLOPT_HEADER'] = 0;
+ $this->options['CURLOPT_NOBODY'] = 0;
+ $this->options['CURLOPT_USERAGENT'] = 'MoodleBot/1.0';
+ $this->options['CURLOPT_FOLLOWLOCATION'] = 1;
+ $this->options['CURLOPT_MAXREDIRS'] = 10;
+ $this->options['CURLOPT_TIMEOUT'] = 120;
+ $this->options['CURLOPT_ENCODING'] = '';
+ $this->options['CURLOPT_RETURNTRANSFER'] = 1;
+ $this->options['CURLOPT_BINARYTRANSFER'] = 0;
+ $this->options['CURLOPT_SSL_VERIFYPEER'] = 0;
+
+ if (is_array($options)) {
+ foreach($options as $name => $val)
+ $this->options[$name] = $val;
+ }
+
+ }
+
+ private function resetopt()
+ {
+ unset($this->options['CURLOPT_HTTPGET']);
+ unset($this->options['CURLOPT_POST']);
+ unset($this->options['CURLOPT_POSTFIELDS']);
+ unset($this->options['CURLOPT_PUT']);
+ unset($this->options['CURLOPT_INFILE']);
+ unset($this->options['CURLOPT_INFILESIZE']);
+ unset($this->options['CURLOPT_CUSTOMREQUEST']);
+ }
+ /**
+ * Set HTTP Header
+ *
+ * @param array $headers
+ *
+ */
+ public function setheader($header) {
+ if (is_array($header)){
+ foreach ($header as $v) {
+ $this->setheader($v);
+ }
+ } else {
+ $this->header[] = $val;
+ }
+ }
+
+ protected function request($url, $options = array()){
+
+ // create curl instance
+ $curl = curl_init($url);
+ // reset before set options
+ $this->setopt($options);
+
+ // set options
+ foreach($this->options as $name => $val) {
+ if (is_string($name)) {
+ $name = constant(strtoupper($name));
+ }
+ curl_setopt($curl, $name, $val);
+ }
+
+ if($this->debug){
+ var_dump($this->options);
+ }
+
+ // set headers
+ if(!empty($this->header)){
+ curl_setopt($curl, CURLOPT_HTTPHEADER, $this->header);
+ }
+
+ $ret = curl_exec($curl);
+
+ if($this->debug){
+ var_dump($ret);
+ }
+
+ $info = curl_getinfo($curl);
+
+ curl_close($curl);
+
+ if(!empty($ret)){
+ return $ret;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * HTTP HEAD method
+ */
+ public function head($url, $options = array()){
+ $this->setopt(array('CURLOPT_HTTPGET'=>1));
+ $this->setopt(array('CURLOPT_HEADER' =>1));
+ $this->setopt(array('CURLOPT_NOBODY' =>1));
+ return $this->request($url, $options);
+ }
+
+ /**
+ * HTTP POST method
+ */
+ public function post($url, $params = array(), $options = array()){
+ $this->setopt(array('CURLOPT_POST'=>1));
+ $this->setopt(array('CURLOPT_POSTFIELDS'=>$params));
+ return $this->request($url, $options);
+ }
+
+ /**
+ * HTTP GET method
+ */
+ public function get($url, $params = array(), $options = array()){
+ if(!empty($params)){
+ $url .= (stripos($url, '?') !== false) ? '&' : '?';
+ $url .= http_build_query($params);
+ }
+ $this->setopt(array('CURLOPT_HTTPGET'=>1));
+ return $this->request($url, $options);
+ }
+
+ /**
+ * HTTP PUT method
+ */
+ public function put($url, $params = array(), $options = array()){
+ $file = $params['file'];
+ if(!is_file($file)){
+ return null;
+ }
+ $fp = fopen($file, 'rw');
+ $this->setopt(array('CURLOPT_PUT'=>1));
+ $this->setopt(array('CURLOPT_INFILE'=>$fp));
+ $this->setopt(array('CURLOPT_INFILESIZE'=>-1));
+ if (!isset($this->options['CURLOPT_USERPWD'])){
+ $this->setopt(array('CURLOPT_USERPWD'=>'anonymous: noreply@moodle.org'));
+ }
+ $ret = $this->request($url, $options);
+ return $ret;
+ }
+
+ /**
+ * HTTP DELETE method
+ */
+ public function delete($url, $options = array()){
+ $this->setopt(array('CURLOPT_CUSTOMREQUEST'=>'DELETE'));
+ if (!isset($this->options['CURLOPT_USERPWD'])) {
+ $this->options['CURLOPT_USERPWD'] = 'anonymous: noreply@moodle.org';
+ }
+ $ret = $this->request($url, $options);
+ return $ret;
+ }
+}
+/*
+$c = new curl();
+
+echo '<div style="clear:both">---------------------This is a line---------------------</a>';
+
+$z = $c->get('http://foleo.appspot.com/');
+
+echo '<div><textarea rows="29" cols="99">';
+echo htmlentities($z);
+echo '</textarea></div>';
+*/
* http://sourceforge.net/forum/forum.php?forum_id=469652
*
*/
-if (session_id() == "") {
- @session_start();
-}
-
-// Decides which include path delimiter to use. Windows should be using a semi-colon
-// and everything else should be using a colon. If this isn't working on your system,
-// comment out this if statement and manually set the correct value into $path_delimiter.
-if (strpos(__FILE__, ':') !== false) {
- $path_delimiter = ';';
-} else {
- $path_delimiter = ':';
-}
-
-// This will add the packaged PEAR files into the include path for PHP, allowing you
-// to use them transparently. This will prefer officially installed PEAR files if you
-// have them. If you want to prefer the packaged files (there shouldn't be any reason
-// to), swap the two elements around the $path_delimiter variable. If you don't have
-// the PEAR packages installed, you can leave this like it is and move on.
-
-ini_set('include_path', ini_get('include_path') . $path_delimiter . dirname(__FILE__) . '/PEAR');
-
-// If you have problems including the default PEAR install (like if your open_basedir
-// setting doesn't allow you to include files outside of your web root), comment out
-// the line above and uncomment the next line:
-
-// ini_set('include_path', dirname(__FILE__) . '/PEAR' . $path_delimiter . ini_get('include_path'));
+/**
+ * Modified by Dongsheng Cai <dongsheng@cvs.moodle.org>
+ * ChangeLog:
+ * 1. Remove PEAR HTTP LIB, use curl.class.php (created by myself)
+ * 2. Remove PEAR DB LIB
+ * TODO
+ * 1. Add cache code, including file cache mode and db cache mode
+ * 2. Clean up SESSION code
+ *
+ */
+require_once('../config.php');
class phpFlickr {
var $api_key;
function __construct ($api_key, $secret = NULL, $die_on_error = false)
{
+ global $CFG;
//The API Key must be set before any calls can be made. You can
//get your own at http://www.flickr.com/services/api/misc.api_keys.html
$this->api_key = $api_key;
$this->php_version = explode("-", phpversion());
$this->php_version = explode(".", $this->php_version[0]);
- //All calls to the API are done via the POST method using the PEAR::HTTP_Request package.
- require_once 'HTTP/Request.php';
- $this->req =& new HTTP_Request();
- $this->req->setMethod(HTTP_REQUEST_METHOD_POST);
+ require_once($CFG->dirroot.'/repository/curl.class.php');
+ $this->curl = new curl;
}
function enableCache($type, $connection, $cache_expire = 600, $table = 'flickr_cache')
// When using file system, caching, the $connection is the folder that the web server has write
// access to. Use absolute paths for best results. Relative paths may have unexpected behavior
// when you include this. They'll usually work, you'll just want to test them.
- if ($type == 'db') {
- require_once 'DB.php';
- $db =& DB::connect($connection);
- if (PEAR::isError($db)) {
- die($db->getMessage());
- }
-
- /*
- * If high performance is crucial, you can easily comment
- * out this query once you've created your database table.
- */
-
- $db->query("
- CREATE TABLE IF NOT EXISTS `$table` (
- `request` CHAR( 35 ) NOT NULL ,
- `response` MEDIUMTEXT NOT NULL ,
- `expiration` DATETIME NOT NULL ,
- INDEX ( `request` )
- ) TYPE = MYISAM");
-
- if ($db->getOne("SELECT COUNT(*) FROM $table") > $this->max_cache_rows) {
- $db->query("DELETE FROM $table WHERE expiration < DATE_SUB(NOW(), INTERVAL $cache_expire second)");
- $db->query('OPTIMIZE TABLE ' . $this->cache_table);
- }
-
- $this->cache = 'db';
- $this->cache_db = $db;
- $this->cache_table = $table;
- } elseif ($type == 'fs') {
- $this->cache = 'fs';
- $connection = realpath($connection);
- $this->cache_dir = $connection;
- if ($dir = opendir($this->cache_dir)) {
- while ($file = readdir($dir)) {
- if (substr($file, -6) == '.cache' && ((filemtime($this->cache_dir . '/' . $file) + $cache_expire) < time()) ) {
- unlink($this->cache_dir . '/' . $file);
- }
- }
- }
- }
+ $this->cache = 'fs';
+ $connection = realpath($connection);
+ $this->cache_dir = $connection;
+ if ($dir = opendir($this->cache_dir)) {
+ while ($file = readdir($dir)) {
+ if (substr($file, -6) == '.cache' && ((filemtime($this->cache_dir . '/' . $file) + $cache_expire) < time()) ) {
+ unlink($this->cache_dir . '/' . $file);
+ }
+ }
+ }
$this->cache_expire = $cache_expire;
}
//If there is no cache result, it returns a value of false. If it finds one,
//it returns the unparsed XML.
$reqhash = md5(serialize($request));
- if ($this->cache == 'db') {
- $result = $this->cache_db->getOne("SELECT response FROM " . $this->cache_table . " WHERE request = ? AND DATE_SUB(NOW(), INTERVAL " . (int) $this->cache_expire . " SECOND) < expiration", $reqhash);
- if (!empty($result)) {
- return $result;
- }
- } elseif ($this->cache == 'fs') {
- $file = $this->cache_dir . '/' . $reqhash . '.cache';
- if (file_exists($file)) {
- if ($this->php_version[0] > 4 || ($this->php_version[0] == 4 && $this->php_version[1] >= 3)) {
- return file_get_contents($file);
- } else {
- return implode('', file($file));
- }
- }
- }
+ $file = $this->cache_dir . '/' . $reqhash . '.cache';
+ if (file_exists($file)) {
+ if ($this->php_version[0] > 4 || ($this->php_version[0] == 4 && $this->php_version[1] >= 3)) {
+ return file_get_contents($file);
+ } else {
+ return implode('', file($file));
+ }
+ }
return false;
}
{
//Caches the unparsed XML of a request.
$reqhash = md5(serialize($request));
- if ($this->cache == 'db') {
- //$this->cache_db->query("DELETE FROM $this->cache_table WHERE request = '$reqhash'");
- if ($this->cache_db->getOne("SELECT COUNT(*) FROM {$this->cache_table} WHERE request = '$reqhash'")) {
- $sql = "UPDATE " . $this->cache_table . " SET response = ?, expiration = ? WHERE request = ?";
- $this->cache_db->query($sql, array($response, strftime("%Y-%m-%d %H:%M:%S"), $reqhash));
- } else {
- $sql = "INSERT INTO " . $this->cache_table . " (request, response, expiration) VALUES ('$reqhash', '" . str_replace("'", "''", $response) . "', '" . strftime("%Y-%m-%d %H:%M:%S") . "')";
- $this->cache_db->query($sql);
- }
- } elseif ($this->cache == "fs") {
- $file = $this->cache_dir . "/" . $reqhash . ".cache";
- $fstream = fopen($file, "w");
- $result = fwrite($fstream,$response);
- fclose($fstream);
- return $result;
- }
- return false;
+ $file = $this->cache_dir . "/" . $reqhash . ".cache";
+ $fstream = fopen($file, "w");
+ $result = fwrite($fstream,$response);
+ fclose($fstream);
+ return $result;
}
function request ($command, $args = array(), $nocache = false)
{
+ global $SESSION;
//Sends a request to Flickr's REST endpoint via POST.
- $this->req->setURL($this->REST);
- $this->req->clearPostData();
if (substr($command,0,7) != "flickr.") {
$command = "flickr." . $command;
}
$args = array_merge(array("method" => $command, "format" => "php_serial", "api_key" => $this->api_key), $args);
if (!empty($this->token)) {
$args = array_merge($args, array("auth_token" => $this->token));
- } elseif (!empty($_SESSION['phpFlickr_auth_token'])) {
- $args = array_merge($args, array("auth_token" => $_SESSION['phpFlickr_auth_token']));
+ } elseif (!empty($SESSION->phpFlickr_auth_token)) {
+ $args = array_merge($args, array("auth_token" => $SESSION->phpFlickr_auth_token));
}
ksort($args);
$auth_sig = "";
if (!($this->response = $this->getCached($args)) || $nocache) {
foreach ($args as $key => $data) {
$auth_sig .= $key . $data;
- $this->req->addPostData($key, $data);
+ //$this->req->addPostData($key, $data);
}
if (!empty($this->secret)) {
$api_sig = md5($this->secret . $auth_sig);
- $this->req->addPostData("api_sig", $api_sig);
+ //$this->req->addPostData("api_sig", $api_sig);
}
- $this->req->addHeader("Connection", "Keep-Alive");
-
- //Send Requests
- if ($this->req->sendRequest()) {
- $this->response = $this->req->getResponseBody();
- $this->cache($args, $this->response);
- } else {
- die("There has been a problem sending your command to the server.");
- }
+ //$this->req->addHeader("Connection", "Keep-Alive");
+ $ret = $this->curl->post($this->REST, $args);
}
/*
* Uncomment this line (and comment out the next one) if you're doing large queries
* the result, so be sure that you look at the results.
*/
//$this->parsed_response = unserialize($this->response);
- $this->parsed_response = $this->clean_text_nodes(unserialize($this->response));
+ $this->parsed_response = $this->clean_text_nodes(unserialize($ret));
if ($this->parsed_response['stat'] == 'fail') {
if ($this->die_on_error) die("The Flickr API returned the following error: #{$this->parsed_response['code']} - {$this->parsed_response['message']}");
else {
function setProxy($server, $port)
{
// Sets the proxy for all phpFlickr calls.
- $this->req->setProxy($server, $port);
+ //$this->req->setProxy($server, $port);
}
function getErrorCode()
return unserialize(file_get_contents('http://phpflickr.com/geodata/?format=php&lat=' . $lat . '&lon=' . $lon));
}
- function sync_upload ($photo, $title = null, $description = null, $tags = null, $is_public = null, $is_friend = null, $is_family = null) {
- $upload_req =& new HTTP_Request();
- $upload_req->setMethod(HTTP_REQUEST_METHOD_POST);
-
-
- $upload_req->setURL($this->Upload);
- $upload_req->clearPostData();
-
- //Process arguments, including method and login data.
- $args = array("api_key" => $this->api_key, "title" => $title, "description" => $description, "tags" => $tags, "is_public" => $is_public, "is_friend" => $is_friend, "is_family" => $is_family);
- if (!empty($this->email)) {
- $args = array_merge($args, array("email" => $this->email));
- }
- if (!empty($this->password)) {
- $args = array_merge($args, array("password" => $this->password));
- }
- if (!empty($this->token)) {
- $args = array_merge($args, array("auth_token" => $this->token));
- } elseif (!empty($_SESSION['phpFlickr_auth_token'])) {
- $args = array_merge($args, array("auth_token" => $_SESSION['phpFlickr_auth_token']));
- }
-
- ksort($args);
- $auth_sig = "";
- foreach ($args as $key => $data) {
- if ($data !== null) {
- $auth_sig .= $key . $data;
- $upload_req->addPostData($key, $data);
- }
- }
- if (!empty($this->secret)) {
- $api_sig = md5($this->secret . $auth_sig);
- $upload_req->addPostData("api_sig", $api_sig);
- }
-
- $photo = realpath($photo);
-
- $result = $upload_req->addFile("photo", $photo);
-
- if (PEAR::isError($result)) {
- die($result->getMessage());
- }
-
- //Send Requests
- if ($upload_req->sendRequest()) {
- $this->response = $upload_req->getResponseBody();
- } else {
- die("There has been a problem sending your command to the server.");
- }
-
- $rsp = explode("\n", $this->response);
- foreach ($rsp as $line) {
- if (ereg('<err code="([0-9]+)" msg="(.*)"', $line, $match)) {
- if ($this->die_on_error)
- die("The Flickr API returned the following error: #{$match[1]} - {$match[2]}");
- else {
- $this->error_code = $match[1];
- $this->error_msg = $match[2];
- $this->parsed_response = false;
- return false;
- }
- } elseif (ereg("<photoid>(.*)</photoid>", $line, $match)) {
- $this->error_code = false;
- $this->error_msg = false;
- return $match[1];
- }
- }
- }
-
- function async_upload ($photo, $title = null, $description = null, $tags = null, $is_public = null, $is_friend = null, $is_family = null) {
- $upload_req =& new HTTP_Request();
- $upload_req->setMethod(HTTP_REQUEST_METHOD_POST);
-
- $upload_req->setURL($this->Upload);
- $upload_req->clearPostData();
-
- //Process arguments, including method and login data.
- $args = array("async" => 1, "api_key" => $this->api_key, "title" => $title, "description" => $description, "tags" => $tags, "is_public" => $is_public, "is_friend" => $is_friend, "is_family" => $is_family);
- if (!empty($this->email)) {
- $args = array_merge($args, array("email" => $this->email));
- }
- if (!empty($this->password)) {
- $args = array_merge($args, array("password" => $this->password));
- }
- if (!empty($this->token)) {
- $args = array_merge($args, array("auth_token" => $this->token));
- } elseif (!empty($_SESSION['phpFlickr_auth_token'])) {
- $args = array_merge($args, array("auth_token" => $_SESSION['phpFlickr_auth_token']));
- }
-
- ksort($args);
- $auth_sig = "";
- foreach ($args as $key => $data) {
- if ($data !== null) {
- $auth_sig .= $key . $data;
- $upload_req->addPostData($key, $data);
- }
- }
- if (!empty($this->secret)) {
- $api_sig = md5($this->secret . $auth_sig);
- $upload_req->addPostData("api_sig", $api_sig);
- }
-
- $photo = realpath($photo);
-
- $result = $upload_req->addFile("photo", $photo);
-
- if (PEAR::isError($result)) {
- die($result->getMessage());
- }
-
- //Send Requests
- if ($upload_req->sendRequest()) {
- $this->response = $upload_req->getResponseBody();
- } else {
- die("There has been a problem sending your command to the server.");
- }
-
- $rsp = explode("\n", $this->response);
- foreach ($rsp as $line) {
- if (ereg('<err code="([0-9]+)" msg="(.*)"', $line, $match)) {
- if ($this->die_on_error)
- die("The Flickr API returned the following error: #{$match[1]} - {$match[2]}");
- else {
- $this->error_code = $match[1];
- $this->error_msg = $match[2];
- $this->parsed_response = false;
- return false;
- }
- } elseif (ereg("<ticketid>(.*)</", $line, $match)) {
- $this->error_code = false;
- $this->error_msg = false;
- return $match[1];
- }
- }
- }
-
- // Interface for new replace API method.
- function replace ($photo, $photo_id, $async = null) {
- $upload_req =& new HTTP_Request();
- $upload_req->setMethod(HTTP_REQUEST_METHOD_POST);
-
- $upload_req->setURL($this->Replace);
- $upload_req->clearPostData();
-
- //Process arguments, including method and login data.
- $args = array("api_key" => $this->api_key, "photo_id" => $photo_id, "async" => $async);
- if (!empty($this->email)) {
- $args = array_merge($args, array("email" => $this->email));
- }
- if (!empty($this->password)) {
- $args = array_merge($args, array("password" => $this->password));
- }
- if (!empty($this->token)) {
- $args = array_merge($args, array("auth_token" => $this->token));
- } elseif (!empty($_SESSION['phpFlickr_auth_token'])) {
- $args = array_merge($args, array("auth_token" => $_SESSION['phpFlickr_auth_token']));
- }
-
- ksort($args);
- $auth_sig = "";
- foreach ($args as $key => $data) {
- if ($data !== null) {
- $auth_sig .= $key . $data;
- $upload_req->addPostData($key, $data);
- }
- }
- if (!empty($this->secret)) {
- $api_sig = md5($this->secret . $auth_sig);
- $upload_req->addPostData("api_sig", $api_sig);
- }
-
- $photo = realpath($photo);
-
- $result = $upload_req->addFile("photo", $photo);
-
- if (PEAR::isError($result)) {
- die($result->getMessage());
- }
-
- //Send Requests
- if ($upload_req->sendRequest()) {
- $this->response = $upload_req->getResponseBody();
- } else {
- die("There has been a problem sending your command to the server.");
- }
- if ($async == 1)
- $find = 'ticketid';
- else
- $find = 'photoid';
-
- $rsp = explode("\n", $this->response);
- foreach ($rsp as $line) {
- if (ereg('<err code="([0-9]+)" msg="(.*)"', $line, $match)) {
- if ($this->die_on_error)
- die("The Flickr API returned the following error: #{$match[1]} - {$match[2]}");
- else {
- $this->error_code = $match[1];
- $this->error_msg = $match[2];
- $this->parsed_response = false;
- return false;
- }
- } elseif (ereg("<" . $find . ">(.*)</", $line, $match)) {
- $this->error_code = false;
- $this->error_msg = false;
- return $match[1];
- }
- }
- }
-
function auth ($perms = "read", $remember_uri = true)
{
+ global $SESSION;
// Redirects to Flickr's authentication piece if there is no valid token.
// If remember_uri is set to false, the callback script (included) will
// redirect to its default page.
- if (empty($_SESSION['phpFlickr_auth_token']) && empty($this->token)) {
+ if (empty($SESSION->phpFlickr_auth_token) && empty($this->token)) {
if ($remember_uri) {
$redirect = $_SERVER['REQUEST_URI'];
}
$this->die_on_error = false;
$rsp = $this->auth_checkToken();
if ($this->error_code !== false) {
- unset($_SESSION['phpFlickr_auth_token']);
+ unset($SESSION->phpFlickr_auth_token);
$this->auth($perms, $remember_uri);
}
$this->die_on_error = $tmp;
function auth_getToken ($frob)
{
+ global $SESSION;
/* http://www.flickr.com/services/api/flickr.auth.getToken.html */
$this->request('flickr.auth.getToken', array('frob'=>$frob));
- session_register('phpFlickr_auth_token');
- $_SESSION['phpFlickr_auth_token'] = $this->parsed_response['auth']['token'];
+ $SESSION->phpFlickr_auth_token = $this->parsed_response['auth']['token'];
return $this->parsed_response ? $this->parsed_response['auth'] : false;
}