Вход Регистрация
Файл: sngine-v2.8/Script/includes/libs/AWS/Aws/S3/S3MultiRegionClient.php
Строк: 474
<?php
namespace AwsS3;

use 
AwsCacheInterface;
use 
AwsCommandInterface;
use 
AwsLruArrayCache;
use 
AwsMultiRegionClient as BaseClient;
use 
AwsExceptionAwsException;
use 
AwsS3ExceptionPermanentRedirectException;
use 
GuzzleHttpPromise;

/**
 * **Amazon Simple Storage Service** multi-region client.
 *
 * @method AwsResult abortMultipartUpload(array $args = [])
 * @method GuzzleHttpPromisePromise abortMultipartUploadAsync(array $args = [])
 * @method AwsResult completeMultipartUpload(array $args = [])
 * @method GuzzleHttpPromisePromise completeMultipartUploadAsync(array $args = [])
 * @method AwsResult copyObject(array $args = [])
 * @method GuzzleHttpPromisePromise copyObjectAsync(array $args = [])
 * @method AwsResult createBucket(array $args = [])
 * @method GuzzleHttpPromisePromise createBucketAsync(array $args = [])
 * @method AwsResult createMultipartUpload(array $args = [])
 * @method GuzzleHttpPromisePromise createMultipartUploadAsync(array $args = [])
 * @method AwsResult deleteBucket(array $args = [])
 * @method GuzzleHttpPromisePromise deleteBucketAsync(array $args = [])
 * @method AwsResult deleteBucketAnalyticsConfiguration(array $args = [])
 * @method GuzzleHttpPromisePromise deleteBucketAnalyticsConfigurationAsync(array $args = [])
 * @method AwsResult deleteBucketCors(array $args = [])
 * @method GuzzleHttpPromisePromise deleteBucketCorsAsync(array $args = [])
 * @method AwsResult deleteBucketEncryption(array $args = [])
 * @method GuzzleHttpPromisePromise deleteBucketEncryptionAsync(array $args = [])
 * @method AwsResult deleteBucketInventoryConfiguration(array $args = [])
 * @method GuzzleHttpPromisePromise deleteBucketInventoryConfigurationAsync(array $args = [])
 * @method AwsResult deleteBucketLifecycle(array $args = [])
 * @method GuzzleHttpPromisePromise deleteBucketLifecycleAsync(array $args = [])
 * @method AwsResult deleteBucketMetricsConfiguration(array $args = [])
 * @method GuzzleHttpPromisePromise deleteBucketMetricsConfigurationAsync(array $args = [])
 * @method AwsResult deleteBucketPolicy(array $args = [])
 * @method GuzzleHttpPromisePromise deleteBucketPolicyAsync(array $args = [])
 * @method AwsResult deleteBucketReplication(array $args = [])
 * @method GuzzleHttpPromisePromise deleteBucketReplicationAsync(array $args = [])
 * @method AwsResult deleteBucketTagging(array $args = [])
 * @method GuzzleHttpPromisePromise deleteBucketTaggingAsync(array $args = [])
 * @method AwsResult deleteBucketWebsite(array $args = [])
 * @method GuzzleHttpPromisePromise deleteBucketWebsiteAsync(array $args = [])
 * @method AwsResult deleteObject(array $args = [])
 * @method GuzzleHttpPromisePromise deleteObjectAsync(array $args = [])
 * @method AwsResult deleteObjectTagging(array $args = [])
 * @method GuzzleHttpPromisePromise deleteObjectTaggingAsync(array $args = [])
 * @method AwsResult deleteObjects(array $args = [])
 * @method GuzzleHttpPromisePromise deleteObjectsAsync(array $args = [])
 * @method AwsResult deletePublicAccessBlock(array $args = [])
 * @method GuzzleHttpPromisePromise deletePublicAccessBlockAsync(array $args = [])
 * @method AwsResult getBucketAccelerateConfiguration(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketAccelerateConfigurationAsync(array $args = [])
 * @method AwsResult getBucketAcl(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketAclAsync(array $args = [])
 * @method AwsResult getBucketAnalyticsConfiguration(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketAnalyticsConfigurationAsync(array $args = [])
 * @method AwsResult getBucketCors(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketCorsAsync(array $args = [])
 * @method AwsResult getBucketEncryption(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketEncryptionAsync(array $args = [])
 * @method AwsResult getBucketInventoryConfiguration(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketInventoryConfigurationAsync(array $args = [])
 * @method AwsResult getBucketLifecycle(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketLifecycleAsync(array $args = [])
 * @method AwsResult getBucketLifecycleConfiguration(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketLifecycleConfigurationAsync(array $args = [])
 * @method AwsResult getBucketLocation(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketLocationAsync(array $args = [])
 * @method AwsResult getBucketLogging(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketLoggingAsync(array $args = [])
 * @method AwsResult getBucketMetricsConfiguration(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketMetricsConfigurationAsync(array $args = [])
 * @method AwsResult getBucketNotification(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketNotificationAsync(array $args = [])
 * @method AwsResult getBucketNotificationConfiguration(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketNotificationConfigurationAsync(array $args = [])
 * @method AwsResult getBucketPolicy(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketPolicyAsync(array $args = [])
 * @method AwsResult getBucketPolicyStatus(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketPolicyStatusAsync(array $args = [])
 * @method AwsResult getBucketReplication(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketReplicationAsync(array $args = [])
 * @method AwsResult getBucketRequestPayment(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketRequestPaymentAsync(array $args = [])
 * @method AwsResult getBucketTagging(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketTaggingAsync(array $args = [])
 * @method AwsResult getBucketVersioning(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketVersioningAsync(array $args = [])
 * @method AwsResult getBucketWebsite(array $args = [])
 * @method GuzzleHttpPromisePromise getBucketWebsiteAsync(array $args = [])
 * @method AwsResult getObject(array $args = [])
 * @method GuzzleHttpPromisePromise getObjectAsync(array $args = [])
 * @method AwsResult getObjectAcl(array $args = [])
 * @method GuzzleHttpPromisePromise getObjectAclAsync(array $args = [])
 * @method AwsResult getObjectLegalHold(array $args = [])
 * @method GuzzleHttpPromisePromise getObjectLegalHoldAsync(array $args = [])
 * @method AwsResult getObjectLockConfiguration(array $args = [])
 * @method GuzzleHttpPromisePromise getObjectLockConfigurationAsync(array $args = [])
 * @method AwsResult getObjectRetention(array $args = [])
 * @method GuzzleHttpPromisePromise getObjectRetentionAsync(array $args = [])
 * @method AwsResult getObjectTagging(array $args = [])
 * @method GuzzleHttpPromisePromise getObjectTaggingAsync(array $args = [])
 * @method AwsResult getObjectTorrent(array $args = [])
 * @method GuzzleHttpPromisePromise getObjectTorrentAsync(array $args = [])
 * @method AwsResult getPublicAccessBlock(array $args = [])
 * @method GuzzleHttpPromisePromise getPublicAccessBlockAsync(array $args = [])
 * @method AwsResult headBucket(array $args = [])
 * @method GuzzleHttpPromisePromise headBucketAsync(array $args = [])
 * @method AwsResult headObject(array $args = [])
 * @method GuzzleHttpPromisePromise headObjectAsync(array $args = [])
 * @method AwsResult listBucketAnalyticsConfigurations(array $args = [])
 * @method GuzzleHttpPromisePromise listBucketAnalyticsConfigurationsAsync(array $args = [])
 * @method AwsResult listBucketInventoryConfigurations(array $args = [])
 * @method GuzzleHttpPromisePromise listBucketInventoryConfigurationsAsync(array $args = [])
 * @method AwsResult listBucketMetricsConfigurations(array $args = [])
 * @method GuzzleHttpPromisePromise listBucketMetricsConfigurationsAsync(array $args = [])
 * @method AwsResult listBuckets(array $args = [])
 * @method GuzzleHttpPromisePromise listBucketsAsync(array $args = [])
 * @method AwsResult listMultipartUploads(array $args = [])
 * @method GuzzleHttpPromisePromise listMultipartUploadsAsync(array $args = [])
 * @method AwsResult listObjectVersions(array $args = [])
 * @method GuzzleHttpPromisePromise listObjectVersionsAsync(array $args = [])
 * @method AwsResult listObjects(array $args = [])
 * @method GuzzleHttpPromisePromise listObjectsAsync(array $args = [])
 * @method AwsResult listObjectsV2(array $args = [])
 * @method GuzzleHttpPromisePromise listObjectsV2Async(array $args = [])
 * @method AwsResult listParts(array $args = [])
 * @method GuzzleHttpPromisePromise listPartsAsync(array $args = [])
 * @method AwsResult putBucketAccelerateConfiguration(array $args = [])
 * @method GuzzleHttpPromisePromise putBucketAccelerateConfigurationAsync(array $args = [])
 * @method AwsResult putBucketAcl(array $args = [])
 * @method GuzzleHttpPromisePromise putBucketAclAsync(array $args = [])
 * @method AwsResult putBucketAnalyticsConfiguration(array $args = [])
 * @method GuzzleHttpPromisePromise putBucketAnalyticsConfigurationAsync(array $args = [])
 * @method AwsResult putBucketCors(array $args = [])
 * @method GuzzleHttpPromisePromise putBucketCorsAsync(array $args = [])
 * @method AwsResult putBucketEncryption(array $args = [])
 * @method GuzzleHttpPromisePromise putBucketEncryptionAsync(array $args = [])
 * @method AwsResult putBucketInventoryConfiguration(array $args = [])
 * @method GuzzleHttpPromisePromise putBucketInventoryConfigurationAsync(array $args = [])
 * @method AwsResult putBucketLifecycle(array $args = [])
 * @method GuzzleHttpPromisePromise putBucketLifecycleAsync(array $args = [])
 * @method AwsResult putBucketLifecycleConfiguration(array $args = [])
 * @method GuzzleHttpPromisePromise putBucketLifecycleConfigurationAsync(array $args = [])
 * @method AwsResult putBucketLogging(array $args = [])
 * @method GuzzleHttpPromisePromise putBucketLoggingAsync(array $args = [])
 * @method AwsResult putBucketMetricsConfiguration(array $args = [])
 * @method GuzzleHttpPromisePromise putBucketMetricsConfigurationAsync(array $args = [])
 * @method AwsResult putBucketNotification(array $args = [])
 * @method GuzzleHttpPromisePromise putBucketNotificationAsync(array $args = [])
 * @method AwsResult putBucketNotificationConfiguration(array $args = [])
 * @method GuzzleHttpPromisePromise putBucketNotificationConfigurationAsync(array $args = [])
 * @method AwsResult putBucketPolicy(array $args = [])
 * @method GuzzleHttpPromisePromise putBucketPolicyAsync(array $args = [])
 * @method AwsResult putBucketReplication(array $args = [])
 * @method GuzzleHttpPromisePromise putBucketReplicationAsync(array $args = [])
 * @method AwsResult putBucketRequestPayment(array $args = [])
 * @method GuzzleHttpPromisePromise putBucketRequestPaymentAsync(array $args = [])
 * @method AwsResult putBucketTagging(array $args = [])
 * @method GuzzleHttpPromisePromise putBucketTaggingAsync(array $args = [])
 * @method AwsResult putBucketVersioning(array $args = [])
 * @method GuzzleHttpPromisePromise putBucketVersioningAsync(array $args = [])
 * @method AwsResult putBucketWebsite(array $args = [])
 * @method GuzzleHttpPromisePromise putBucketWebsiteAsync(array $args = [])
 * @method AwsResult putObject(array $args = [])
 * @method GuzzleHttpPromisePromise putObjectAsync(array $args = [])
 * @method AwsResult putObjectAcl(array $args = [])
 * @method GuzzleHttpPromisePromise putObjectAclAsync(array $args = [])
 * @method AwsResult putObjectLegalHold(array $args = [])
 * @method GuzzleHttpPromisePromise putObjectLegalHoldAsync(array $args = [])
 * @method AwsResult putObjectLockConfiguration(array $args = [])
 * @method GuzzleHttpPromisePromise putObjectLockConfigurationAsync(array $args = [])
 * @method AwsResult putObjectRetention(array $args = [])
 * @method GuzzleHttpPromisePromise putObjectRetentionAsync(array $args = [])
 * @method AwsResult putObjectTagging(array $args = [])
 * @method GuzzleHttpPromisePromise putObjectTaggingAsync(array $args = [])
 * @method AwsResult putPublicAccessBlock(array $args = [])
 * @method GuzzleHttpPromisePromise putPublicAccessBlockAsync(array $args = [])
 * @method AwsResult restoreObject(array $args = [])
 * @method GuzzleHttpPromisePromise restoreObjectAsync(array $args = [])
 * @method AwsResult selectObjectContent(array $args = [])
 * @method GuzzleHttpPromisePromise selectObjectContentAsync(array $args = [])
 * @method AwsResult uploadPart(array $args = [])
 * @method GuzzleHttpPromisePromise uploadPartAsync(array $args = [])
 * @method AwsResult uploadPartCopy(array $args = [])
 * @method GuzzleHttpPromisePromise uploadPartCopyAsync(array $args = [])
 */
