| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441 |
- <?php
- /**
- * Copyright 2019 Huawei Technologies Co.,Ltd.
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use
- * this file except in compliance with the License. You may obtain a copy of the
- * License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
- * CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- *
- */
- namespace Obs;
- use Obs\Log\ObsLog;
- use Obs\Internal\Common\SdkCurlFactory;
- use Obs\Internal\Common\SdkStreamHandler;
- use Obs\Internal\Common\Model;
- use Monolog\Logger;
- use GuzzleHttp\Client;
- use GuzzleHttp\HandlerStack;
- use GuzzleHttp\Handler\CurlHandler;
- use GuzzleHttp\Handler\CurlMultiHandler;
- use GuzzleHttp\Handler\Proxy;
- use GuzzleHttp\Promise\Promise;
- define('DEBUG', Logger::DEBUG);
- define('INFO', Logger::INFO);
- define('NOTICE', Logger::NOTICE);
- define('WARNING', Logger::WARNING);
- define('WARN', Logger::WARNING);
- define('ERROR', Logger::ERROR);
- define('CRITICAL', Logger::CRITICAL);
- define('ALERT', Logger::ALERT);
- define('EMERGENCY', Logger::EMERGENCY);
- /**
- * @method Model createPostSignature(array $args=[]);
- * @method Model createSignedUrl(array $args=[]);
- * @method Model createBucket(array $args = []);
- * @method Model listBuckets();
- * @method Model deleteBucket(array $args = []);
- * @method Model listObjects(array $args = []);
- * @method Model listVersions(array $args = []);
- * @method Model headBucket(array $args = []);
- * @method Model getBucketMetadata(array $args = []);
- * @method Model getBucketLocation(array $args = []);
- * @method Model getBucketStorageInfo(array $args = []);
- * @method Model setBucketQuota(array $args = []);
- * @method Model getBucketQuota(array $args = []);
- * @method Model setBucketStoragePolicy(array $args = []);
- * @method Model getBucketStoragePolicy(array $args = []);
- * @method Model setBucketAcl(array $args = []);
- * @method Model getBucketAcl(array $args = []);
- * @method Model setBucketLogging(array $args = []);
- * @method Model getBucketLogging(array $args = []);
- * @method Model setBucketPolicy(array $args = []);
- * @method Model getBucketPolicy(array $args = []);
- * @method Model deleteBucketPolicy(array $args = []);
- * @method Model setBucketLifecycle(array $args = []);
- * @method Model getBucketLifecycle(array $args = []);
- * @method Model deleteBucketLifecycle(array $args = []);
- * @method Model setBucketWebsite(array $args = []);
- * @method Model getBucketWebsite(array $args = []);
- * @method Model deleteBucketWebsite(array $args = []);
- * @method Model setBucketVersioning(array $args = []);
- * @method Model getBucketVersioning(array $args = []);
- * @method Model setBucketCors(array $args = []);
- * @method Model getBucketCors(array $args = []);
- * @method Model deleteBucketCors(array $args = []);
- * @method Model setBucketNotification(array $args = []);
- * @method Model getBucketNotification(array $args = []);
- * @method Model setBucketTagging(array $args = []);
- * @method Model getBucketTagging(array $args = []);
- * @method Model setBucketCustomDomain(array $args = []);
- * @method Model getBucketCustomDomain(array $args = []);
- * @method Model deleteBucketCustomDomain(array $args = []);
- * @method Model deleteBucketTagging(array $args = []);
- * @method Model optionsBucket(array $args = []);
- * @method Model getFetchPolicy(array $args = []);
- * @method Model setFetchPolicy(array $args = []);
- * @method Model deleteFetchPolicy(array $args = []);
- * @method Model setFetchJob(array $args = []);
- * @method Model getFetchJob(array $args = []);
- *
- * @method Model putObject(array $args = []);
- * @method Model getObject(array $args = []);
- * @method Model setObjectTagging(array $args = []);
- * @method Model deleteObjectTagging(array $args = []);
- * @method Model getObjectTagging(array $args = []);
- * @method Model copyObject(array $args = []);
- * @method Model deleteObject(array $args = []);
- * @method Model deleteObjects(array $args = []);
- * @method Model getObjectMetadata(array $args = []);
- * @method Model setObjectAcl(array $args = []);
- * @method Model getObjectAcl(array $args = []);
- * @method Model initiateMultipartUpload(array $args = []);
- * @method Model uploadPart(array $args = []);
- * @method Model copyPart(array $args = []);
- * @method Model listParts(array $args = []);
- * @method Model completeMultipartUpload(array $args = []);
- * @method Model abortMultipartUpload(array $args = []);
- * @method Model listMultipartUploads(array $args = []);
- * @method Model optionsObject(array $args = []);
- * @method Model restoreObject(array $args = []);
- *
- * @method Promise createBucketAsync(array $args = [], callable $callback);
- * @method Promise listBucketsAsync(callable $callback);
- * @method Promise deleteBucketAsync(array $args = [], callable $callback);
- * @method Promise listObjectsAsync(array $args = [], callable $callback);
- * @method Promise listVersionsAsync(array $args = [], callable $callback);
- * @method Promise headBucketAsync(array $args = [], callable $callback);
- * @method Promise getBucketMetadataAsync(array $args = [], callable $callback);
- * @method Promise getBucketLocationAsync(array $args = [], callable $callback);
- * @method Promise getBucketStorageInfoAsync(array $args = [], callable $callback);
- * @method Promise setBucketQuotaAsync(array $args = [], callable $callback);
- * @method Promise getBucketQuotaAsync(array $args = [], callable $callback);
- * @method Promise setBucketStoragePolicyAsync(array $args = [], callable $callback);
- * @method Promise getBucketStoragePolicyAsync(array $args = [], callable $callback);
- * @method Promise setBucketAclAsync(array $args = [], callable $callback);
- * @method Promise getBucketAclAsync(array $args = [], callable $callback);
- * @method Promise setBucketLoggingAsync(array $args = [], callable $callback);
- * @method Promise getBucketLoggingAsync(array $args = [], callable $callback);
- * @method Promise setBucketPolicyAsync(array $args = [], callable $callback);
- * @method Promise getBucketPolicyAsync(array $args = [], callable $callback);
- * @method Promise deleteBucketPolicyAsync(array $args = [], callable $callback);
- * @method Promise setBucketLifecycleAsync(array $args = [], callable $callback);
- * @method Promise getBucketLifecycleAsync(array $args = [], callable $callback);
- * @method Promise deleteBucketLifecycleAsync(array $args = [], callable $callback);
- * @method Promise setBucketWebsiteAsync(array $args = [], callable $callback);
- * @method Promise getBucketWebsiteAsync(array $args = [], callable $callback);
- * @method Promise deleteBucketWebsiteAsync(array $args = [], callable $callback);
- * @method Promise setBucketVersioningAsync(array $args = [], callable $callback);
- * @method Promise getBucketVersioningAsync(array $args = [], callable $callback);
- * @method Promise setBucketCorsAsync(array $args = [], callable $callback);
- * @method Promise getBucketCorsAsync(array $args = [], callable $callback);
- * @method Promise deleteBucketCorsAsync(array $args = [], callable $callback);
- * @method Promise setBucketNotificationAsync(array $args = [], callable $callback);
- * @method Promise getBucketNotificationAsync(array $args = [], callable $callback);
- * @method Promise setBucketTaggingAsync(array $args = [], callable $callback);
- * @method Promise getBucketTaggingAsync(array $args = [], callable $callback);
- * @method Promise setBucketCustomDomainAsync(array $args = [], callable $callback);
- * @method Promise getBucketCustomDomainAsync(array $args = [], callable $callback);
- * @method Promise deleteBucketCustomDomainAsync(array $args = [], callable $callback);
- * @method Promise deleteBucketTaggingAsync(array $args = [], callable $callback);
- * @method Promise optionsBucketAsync(array $args = [], callable $callback);
- *
- * @method Promise putObjectAsync(array $args = [], callable $callback);
- * @method Promise getObjectAsync(array $args = [], callable $callback);
- * @method Promise setObjectTaggingAsync(array $args = [], callable $callback);
- * @method Promise deleteObjectTaggingAsync(array $args = [], callable $callback);
- * @method Promise getObjectTaggingAsync(array $args = [], callable $callback);
- * @method Promise copyObjectAsync(array $args = [], callable $callback);
- * @method Promise deleteObjectAsync(array $args = [], callable $callback);
- * @method Promise deleteObjectsAsync(array $args = [], callable $callback);
- * @method Promise getObjectMetadataAsync(array $args = [], callable $callback);
- * @method Promise setObjectAclAsync(array $args = [], callable $callback);
- * @method Promise getObjectAclAsync(array $args = [], callable $callback);
- * @method Promise initiateMultipartUploadAsync(array $args = [], callable $callback);
- * @method Promise uploadPartAsync(array $args = [], callable $callback);
- * @method Promise copyPartAsync(array $args = [], callable $callback);
- * @method Promise listPartsAsync(array $args = [], callable $callback);
- * @method Promise completeMultipartUploadAsync(array $args = [], callable $callback);
- * @method Promise abortMultipartUploadAsync(array $args = [], callable $callback);
- * @method Promise listMultipartUploadsAsync(array $args = [], callable $callback);
- * @method Promise optionsObjectAsync(array $args = [], callable $callback);
- * @method Promise restoreObjectAsync(array $args = [], callable $callback);
- * @method Promise getFetchPolicyAsync(array $args = [], callable $callback);
- * @method Promise setFetchPolicyAsync(array $args = [], callable $callback);
- * @method Promise deleteFetchPolicyAsync(array $args = [], callable $callback);
- * @method Promise setFetchJobAsync(array $args = [], callable $callback);
- * @method Promise getFetchJobAsync(array $args = [], callable $callback);
- *
- */
- class ObsClient
- {
- const SDK_VERSION = '3.23.10';
- const AclPrivate = 'private';
- const AclPublicRead = 'public-read';
- const AclPublicReadWrite = 'public-read-write';
- const AclPublicReadDelivered = 'public-read-delivered';
- const AclPublicReadWriteDelivered = 'public-read-write-delivered';
- const AclAuthenticatedRead = 'authenticated-read';
- const AclBucketOwnerRead = 'bucket-owner-read';
- const AclBucketOwnerFullControl = 'bucket-owner-full-control';
- const AclLogDeliveryWrite = 'log-delivery-write';
- const StorageClassStandard = 'STANDARD';
- const StorageClassWarm = 'WARM';
- const StorageClassCold = 'COLD';
- const PermissionRead = 'READ';
- const PermissionWrite = 'WRITE';
- const PermissionReadAcp = 'READ_ACP';
- const PermissionWriteAcp = 'WRITE_ACP';
- const PermissionFullControl = 'FULL_CONTROL';
- const AllUsers = 'Everyone';
- const GroupAllUsers = 'AllUsers';
- const GroupAuthenticatedUsers = 'AuthenticatedUsers';
- const GroupLogDelivery = 'LogDelivery';
- const RestoreTierExpedited = 'Expedited';
- const RestoreTierStandard = 'Standard';
- const RestoreTierBulk = 'Bulk';
- const GranteeGroup = 'Group';
- const GranteeUser = 'CanonicalUser';
- const CopyMetadata = 'COPY';
- const ReplaceMetadata = 'REPLACE';
- const SignatureV2 = 'v2';
- const SignatureV4 = 'v4';
- const SigantureObs = 'obs';
- const ObjectCreatedAll = 'ObjectCreated:*';
- const ObjectCreatedPut = 'ObjectCreated:Put';
- const ObjectCreatedPost = 'ObjectCreated:Post';
- const ObjectCreatedCopy = 'ObjectCreated:Copy';
- const ObjectCreatedCompleteMultipartUpload = 'ObjectCreated:CompleteMultipartUpload';
- const ObjectRemovedAll = 'ObjectRemoved:*';
- const ObjectRemovedDelete = 'ObjectRemoved:Delete';
- const ObjectRemovedDeleteMarkerCreated = 'ObjectRemoved:DeleteMarkerCreated';
- use Internal\SendRequestTrait;
- use Internal\GetResponseTrait;
- private $factorys;
- public function __construct(array $config = [])
- {
- $this->factorys = [];
- $this->ak = strval($config['key']);
- $this->sk = strval($config['secret']);
- if (isset($config['security_token'])) {
- $this->securityToken = strval($config['security_token']);
- }
- if (isset($config['endpoint'])) {
- $this->endpoint = trim(strval($config['endpoint']));
- }
- if ($this->endpoint === '') {
- throw new \InvalidArgumentException('endpoint is not set');
- }
- while ($this->endpoint[strlen($this->endpoint) - 1] === '/') {
- $this->endpoint = substr($this->endpoint, 0, strlen($this->endpoint) - 1);
- }
- if (strpos($this->endpoint, 'http') !== 0) {
- $this->endpoint = 'https://' . $this->endpoint;
- }
- if (isset($config['signature'])) {
- $this->signature = strval($config['signature']);
- }
- if (isset($config['path_style'])) {
- $this->pathStyle = $config['path_style'];
- }
- if (isset($config['region'])) {
- $this->region = strval($config['region']);
- }
- if (isset($config['ssl_verify'])) {
- $this->sslVerify = $config['ssl_verify'];
- } elseif (isset($config['ssl.certificate_authority'])) {
- $this->sslVerify = $config['ssl.certificate_authority'];
- } else {
- // nothing handle
- }
- if (isset($config['max_retry_count'])) {
- $this->maxRetryCount = intval($config['max_retry_count']);
- }
- if (isset($config['timeout'])) {
- $this->timeout = intval($config['timeout']);
- }
- if (isset($config['socket_timeout'])) {
- $this->socketTimeout = intval($config['socket_timeout']);
- }
- if (isset($config['connect_timeout'])) {
- $this->connectTimeout = intval($config['connect_timeout']);
- }
- if (isset($config['chunk_size'])) {
- $this->chunkSize = intval($config['chunk_size']);
- }
- if (isset($config['exception_response_mode'])) {
- $this->exceptionResponseMode = $config['exception_response_mode'];
- }
- if (isset($config['is_cname'])) {
- $this->isCname = $config['is_cname'];
- }
- $host = parse_url($this->endpoint)['host'];
- if (filter_var($host, FILTER_VALIDATE_IP) !== false) {
- $this->pathStyle = true;
- }
- $handler = self::chooseHandler($this);
- $this->httpClient = self::createHttpClient($handler);
- }
- private function createHttpClient($handler)
- {
- return new Client(
- [
- 'timeout' => 0,
- 'read_timeout' => $this->socketTimeout,
- 'connect_timeout' => $this->connectTimeout,
- 'allow_redirects' => false,
- 'verify' => $this->sslVerify,
- 'expect' => false,
- 'handler' => HandlerStack::create($handler),
- 'curl' => [
- CURLOPT_BUFFERSIZE => $this->chunkSize,
- ],
- ]
- );
- }
- public function __destruct()
- {
- $this->close();
- }
- public function refresh($key, $secret, $securityToken = false)
- {
- $this->ak = strval($key);
- $this->sk = strval($secret);
- if ($securityToken) {
- $this->securityToken = strval($securityToken);
- }
- }
- /**
- * Get the default User-Agent string to use with Guzzle
- *
- * @return string
- */
- public static function getDefaultUserAgent()
- {
- static $defaultAgent = '';
- if (!$defaultAgent) {
- $defaultAgent = 'obs-sdk-php/' . self::SDK_VERSION;
- }
- return $defaultAgent;
- }
- /**
- * Factory method to create a new Obs client using an array of configuration options.
- *
- * @param array $config Client configuration data
- *
- * @return ObsClient
- */
- public static function factory(array $config = [])
- {
- return new ObsClient($config);
- }
- public function close()
- {
- if ($this->factorys) {
- foreach ($this->factorys as $factory) {
- $factory->close();
- }
- }
- }
- public function initLog(array $logConfig = [])
- {
- ObsLog::initLog($logConfig);
- $msg = [];
- $msg[] = '[OBS SDK Version=' . self::SDK_VERSION;
- $msg[] = 'Endpoint=' . $this->endpoint;
- $msg[] = 'Access Mode=' . ($this->pathStyle ? 'Path' : 'Virtual Hosting') . ']';
- ObsLog::commonLog(WARNING, implode("];[", $msg));
- }
- private static function chooseHandler($obsclient)
- {
- $handler = null;
- if (function_exists('curl_multi_exec') && function_exists('curl_exec')) {
- $f1 = new SdkCurlFactory(50);
- $f2 = new SdkCurlFactory(3);
- $obsclient->factorys[] = $f1;
- $obsclient->factorys[] = $f2;
- $handler = Proxy::wrapSync(
- new CurlMultiHandler(['handle_factory' => $f1]),
- new CurlHandler(['handle_factory' => $f2])
- );
- } elseif (function_exists('curl_exec')) {
- $f = new SdkCurlFactory(3);
- $obsclient->factorys[] = $f;
- $handler = new CurlHandler(['handle_factory' => $f]);
- } elseif (function_exists('curl_multi_exec')) {
- $f = new SdkCurlFactory(50);
- $obsclient->factorys[] = $f;
- $handler = new CurlMultiHandler(['handle_factory' => $f]);
- } else {
- // nothing handle
- }
- if (ini_get('allow_url_fopen')) {
- $handler = $handler
- ? Proxy::wrapStreaming($handler, new SdkStreamHandler())
- : new SdkStreamHandler();
- } elseif (!$handler) {
- throw new \UnexpectedValueException(
- 'GuzzleHttp requires cURL, the allow_url_fopen ini setting, or a custom HTTP handler.');
- } else {
- // nothing handle
- }
- return $handler;
- }
- }
|