| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 | 
							- <?php
 
- namespace Qcloud\Cos;
 
- include("Common.php");
 
- use Qcloud\Cos\Signature;
 
- use GuzzleHttp\Client as HttpClient;
 
- use GuzzleHttp\HandlerStack;
 
- use Psr\Http\Message\RequestInterface;
 
- use Psr\Http\Message\ResponseInterface;
 
- use GuzzleHttp\Command\Guzzle\Description;
 
- use GuzzleHttp\Command\Guzzle\GuzzleClient;
 
- use GuzzleHttp\Command\Guzzle\Deserializer;
 
- use GuzzleHttp\Command\CommandInterface;
 
- use GuzzleHttp\Command\Exception\CommandException;
 
- use GuzzleHttp\Exception\RequestException;
 
- use GuzzleHttp\Middleware;
 
- use GuzzleHttp\Psr7;
 
- use GuzzleHttp\Pool;
 
- class Client extends GuzzleClient {
 
-     const VERSION = '2.0.9';
 
-     public $httpClient;
 
-     
 
-     private $api;
 
-     private $desc;
 
-     private $action;
 
-     private $operation;
 
-     private $cosConfig;
 
-     private $signature;
 
-     private $rawCosConfig;
 
-     public function __construct($cosConfig) {
 
-         $this->rawCosConfig = $cosConfig;
 
-         $this->cosConfig['schema'] = isset($cosConfig['schema']) ? $cosConfig['schema'] : 'http';
 
-         $this->cosConfig['region'] =  region_map($cosConfig['region']);
 
-         $this->cosConfig['appId'] = isset($cosConfig['credentials']['appId']) ? $cosConfig['credentials']['appId'] : null;
 
-         $this->cosConfig['secretId'] = isset($cosConfig['credentials']['secretId']) ? $cosConfig['credentials']['secretId'] : "";
 
-         $this->cosConfig['secretKey'] = isset($cosConfig['credentials']['secretKey']) ? $cosConfig['credentials']['secretKey'] : "";
 
-         $this->cosConfig['anonymous'] = isset($cosConfig['credentials']['anonymous']) ? $cosConfig['anonymous']['anonymous'] : false;
 
-         $this->cosConfig['token'] = isset($cosConfig['credentials']['token']) ? $cosConfig['credentials']['token'] : null;
 
-         $this->cosConfig['timeout'] = isset($cosConfig['timeout']) ? $cosConfig['timeout'] : 3600;
 
-         $this->cosConfig['connect_timeout'] = isset($cosConfig['connect_timeout']) ? $cosConfig['connect_timeout'] : 3600;
 
-         $this->cosConfig['ip'] = isset($cosConfig['ip']) ? $cosConfig['ip'] : null;
 
-         $this->cosConfig['port'] = isset($cosConfig['port']) ? $cosConfig['port'] : null;
 
-         $this->cosConfig['endpoint'] = isset($cosConfig['endpoint']) ? $cosConfig['endpoint'] : 'myqcloud.com';
 
-         $this->cosConfig['domain'] = isset($cosConfig['domain']) ? $cosConfig['domain'] : null;
 
-         $this->cosConfig['proxy'] = isset($cosConfig['proxy']) ? $cosConfig['proxy'] : null;
 
-         $this->cosConfig['retry'] = isset($cosConfig['retry']) ? $cosConfig['retry'] : 1;
 
-         $this->cosConfig['userAgent'] = isset($cosConfig['userAgent']) ? $cosConfig['userAgent'] : 'cos-php-sdk-v5.'. Client::VERSION;
 
-         $this->cosConfig['pathStyle'] = isset($cosConfig['pathStyle']) ? $cosConfig['pathStyle'] : false;
 
-         
 
-         
 
-         $service = Service::getService();
 
-         $handler = HandlerStack::create();
 
- 		$handler->push(Middleware::mapRequest(function (RequestInterface $request) {
 
- 			return $request->withHeader('User-Agent', $this->cosConfig['userAgent']);
 
-         }));
 
-         if ($this->cosConfig['anonymous'] != true) {
 
-             $handler->push($this::handleSignature($this->cosConfig['secretId'], $this->cosConfig['secretKey']));
 
-         }
 
-         if ($this->cosConfig['token'] != null) {
 
-             $handler->push(Middleware::mapRequest(function (RequestInterface $request) {
 
-                 return $request->withHeader('x-cos-security-token', $this->cosConfig['token']);
 
-             }));
 
-         }
 
-         $handler->push($this::handleErrors());
 
-         $this->signature = new Signature($this->cosConfig['secretId'], $this->cosConfig['secretKey'], $this->cosConfig['token']);
 
-         $this->httpClient = new HttpClient([
 
-             'base_uri' => $this->cosConfig['schema'].'://cos.' . $this->cosConfig['region'] . '.myqcloud.com/',
 
-             'timeout' => $this->cosConfig['timeout'],
 
-             'handler' => $handler,
 
-             'proxy' => $this->cosConfig['proxy'],
 
-         ]);
 
-         $this->desc = new Description($service);
 
-         $this->api = (array)($this->desc->getOperations());
 
-         parent::__construct($this->httpClient, $this->desc, [$this,
 
-         'commandToRequestTransformer'], [$this, 'responseToResultTransformer'],
 
-         null);
 
-     }
 
-     public function commandToRequestTransformer(CommandInterface $command)
 
-     {
 
-         $this->action = $command->GetName();
 
-         $this->operation = $this->api[$this->action];
 
-         $transformer = new CommandToRequestTransformer($this->cosConfig, $this->operation); 
 
-         $seri = new Serializer($this->desc);
 
-         $request = $seri($command);
 
-         $request = $transformer->bucketStyleTransformer($command, $request);
 
-         $request = $transformer->uploadBodyTransformer($command, $request);
 
-         $request = $transformer->metadataTransformer($command, $request);
 
-         $request = $transformer->md5Transformer($command, $request);
 
-         $request = $transformer->specialParamTransformer($command, $request);
 
-         return $request;
 
-     }
 
-     public function responseToResultTransformer(ResponseInterface $response, RequestInterface $request, CommandInterface $command)
 
-     {
 
-         $transformer = new ResultTransformer($this->cosConfig, $this->operation); 
 
-         $transformer->writeDataToLocal($command, $request, $response);
 
-         $deseri = new Deserializer($this->desc, true);
 
-         $result = $deseri($response, $request, $command);
 
-         $result = $transformer->metaDataTransformer($command, $response, $result);
 
-         $result = $transformer->extraHeadersTransformer($command, $request, $result);
 
-         $result = $transformer->selectContentTransformer($command, $result);
 
-         return $result;
 
-     }
 
-     
 
-     public function __destruct() {
 
-     }
 
-     public function __call($method, array $args) {
 
-         for ($i = 1; $i <= $this->cosConfig['retry']; $i++) {
 
-             try {
 
-                 return parent::__call(ucfirst($method), $args);
 
-             } catch (CommandException $e) {
 
-                 if ($i != $this->cosConfig['retry']) {
 
-                     sleep(1 << ($i-1));
 
-                     continue;
 
-                 }
 
-                 $previous = $e->getPrevious();
 
-                 if ($previous !== null) {
 
-                     throw $previous;
 
-                 } else {
 
-                     throw $e;
 
-                 }
 
-             }
 
-         }
 
-     }
 
-     public function getApi() {
 
-         return $this->api;
 
-     }
 
-     private function getCosConfig() {
 
-         return $this->cosConfig;
 
-     }
 
-     private function createPresignedUrl(RequestInterface $request, $expires) {
 
-         return $this->signature->createPresignedUrl($request, $expires);
 
-     }
 
-     public function getPresignetUrl($method, $args, $expires = "+30 minutes") {
 
-         $command = $this->getCommand($method, $args);
 
-         $request = $this->commandToRequestTransformer($command);
 
-         return $this->createPresignedUrl($request, $expires);
 
-     }
 
-     public function getObjectUrl($bucket, $key, $expires = "+30 minutes", array $args = array()) {
 
-         $command = $this->getCommand('GetObject', $args + array('Bucket' => $bucket, 'Key' => $key));
 
-         $request = $this->commandToRequestTransformer($command);
 
-         return $this->createPresignedUrl($request, $expires)->__toString();
 
-     }
 
-     public function upload($bucket, $key, $body, $options = array()) {
 
-         $body = Psr7\stream_for($body);
 
-         $options['PartSize'] = isset($options['PartSize']) ? $options['PartSize'] : MultipartUpload::DEFAULT_PART_SIZE;
 
-         if ($body->getSize() < $options['PartSize']) {
 
-             $rt = $this->putObject(array(
 
-                     'Bucket' => $bucket,
 
-                     'Key'    => $key,
 
-                     'Body'   => $body,
 
-                 ) + $options);
 
-         }
 
-         else {
 
-             $multipartUpload = new MultipartUpload($this, $body, array(
 
-                     'Bucket' => $bucket,
 
-                     'Key' => $key,
 
-                 ) + $options);
 
-             $rt = $multipartUpload->performUploading();
 
-         }
 
-         return $rt;
 
-     }
 
-     public function resumeUpload($bucket, $key, $body, $uploadId, $options = array()) {
 
-         $body = Psr7\stream_for($body);
 
-         $options['PartSize'] = isset($options['PartSize']) ? $options['PartSize'] : MultipartUpload::DEFAULT_PART_SIZE;
 
-         $multipartUpload = new MultipartUpload($this, $body, array(
 
-                 'Bucket' => $bucket,
 
-                 'Key' => $key,
 
-                 'UploadId' => $uploadId,
 
-             ) + $options);
 
-         $rt = $multipartUpload->resumeUploading();
 
-         return $rt;
 
-     }
 
-     public function copy($bucket, $key, $copySource, $options = array()) {
 
-         $options['PartSize'] = isset($options['PartSize']) ? $options['PartSize'] : Copy::DEFAULT_PART_SIZE;
 
-         // set copysource client
 
-         $sourceConfig = $this->rawCosConfig;
 
-         $sourceConfig['region'] = $copySource['Region'];
 
-         $cosSourceClient = new Client($sourceConfig);
 
-         $copySource['VersionId'] = isset($copySource['VersionId']) ? $copySource['VersionId'] : "";
 
-         try {
 
-             $rt = $cosSourceClient->headObject(
 
-                 array('Bucket'=>$copySource['Bucket'],
 
-                     'Key'=>$copySource['Key'],
 
-                     'VersionId'=>$copySource['VersionId'],
 
-                 )
 
-             );
 
-         } catch (\Exception $e) {
 
-             throw $e;
 
-         }
 
-         $contentLength =$rt['ContentLength'];
 
-         // sample copy
 
-         if ($contentLength < $options['PartSize']) {
 
-             $rt = $this->copyObject(array(
 
-                     'Bucket' => $bucket,
 
-                     'Key'    => $key,
 
-                     'CopySource'   => $copySource['Bucket']. '.cos.'. $copySource['Region'].
 
-                                       ".myqcloud.com/". $copySource['Key']. "?versionId=". $copySource['VersionId'],
 
-                 ) + $options
 
-             );
 
-             return $rt;
 
-         }
 
-         // multi part copy
 
-         $copySource['ContentLength'] = $contentLength;
 
-         $copy = new Copy($this, $copySource, array(
 
-                 'Bucket' => $bucket,
 
-                 'Key'    => $key
 
-             ) + $options
 
-         );
 
-         return $copy->copy();
 
-     }
 
-     public function doesBucketExist($bucket, array $options = array())
 
-     {
 
-         try {
 
-             $this->HeadBucket(array(
 
-                 'Bucket' => $bucket));
 
-             return True;
 
-         } catch (\Exception $e){
 
-             return False;
 
-         }
 
-     }
 
-     public function doesObjectExist($bucket, $key, array $options = array())
 
-     {
 
-         try {
 
-             $this->HeadObject(array(
 
-                 'Bucket' => $bucket,
 
-                 'Key' => $key));
 
-             return True;
 
-         } catch (\Exception $e){
 
-             return False;
 
-         }
 
-     }
 
-     
 
-     public static function explodeKey($key) {
 
-         // Remove a leading slash if one is found
 
-         $split_key = explode('/', $key && $key[0] == '/' ? substr($key, 1) : $key);
 
-         // Remove empty element
 
-         $split_key = array_filter($split_key, function($var) {
 
-             return !($var == '' || $var == null);
 
-         });
 
-         $final_key = implode("/", $split_key);
 
-         if (substr($key, -1)  == '/') {
 
-             $final_key = $final_key . '/';
 
-         }
 
-         return $final_key;
 
-     }
 
-     public static function handleSignature($secretId, $secretKey) {
 
-             return function (callable $handler) use ($secretId, $secretKey) {
 
-                     return new SignatureMiddleware($handler, $secretId, $secretKey);
 
-             };
 
-     }
 
-     public static function handleErrors() {
 
-             return function (callable $handler) {
 
-                     return new ExceptionMiddleware($handler);
 
-             };
 
-     }
 
- }
 
 
  |