class S3MultiRegionClient extends BaseClient implements S3ClientInterface
{
    use 
S3ClientTrait;

    
/** @var CacheInterface */
    
private $cache;

    public static function 
getArguments()
    {
        
$args parent::getArguments();
        
$regionDef $args['region'] + ['default' => function (array &$args) {
            
$availableRegions array_keys($args['partition']['regions']);
            return 
end($availableRegions);
        }];
        unset(
$args['region']);

        return 
$args + [
            
'bucket_region_cache' => [
                
'type' => 'config',
                
'valid' => [CacheInterface::class],
                
'doc' => 'Cache of regions in which given buckets are located.',
                
'default' => function () { return new LruArrayCache; },
            ],
            
'region' => $regionDef,
        ];
    }

    public function 
__construct(array $args)
    {
        
parent::__construct($args);
        
$this->cache $this->getConfig('bucket_region_cache');

        
$this->getHandlerList()->prependInit(
            
$this->determineRegionMiddleware(),
            
'determine_region'
        
);
    }

    private function 
determineRegionMiddleware()
    {
        return function (callable 
$handler) {
            return function (
CommandInterface $command) use ($handler) {
                
$cacheKey $this->getCacheKey($command['Bucket']);
                if (
                    empty(
$command['@region']) &&
                    
$region $this->cache->get($cacheKey)
                ) {
                    
$command['@region'] = $region;
                }

                return 
Promisecoroutine(function () use (
                    
$handler,
                    
$command,
                    
$cacheKey
                
) {
                    try {
                        yield 
$handler($command);
                    } catch (
PermanentRedirectException $e) {
                        if (empty(
$command['Bucket'])) {
                            throw 
$e;
                        }
                        
$result $e->getResult();
                        
$region null;
                        if (isset(
$result['@metadata']['headers']['x-amz-bucket-region'])) {
                            
$region $result['@metadata']['headers']['x-amz-bucket-region'];
                            
$this->cache->set($cacheKey$region);
                        } else {
                            
$region = (yield $this->determineBucketRegionAsync(
                                
$command['Bucket']
                            ));
                        }

                        
$command['@region'] = $region;
                        yield 
$handler($command);
                    } catch (
AwsException $e) {
                        if (
$e->getAwsErrorCode() === 'AuthorizationHeaderMalformed') {
                            
$region $this->determineBucketRegionFromExceptionBody(
                                
$e->getResponse()
                            );
                            if (!empty(
$region)) {
                                
$this->cache->set($cacheKey$region);

                                
$command['@region'] = $region;
                                yield 
$handler($command);
                            } else {
                                throw 
$e;
                            }
                        } else {
                            throw 
$e;
                        }
                    }
                });
            };
        };
    }

