Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
namespace Aws\S3;
3
 
4
use Aws\CacheInterface;
5
use Aws\CommandInterface;
6
use Aws\LruArrayCache;
7
use Aws\MultiRegionClient as BaseClient;
8
use Aws\Exception\AwsException;
9
use Aws\S3\Exception\PermanentRedirectException;
10
use GuzzleHttp\Promise;
11
 
12
/**
13
 * **Amazon Simple Storage Service** multi-region client.
14
 *
15
 * @method \Aws\Result abortMultipartUpload(array $args = [])
16
 * @method \GuzzleHttp\Promise\Promise abortMultipartUploadAsync(array $args = [])
17
 * @method \Aws\Result completeMultipartUpload(array $args = [])
18
 * @method \GuzzleHttp\Promise\Promise completeMultipartUploadAsync(array $args = [])
19
 * @method \Aws\Result copyObject(array $args = [])
20
 * @method \GuzzleHttp\Promise\Promise copyObjectAsync(array $args = [])
21
 * @method \Aws\Result createBucket(array $args = [])
22
 * @method \GuzzleHttp\Promise\Promise createBucketAsync(array $args = [])
23
 * @method \Aws\Result createMultipartUpload(array $args = [])
24
 * @method \GuzzleHttp\Promise\Promise createMultipartUploadAsync(array $args = [])
25
 * @method \Aws\Result deleteBucket(array $args = [])
26
 * @method \GuzzleHttp\Promise\Promise deleteBucketAsync(array $args = [])
27
 * @method \Aws\Result deleteBucketAnalyticsConfiguration(array $args = [])
28
 * @method \GuzzleHttp\Promise\Promise deleteBucketAnalyticsConfigurationAsync(array $args = [])
29
 * @method \Aws\Result deleteBucketCors(array $args = [])
30
 * @method \GuzzleHttp\Promise\Promise deleteBucketCorsAsync(array $args = [])
31
 * @method \Aws\Result deleteBucketEncryption(array $args = [])
32
 * @method \GuzzleHttp\Promise\Promise deleteBucketEncryptionAsync(array $args = [])
33
 * @method \Aws\Result deleteBucketIntelligentTieringConfiguration(array $args = [])
34
 * @method \GuzzleHttp\Promise\Promise deleteBucketIntelligentTieringConfigurationAsync(array $args = [])
35
 * @method \Aws\Result deleteBucketInventoryConfiguration(array $args = [])
36
 * @method \GuzzleHttp\Promise\Promise deleteBucketInventoryConfigurationAsync(array $args = [])
37
 * @method \Aws\Result deleteBucketLifecycle(array $args = [])
38
 * @method \GuzzleHttp\Promise\Promise deleteBucketLifecycleAsync(array $args = [])
39
 * @method \Aws\Result deleteBucketMetricsConfiguration(array $args = [])
40
 * @method \GuzzleHttp\Promise\Promise deleteBucketMetricsConfigurationAsync(array $args = [])
41
 * @method \Aws\Result deleteBucketOwnershipControls(array $args = [])
42
 * @method \GuzzleHttp\Promise\Promise deleteBucketOwnershipControlsAsync(array $args = [])
43
 * @method \Aws\Result deleteBucketPolicy(array $args = [])
44
 * @method \GuzzleHttp\Promise\Promise deleteBucketPolicyAsync(array $args = [])
45
 * @method \Aws\Result deleteBucketReplication(array $args = [])
46
 * @method \GuzzleHttp\Promise\Promise deleteBucketReplicationAsync(array $args = [])
47
 * @method \Aws\Result deleteBucketTagging(array $args = [])
48
 * @method \GuzzleHttp\Promise\Promise deleteBucketTaggingAsync(array $args = [])
49
 * @method \Aws\Result deleteBucketWebsite(array $args = [])
50
 * @method \GuzzleHttp\Promise\Promise deleteBucketWebsiteAsync(array $args = [])
51
 * @method \Aws\Result deleteObject(array $args = [])
52
 * @method \GuzzleHttp\Promise\Promise deleteObjectAsync(array $args = [])
53
 * @method \Aws\Result deleteObjectTagging(array $args = [])
54
 * @method \GuzzleHttp\Promise\Promise deleteObjectTaggingAsync(array $args = [])
55
 * @method \Aws\Result deleteObjects(array $args = [])
56
 * @method \GuzzleHttp\Promise\Promise deleteObjectsAsync(array $args = [])
57
 * @method \Aws\Result deletePublicAccessBlock(array $args = [])
58
 * @method \GuzzleHttp\Promise\Promise deletePublicAccessBlockAsync(array $args = [])
59
 * @method \Aws\Result getBucketAccelerateConfiguration(array $args = [])
60
 * @method \GuzzleHttp\Promise\Promise getBucketAccelerateConfigurationAsync(array $args = [])
61
 * @method \Aws\Result getBucketAcl(array $args = [])
62
 * @method \GuzzleHttp\Promise\Promise getBucketAclAsync(array $args = [])
63
 * @method \Aws\Result getBucketAnalyticsConfiguration(array $args = [])
64
 * @method \GuzzleHttp\Promise\Promise getBucketAnalyticsConfigurationAsync(array $args = [])
65
 * @method \Aws\Result getBucketCors(array $args = [])
66
 * @method \GuzzleHttp\Promise\Promise getBucketCorsAsync(array $args = [])
67
 * @method \Aws\Result getBucketEncryption(array $args = [])
68
 * @method \GuzzleHttp\Promise\Promise getBucketEncryptionAsync(array $args = [])
69
 * @method \Aws\Result getBucketIntelligentTieringConfiguration(array $args = [])
70
 * @method \GuzzleHttp\Promise\Promise getBucketIntelligentTieringConfigurationAsync(array $args = [])
71
 * @method \Aws\Result getBucketInventoryConfiguration(array $args = [])
72
 * @method \GuzzleHttp\Promise\Promise getBucketInventoryConfigurationAsync(array $args = [])
73
 * @method \Aws\Result getBucketLifecycle(array $args = [])
74
 * @method \GuzzleHttp\Promise\Promise getBucketLifecycleAsync(array $args = [])
75
 * @method \Aws\Result getBucketLifecycleConfiguration(array $args = [])
76
 * @method \GuzzleHttp\Promise\Promise getBucketLifecycleConfigurationAsync(array $args = [])
77
 * @method \Aws\Result getBucketLocation(array $args = [])
78
 * @method \GuzzleHttp\Promise\Promise getBucketLocationAsync(array $args = [])
79
 * @method \Aws\Result getBucketLogging(array $args = [])
80
 * @method \GuzzleHttp\Promise\Promise getBucketLoggingAsync(array $args = [])
81
 * @method \Aws\Result getBucketMetricsConfiguration(array $args = [])
82
 * @method \GuzzleHttp\Promise\Promise getBucketMetricsConfigurationAsync(array $args = [])
83
 * @method \Aws\Result getBucketNotification(array $args = [])
84
 * @method \GuzzleHttp\Promise\Promise getBucketNotificationAsync(array $args = [])
85
 * @method \Aws\Result getBucketNotificationConfiguration(array $args = [])
86
 * @method \GuzzleHttp\Promise\Promise getBucketNotificationConfigurationAsync(array $args = [])
87
 * @method \Aws\Result getBucketOwnershipControls(array $args = [])
88
 * @method \GuzzleHttp\Promise\Promise getBucketOwnershipControlsAsync(array $args = [])
89
 * @method \Aws\Result getBucketPolicy(array $args = [])
90
 * @method \GuzzleHttp\Promise\Promise getBucketPolicyAsync(array $args = [])
91
 * @method \Aws\Result getBucketPolicyStatus(array $args = [])
92
 * @method \GuzzleHttp\Promise\Promise getBucketPolicyStatusAsync(array $args = [])
93
 * @method \Aws\Result getBucketReplication(array $args = [])
94
 * @method \GuzzleHttp\Promise\Promise getBucketReplicationAsync(array $args = [])
95
 * @method \Aws\Result getBucketRequestPayment(array $args = [])
96
 * @method \GuzzleHttp\Promise\Promise getBucketRequestPaymentAsync(array $args = [])
97
 * @method \Aws\Result getBucketTagging(array $args = [])
98
 * @method \GuzzleHttp\Promise\Promise getBucketTaggingAsync(array $args = [])
99
 * @method \Aws\Result getBucketVersioning(array $args = [])
100
 * @method \GuzzleHttp\Promise\Promise getBucketVersioningAsync(array $args = [])
101
 * @method \Aws\Result getBucketWebsite(array $args = [])
102
 * @method \GuzzleHttp\Promise\Promise getBucketWebsiteAsync(array $args = [])
103
 * @method \Aws\Result getObject(array $args = [])
104
 * @method \GuzzleHttp\Promise\Promise getObjectAsync(array $args = [])
105
 * @method \Aws\Result getObjectAcl(array $args = [])
106
 * @method \GuzzleHttp\Promise\Promise getObjectAclAsync(array $args = [])
107
 * @method \Aws\Result getObjectAttributes(array $args = [])
108
 * @method \GuzzleHttp\Promise\Promise getObjectAttributesAsync(array $args = [])
109
 * @method \Aws\Result getObjectLegalHold(array $args = [])
110
 * @method \GuzzleHttp\Promise\Promise getObjectLegalHoldAsync(array $args = [])
111
 * @method \Aws\Result getObjectLockConfiguration(array $args = [])
112
 * @method \GuzzleHttp\Promise\Promise getObjectLockConfigurationAsync(array $args = [])
113
 * @method \Aws\Result getObjectRetention(array $args = [])
114
 * @method \GuzzleHttp\Promise\Promise getObjectRetentionAsync(array $args = [])
115
 * @method \Aws\Result getObjectTagging(array $args = [])
116
 * @method \GuzzleHttp\Promise\Promise getObjectTaggingAsync(array $args = [])
117
 * @method \Aws\Result getObjectTorrent(array $args = [])
118
 * @method \GuzzleHttp\Promise\Promise getObjectTorrentAsync(array $args = [])
119
 * @method \Aws\Result getPublicAccessBlock(array $args = [])
120
 * @method \GuzzleHttp\Promise\Promise getPublicAccessBlockAsync(array $args = [])
121
 * @method \Aws\Result headBucket(array $args = [])
122
 * @method \GuzzleHttp\Promise\Promise headBucketAsync(array $args = [])
123
 * @method \Aws\Result headObject(array $args = [])
124
 * @method \GuzzleHttp\Promise\Promise headObjectAsync(array $args = [])
125
 * @method \Aws\Result listBucketAnalyticsConfigurations(array $args = [])
126
 * @method \GuzzleHttp\Promise\Promise listBucketAnalyticsConfigurationsAsync(array $args = [])
127
 * @method \Aws\Result listBucketIntelligentTieringConfigurations(array $args = [])
128
 * @method \GuzzleHttp\Promise\Promise listBucketIntelligentTieringConfigurationsAsync(array $args = [])
129
 * @method \Aws\Result listBucketInventoryConfigurations(array $args = [])
130
 * @method \GuzzleHttp\Promise\Promise listBucketInventoryConfigurationsAsync(array $args = [])
131
 * @method \Aws\Result listBucketMetricsConfigurations(array $args = [])
132
 * @method \GuzzleHttp\Promise\Promise listBucketMetricsConfigurationsAsync(array $args = [])
133
 * @method \Aws\Result listBuckets(array $args = [])
134
 * @method \GuzzleHttp\Promise\Promise listBucketsAsync(array $args = [])
135
 * @method \Aws\Result listMultipartUploads(array $args = [])
136
 * @method \GuzzleHttp\Promise\Promise listMultipartUploadsAsync(array $args = [])
137
 * @method \Aws\Result listObjectVersions(array $args = [])
138
 * @method \GuzzleHttp\Promise\Promise listObjectVersionsAsync(array $args = [])
139
 * @method \Aws\Result listObjects(array $args = [])
140
 * @method \GuzzleHttp\Promise\Promise listObjectsAsync(array $args = [])
141
 * @method \Aws\Result listObjectsV2(array $args = [])
142
 * @method \GuzzleHttp\Promise\Promise listObjectsV2Async(array $args = [])
143
 * @method \Aws\Result listParts(array $args = [])
144
 * @method \GuzzleHttp\Promise\Promise listPartsAsync(array $args = [])
145
 * @method \Aws\Result putBucketAccelerateConfiguration(array $args = [])
146
 * @method \GuzzleHttp\Promise\Promise putBucketAccelerateConfigurationAsync(array $args = [])
147
 * @method \Aws\Result putBucketAcl(array $args = [])
148
 * @method \GuzzleHttp\Promise\Promise putBucketAclAsync(array $args = [])
149
 * @method \Aws\Result putBucketAnalyticsConfiguration(array $args = [])
150
 * @method \GuzzleHttp\Promise\Promise putBucketAnalyticsConfigurationAsync(array $args = [])
151
 * @method \Aws\Result putBucketCors(array $args = [])
152
 * @method \GuzzleHttp\Promise\Promise putBucketCorsAsync(array $args = [])
153
 * @method \Aws\Result putBucketEncryption(array $args = [])
154
 * @method \GuzzleHttp\Promise\Promise putBucketEncryptionAsync(array $args = [])
155
 * @method \Aws\Result putBucketIntelligentTieringConfiguration(array $args = [])
156
 * @method \GuzzleHttp\Promise\Promise putBucketIntelligentTieringConfigurationAsync(array $args = [])
157
 * @method \Aws\Result putBucketInventoryConfiguration(array $args = [])
158
 * @method \GuzzleHttp\Promise\Promise putBucketInventoryConfigurationAsync(array $args = [])
159
 * @method \Aws\Result putBucketLifecycle(array $args = [])
160
 * @method \GuzzleHttp\Promise\Promise putBucketLifecycleAsync(array $args = [])
161
 * @method \Aws\Result putBucketLifecycleConfiguration(array $args = [])
162
 * @method \GuzzleHttp\Promise\Promise putBucketLifecycleConfigurationAsync(array $args = [])
163
 * @method \Aws\Result putBucketLogging(array $args = [])
164
 * @method \GuzzleHttp\Promise\Promise putBucketLoggingAsync(array $args = [])
165
 * @method \Aws\Result putBucketMetricsConfiguration(array $args = [])
166
 * @method \GuzzleHttp\Promise\Promise putBucketMetricsConfigurationAsync(array $args = [])
167
 * @method \Aws\Result putBucketNotification(array $args = [])
168
 * @method \GuzzleHttp\Promise\Promise putBucketNotificationAsync(array $args = [])
169
 * @method \Aws\Result putBucketNotificationConfiguration(array $args = [])
170
 * @method \GuzzleHttp\Promise\Promise putBucketNotificationConfigurationAsync(array $args = [])
171
 * @method \Aws\Result putBucketOwnershipControls(array $args = [])
172
 * @method \GuzzleHttp\Promise\Promise putBucketOwnershipControlsAsync(array $args = [])
173
 * @method \Aws\Result putBucketPolicy(array $args = [])
174
 * @method \GuzzleHttp\Promise\Promise putBucketPolicyAsync(array $args = [])
175
 * @method \Aws\Result putBucketReplication(array $args = [])
176
 * @method \GuzzleHttp\Promise\Promise putBucketReplicationAsync(array $args = [])
177
 * @method \Aws\Result putBucketRequestPayment(array $args = [])
178
 * @method \GuzzleHttp\Promise\Promise putBucketRequestPaymentAsync(array $args = [])
179
 * @method \Aws\Result putBucketTagging(array $args = [])
180
 * @method \GuzzleHttp\Promise\Promise putBucketTaggingAsync(array $args = [])
181
 * @method \Aws\Result putBucketVersioning(array $args = [])
182
 * @method \GuzzleHttp\Promise\Promise putBucketVersioningAsync(array $args = [])
183
 * @method \Aws\Result putBucketWebsite(array $args = [])
184
 * @method \GuzzleHttp\Promise\Promise putBucketWebsiteAsync(array $args = [])
185
 * @method \Aws\Result putObject(array $args = [])
186
 * @method \GuzzleHttp\Promise\Promise putObjectAsync(array $args = [])
187
 * @method \Aws\Result putObjectAcl(array $args = [])
188
 * @method \GuzzleHttp\Promise\Promise putObjectAclAsync(array $args = [])
189
 * @method \Aws\Result putObjectLegalHold(array $args = [])
190
 * @method \GuzzleHttp\Promise\Promise putObjectLegalHoldAsync(array $args = [])
191
 * @method \Aws\Result putObjectLockConfiguration(array $args = [])
192
 * @method \GuzzleHttp\Promise\Promise putObjectLockConfigurationAsync(array $args = [])
193
 * @method \Aws\Result putObjectRetention(array $args = [])
194
 * @method \GuzzleHttp\Promise\Promise putObjectRetentionAsync(array $args = [])
195
 * @method \Aws\Result putObjectTagging(array $args = [])
196
 * @method \GuzzleHttp\Promise\Promise putObjectTaggingAsync(array $args = [])
197
 * @method \Aws\Result putPublicAccessBlock(array $args = [])
198
 * @method \GuzzleHttp\Promise\Promise putPublicAccessBlockAsync(array $args = [])
199
 * @method \Aws\Result restoreObject(array $args = [])
200
 * @method \GuzzleHttp\Promise\Promise restoreObjectAsync(array $args = [])
201
 * @method \Aws\Result selectObjectContent(array $args = [])
202
 * @method \GuzzleHttp\Promise\Promise selectObjectContentAsync(array $args = [])
203
 * @method \Aws\Result uploadPart(array $args = [])
204
 * @method \GuzzleHttp\Promise\Promise uploadPartAsync(array $args = [])
205
 * @method \Aws\Result uploadPartCopy(array $args = [])
206
 * @method \GuzzleHttp\Promise\Promise uploadPartCopyAsync(array $args = [])
207
 * @method \Aws\Result writeGetObjectResponse(array $args = [])
208
 * @method \GuzzleHttp\Promise\Promise writeGetObjectResponseAsync(array $args = [])
209
 */
