[eluser]Rob Pomeroy[/eluser]
/system/application/libraries/RackspaceAPI.php:
Code:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Uses curl and pecl_http
*/
class Rackspace_API {
/**
* Store recent http_message
* @var object
*/
protected $_http_message;
/**
* CI object
* @var object
*/
protected $_ci;
/**
* Rackspace config items
*/
protected $_user_key;
protected $_secret_key;
protected $_user_agent;
protected $_api_version;
protected $_rackspace_host;
function __construct() {
$this->_ci =& get_instance();
$this->_ci->config->load('RackspaceAPI', TRUE);
$this->_user_key = $this->_ci->config->item('user_key', 'RackspaceAPI');
$this->_secret_key = $this->_ci->config->item('secret_key', 'RackspaceAPI');
$this->_user_agent = $this->_ci->config->item('user_agent', 'RackspaceAPI');
$this->_api_version = $this->_ci->config->item('api_version', 'RackspaceAPI');
$this->_rackspace_host = $this->_ci->config->item('rackspace_host', 'RackspaceAPI');
}
/**
* Get info about a domain
* @param $domain string
* @return stdClass Object ( 'error' => bool,
* 'result' => string (error message) | stdClass Object
*/
public function getDomainInfo($domain) {
return $this->genericGet('/customers/me/domains/'.$domain);
}
/**
* Get all domain names
* @return stdClass Object ( 'error' => bool,
* 'result' => string (error message) | array (domains)
*/
public function getDomains() {
$obj = $this->genericGet('/customers/me/domains');
if(!$obj->error){
// Reformat into an array of domains
foreach($obj->result->domains as $domain) {
$domains[]=$domain->name;
}
$obj->result = $domains;
}
return $obj;
}
/**
* Get info about a mailbox ($domain@$id)
* @param $domain string
* @param $id string
* @return stdClass Object ( 'error' => bool,
* 'result' => string (error message) | stdClass Object
*/
public function getMailboxInfo($domain, $id) {
return $this->genericGet('/customers/me/domains/'.$domain.'/rs/mailboxes/'.$id);
}
/**
* Used by Get functions above - generalised use case
* @param type $url - see the API; constructed by the calling function
* @return stdClass Object ( 'error' => bool,
* 'result' => string (error message) | stdClass Object
*/
private function genericGet($url) {
$this->get(
$url,
'application/json');
if($this->_http_message->getResponseCode() == 200) {
// Call worked. JSON is missing enclosing brackets, apparently needed by json_decode
$json = '['.$this->_http_message->getBody().']';
if(is_string($json)) {
$obj = json_decode($json);
$result->error = false;
$result->result = $obj[0];
} else {
// JSON failure
$result->error = true;
$result->result = 'Failed to parse JSON';
}
} else {
// API call failed
$result->error = true;
$result->result = $this->_http_message->getHeader("x-error-message");
}
return $result;
}
// The remainder of this file is mostly lifted from Rackspace's examples: http://api-wiki.apps.rackspace.com/api-wiki/index.php/PHP_Examples_(Rest_API)
private function get($url_string, $format) {
$headers = array("Accept: $format");
$curl_session = self::construct_session($url_string, $headers);
$this->_http_message = self::send_request($curl_session);
}
private function post($url_string, $fields, $format) {
$headers = array("Accept: $format");
$curl_session = self::construct_session($url_string, $headers);
curl_setopt($curl_session, CURLOPT_POST, true);
curl_setopt($curl_session, CURLOPT_POSTFIELDS, $fields);
$this->_http_message = self::send_request($curl_session);
}
private function put($url_string, $fields) {
$curl_session = self::construct_session($url_string, array());
curl_setopt($curl_session, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($curl_session, CURLOPT_POSTFIELDS, $fields);
$this->_http_message = self::send_request($curl_session);
}
private function delete($url_string) {
$curl_session = self::construct_session($url_string, array());
curl_setopt($curl_session, CURLOPT_CUSTOMREQUEST, 'DELETE');
$this->_http_message = self::send_request($curl_session);
}
private function send_request($curl_session) {
$response = curl_exec($curl_session);
curl_close($curl_session);
return new HttpMessage($response);
}
private function construct_session($url_string, $existing_headers) {
$headers = array_merge(
self::authorization_headers(), $existing_headers);
$url = self::construct_uri($url_string);
$curl_session = curl_init($url);
curl_setopt($curl_session, CURLOPT_HEADER, true);
curl_setopt($curl_session, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, true);
return $curl_session;
}
private function authorization_headers() {
$time_stamp = date('YmdHis');
$data_to_sign = $this->_user_key . $this->_user_agent .
$time_stamp. $this->_secret_key;
$signature = base64_encode(sha1($data_to_sign, true));
$headers = array();
$headers[] = "User-Agent: " . $this->_user_agent;
$headers[] = 'X-Api-Signature: ' .
$this->_user_key . ":$time_stamp:$signature";
return $headers;
}
private function construct_uri($url_string) {
$url = 'http://' . $this->_rackspace_host . '/' . $this->_api_version . $url_string;
return $url;
}
}
?>