    public function 
createPresignedRequest(CommandInterface $command$expires, array $options = [])
    {
        if (empty(
$command['Bucket'])) {
            throw new 
InvalidArgumentException('The S3\MultiRegionClient'
                
' cannot create presigned requests for commands without a'
                
' specified bucket.');
        }

        
/** @var S3ClientInterface $client */
        
$client $this->getClientFromPool(
            
$this->determineBucketRegion($command['Bucket'])
        );
        return 
$client->createPresignedRequest(
            
$client->getCommand($command->getName(), $command->toArray()),
            
$expires
        
);
    }

    public function 
getObjectUrl($bucket$key)
    {
        
/** @var S3Client $regionalClient */
        
$regionalClient $this->getClientFromPool(
            
$this->determineBucketRegion($bucket)
        );

        return 
$regionalClient->getObjectUrl($bucket$key);
    }

    public function 
determineBucketRegionAsync($bucketName)
    {
        
$cacheKey $this->getCacheKey($bucketName);
        if (
$cached $this->cache->get($cacheKey)) {
            return 
Promisepromise_for($cached);
        }

        
/** @var S3ClientInterface $regionalClient */
        
$regionalClient $this->getClientFromPool();
        return 
$regionalClient->determineBucketRegionAsync($bucketName)
            ->
then(
                function (
$region) use ($cacheKey) {
                    
$this->cache->set($cacheKey$region);

                    return 
$region;
                }
            );
    }

    private function 
getCacheKey($bucketName)
    {
        return 
"aws:s3:{$bucketName}:location";
    }
}
Онлайн: 0
Реклама