210
class S3MultiRegionClient extends BaseClient implements S3ClientInterface
211
{
212
    use S3ClientTrait;
213
 
214
    /** @var CacheInterface */
215
    private $cache;
216
 
217
    public static function getArguments()
218
    {
219
        $args = parent::getArguments();
220
        $regionDef = $args['region'] + ['default' => function (array &$args) {
221
            $availableRegions = array_keys($args['partition']['regions']);
222
            return end($availableRegions);
223
        }];
224
        unset($args['region']);
225
 
226
        return $args + [
227
            'bucket_region_cache' => [
228
                'type' => 'config',
229
                'valid' => [CacheInterface::class],
230
                'doc' => 'Cache of regions in which given buckets are located.',
231
                'default' => function () { return new LruArrayCache; },
232
            ],
233
            'region' => $regionDef,
234
        ];
235
    }
236
 
237
    public function __construct(array $args)
238
    {
239
        parent::__construct($args);
240
        $this->cache = $this->getConfig('bucket_region_cache');
241
 
242
        $this->getHandlerList()->prependInit(
243
            $this->determineRegionMiddleware(),
244
            'determine_region'
245
        );
246
    }
247
 
248
    private function determineRegionMiddleware()
249
    {
250
        return function (callable $handler) {
251
            return function (CommandInterface $command) use ($handler) {
252
                $cacheKey = $this->getCacheKey($command['Bucket']);
253
                if (
254
                    empty($command['@region']) &&
255
                    $region = $this->cache->get($cacheKey)
256
                ) {
257
                    $command['@region'] = $region;
258
                }
259
 
260
                return Promise\Coroutine::of(function () use (
261
                    $handler,
262
                    $command,
263
                    $cacheKey
264
                ) {
265
                    try {
266
                        yield $handler($command);
267
                    } catch (PermanentRedirectException $e) {
268
                        if (empty($command['Bucket'])) {
269
                            throw $e;
270
                        }
271
                        $result = $e->getResult();
272
                        $region = null;
273
                        if (isset($result['@metadata']['headers']['x-amz-bucket-region'])) {
274
                            $region = $result['@metadata']['headers']['x-amz-bucket-region'];
275
                            $this->cache->set($cacheKey, $region);
276
                        } else {
277
                            $region = (yield $this->determineBucketRegionAsync(
278
                                $command['Bucket']
279
                            ));
280
                        }
281
 
282
                        $command['@region'] = $region;
283
                        yield $handler($command);
284
                    } catch (AwsException $e) {
285
                        if ($e->getAwsErrorCode() === 'AuthorizationHeaderMalformed') {
286
                            $region = $this->determineBucketRegionFromExceptionBody(
287
                                $e->getResponse()
288
                            );
289
                            if (!empty($region)) {
290
                                $this->cache->set($cacheKey, $region);
291
 
292
                                $command['@region'] = $region;
293
                                yield $handler($command);
294
                            } else {
295
                                throw $e;
296
                            }
297
                        } else {
298
                            throw $e;
299
                        }
300
                    }
301
                });
302
            };
303
        };
304
    }
305
 
306
    public function createPresignedRequest(CommandInterface $command, $expires, array $options = [])
307
    {
308
        if (empty($command['Bucket'])) {
309
            throw new \InvalidArgumentException('The S3\\MultiRegionClient'
310
                . ' cannot create presigned requests for commands without a'
311
                . ' specified bucket.');
312
        }
313
 
314
        /** @var S3ClientInterface $client */
315
        $client = $this->getClientFromPool(
316
            $this->determineBucketRegion($command['Bucket'])
317
        );
318
        return $client->createPresignedRequest(
319
            $client->getCommand($command->getName(), $command->toArray()),
320
            $expires
321
        );
322
    }
323
 
324
    public function getObjectUrl($bucket, $key)
325
    {
326
        /** @var S3Client $regionalClient */
327
        $regionalClient = $this->getClientFromPool(
328
            $this->determineBucketRegion($bucket)
329
        );
330
 
331
        return $regionalClient->getObjectUrl($bucket, $key);
332
    }
333
 
334
    public function determineBucketRegionAsync($bucketName)
335
    {
336
        $cacheKey = $this->getCacheKey($bucketName);
337
        if ($cached = $this->cache->get($cacheKey)) {
338
            return Promise\Create::promiseFor($cached);
339
        }
340
 
341
        /** @var S3ClientInterface $regionalClient */
342
        $regionalClient = $this->getClientFromPool();
343
        return $regionalClient->determineBucketRegionAsync($bucketName)
344
            ->then(
345
                function ($region) use ($cacheKey) {
346
                    $this->cache->set($cacheKey, $region);
347
 
348
                    return $region;
349
                }
350
            );
351
    }
352
 
353
    private function getCacheKey($bucketName)
354
    {
355
        return "aws:s3:{$bucketName}:location";
356
    }
357
}