Phaxio/vendor/phaxio/phaxio/lib/Phaxio.php
d6c2a24e
 <?php
 
 class Phaxio
 {
     private $debug = false;
     private $api_key = null;
     private $api_secret = null;
     private $host = "https://api.phaxio.com/v2.1/";
 
     public function __construct($api_key = null, $api_secret = null, $host = null)
     {
         $this->api_key = $api_key ? $api_key : $this->getApiKey();
         $this->api_secret = $api_secret ? $api_secret : $this->getApiSecret();
         if ($host != null) {
             $this->host = $host;
         }
     }
 
     public function faxes()
     {
         return new Phaxio\Faxes($this);
     }
 
     public function phoneNumbers()
     {
         return new Phaxio\PhoneNumbers($this);
     }
 
     public function phaxCodes()
     {
         return new Phaxio\PhaxCodes($this);
     }
 
     public function public()
     {
         return new Phaxio\PhaxioPublic($this);
     }
 
     public function account() {
         return new Phaxio\Account($this);
     }
 
     # Convenience methods
 
     public function sendFax($params) {
         return $this->faxes()->create($params);
     }
 
     public function initFax($id) {
         return $this->faxes()->init($id);
     }
 
     public function retriveFaxFile($id, $params = array()) {
         return $this->initFax($id)->getFile()->retrieve($params);
     }
 
     public function listFaxes($params = array()) {
         return $this->faxes()->getList($params);
     }
 
     public function retrieveDefaultPhaxCode($getMetadata = false)
     {
         return Phaxio\PhaxCode::init($this)->retrieve($getMetadata);
     }
 
     public function stringUpload($str, $ext = 'txt') {
         return new Phaxio\StringUpload($str, $ext);
     }
 
     # API client methods
 
     public function getApiKey()
     {
         return $this->api_key;
     }
 
     public function getApiSecret()
     {
         return $this->api_secret;
     }
 
     public function doRequest($method, $path, $params = array(), $wrapInPhaxioOperationResult = true)
     {
         $address = $this->host . $path;
 
         $response = $this->curlRequest($method, $address, $params);
 
         if ($this->debug) {
             echo "Response: \n\n";
             var_dump($response);
             echo "\n\n";
         }
 
         if ($wrapInPhaxioOperationResult || $response['status'] != 200) {
             $result = json_decode($response['body'], true);
         }
 
         switch ($response['status']) {
             case 401:
                 throw new Phaxio\Error\AuthenticationException($result['message']);
                 break;
             case 404:
                 throw new Phaxio\Error\NotFoundException($result['message']);
                 break;
             case 422:
                 throw new Phaxio\Error\InvalidRequestException($result['message']);
                 break;
             case 429:
                 throw new Phaxio\Error\RateLimitException($result['message']);
                 break;
         }
 
         if ($response['status'] >= 500 || (isset($result['success']) && $result['success'] != true)) {
             throw new Phaxio\Error\GeneralException($result['message']);
         }
 
         if ($wrapInPhaxioOperationResult) {
             $opResult = new Phaxio\OperationResult($result['success'], $result['message'], isset($result['data']) ? $result['data'] : null, isset($result['paging']) ? $result['paging'] : null);
         } else {
             $opResult = $response;
         }
 
         return $opResult;
     }
 
     private function curlRequest($method, $address, $params = array())
     {
         $handle = curl_init($address);
 
         curl_setopt($handle, CURLOPT_CUSTOMREQUEST, $method);
         curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
 
         # Authentication
         curl_setopt($handle, CURLOPT_USERPWD, $this->getApiKey() . ':' . $this->getApiSecret());
 
         if ($this->debug) {
             echo "Requested resource: $method $address\n\n";
             echo "Authentication: " . $this->getApiKey() . ':' . $this->getApiSecret() . "\n\n";
         }
 
         $this->curlSetoptCustomPostfields($handle, $params);
         $result = curl_exec($handle);
 
         if ($result === false) {
             throw new Phaxio\Error\APIConnectionException('Curl error: ' . curl_error($handle));
         }
 
         $contentType = curl_getinfo($handle, CURLINFO_CONTENT_TYPE);
         $status = curl_getinfo($handle, CURLINFO_HTTP_CODE);
 
         curl_close($handle);
 
         return array('status' => $status, 'contentType' => $contentType, 'body' => $result);
     }
 
     private function curlSetoptCustomPostfields($ch, $postfields, $headers = null)
     {
         $algos = hash_algos();
         $hashAlgo = null;
 
         foreach (array('sha1', 'md5') as $preferred) {
             if (in_array($preferred, $algos)) {
                 $hashAlgo = $preferred;
                 break;
             }
         }
         if ($hashAlgo === null) {
             list($hashAlgo) = $algos;
         }
         $boundary =
                 '----------------------------' .
                 substr(hash($hashAlgo, 'cURL-php-multiple-value-same-key-support' . microtime()), 0, 12);
 
         $body = array();
         $crlf = "\r\n";
         $fields = array();
         foreach ($postfields as $key => $value) {
             if (is_array($value)) {
                 foreach ($value as $idx => $v) {
                     $fields[] = array($key . "[" . (is_int($idx) ? '' : $idx) . "]", $v);
                 }
             } else {
                 $fields[] = array($key, $value);
             }
         }
         foreach ($fields as $field) {
             list($key, $value) = $field;
 
             if (is_resource($value)) {
                 $value = $this->stringUpload(stream_get_contents($value), basename(stream_get_meta_data($value)['uri']));
             }
 
             if ($value instanceof Phaxio\StringUpload) {
                 $body[] = '--' . $boundary;
                 $body[] = 'Content-Disposition: form-data; name="' . $key . '"; filename="string.' . $value->extension . '"';
                 $body[] = 'Content-Type: application/octet-stream';
                 $body[] = '';
                 $body[] = $value->string;
             } else {
                 $body[] = '--' . $boundary;
                 $body[] = 'Content-Disposition: form-data; name="' . $key . '"';
                 $body[] = '';
                 $body[] = (is_bool($value) ? var_export($value, true) : $value);
             }
         }
         $body[] = '--' . $boundary . '--';
         $body[] = '';
         $contentType = 'multipart/form-data; boundary=' . $boundary;
         $content = join($crlf, $body);
         $contentLength = strlen($content);
 
         curl_setopt(
             $ch,
             CURLOPT_HTTPHEADER,
             array(
                 'Content-Length: ' . $contentLength,
                 'Expect: 100-continue',
                 'Content-Type: ' . $contentType,
             )
         );
 
         if ($this->debug) {
             echo "Request payload:\n\n$content\n\n";
         }
 
         curl_setopt($ch, CURLOPT_POSTFIELDS, $content);
     }
 }