]> source.dussan.org Git - nextcloud-server.git/commitdiff
Upgrade AWS sdk to 2.7.5
authorJohan Björk <johanimon@gmail.com>
Thu, 13 Nov 2014 22:37:34 +0000 (23:37 +0100)
committerJohan Björk <johanimon@gmail.com>
Thu, 13 Nov 2014 22:37:34 +0000 (23:37 +0100)
51 files changed:
apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Aws.php
apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Client/AbstractClient.php
apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Client/ClientBuilder.php
apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Enum/Region.php
apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Hash/HashUtils.php
apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Model/MultipartUpload/AbstractUploadBuilder.php
apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Resources/aws-config.php
apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Resources/public-endpoints.php [new file with mode: 0644]
apps/files_external/3rdparty/aws-sdk-php/Aws/Common/RulesEndpointProvider.php [new file with mode: 0644]
apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Signature/SignatureV4.php
apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/Acp.php
apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/AcpBuilder.php
apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/ClearBucket.php
apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/DeleteObjectsBatch.php
apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/DeleteObjectsTransfer.php
apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/Grant.php
apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/Grantee.php
apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/MultipartUpload/UploadBuilder.php
apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Resources/s3-2006-03-01.php
apps/files_external/3rdparty/aws-sdk-php/Aws/S3/S3Client.php
apps/files_external/3rdparty/aws-sdk-php/Aws/S3/S3SignatureV4.php
apps/files_external/3rdparty/aws-sdk-php/Aws/S3/StreamWrapper.php
apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Sync/AbstractSyncBuilder.php
apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Sync/DownloadSyncBuilder.php
apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Sync/UploadSyncBuilder.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/ApcClassLoader.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/ClassMapGenerator.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Psr4ClassLoader.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/README.md
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/ApcUniversalClassLoaderTest.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/ClassMapGeneratorTest.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/A.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/B.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeClass.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeInterface.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeParent.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/multipleNs.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/sameNsMultipleClasses.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/deps/traits.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/php5.4/traits.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Psr4ClassLoaderTest.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/UniversalClassLoader.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/XcacheClassLoader.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/EventDispatcherInterface.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/README.md
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/Debug/TraceableEventDispatcherTest.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/DependencyInjection/RegisterListenersPassTest.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php
apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/composer.json

index 1824e09c66459d1d4379c9a6c101fe232209a86a..9cd4ae2e16f20d93c1fa019efc3979961e1d2b70 100644 (file)
@@ -28,7 +28,7 @@ class Aws extends ServiceBuilder
     /**
      * @var string Current version of the SDK
      */
-    const VERSION = '2.6.15';
+    const VERSION = '2.7.5';
 
     /**
      * Create a new service locator for the AWS SDK
index 0e2aa1a88ed9c88dda6923b2063058790f853804..c9ee86a66ff0eb9633305f0dc14b86f64dad6893 100644 (file)
@@ -17,7 +17,6 @@
 namespace Aws\Common\Client;
 
 use Aws\Common\Aws;
-use Aws\Common\Credentials\Credentials;
 use Aws\Common\Credentials\CredentialsInterface;
 use Aws\Common\Credentials\NullCredentials;
 use Aws\Common\Enum\ClientOptions as Options;
@@ -111,13 +110,7 @@ abstract class AbstractClient extends Client implements AwsClientInterface
 
     /**
      * Get an endpoint for a specific region from a service description
-     *
-     * @param ServiceDescriptionInterface $description Service description
-     * @param string                      $region      Region of the endpoint
-     * @param string                      $scheme      URL scheme
-     *
-     * @return string
-     * @throws InvalidArgumentException
+     * @deprecated This function will no longer be updated to work with new regions.
      */
     public static function getEndpoint(ServiceDescriptionInterface $description, $region, $scheme)
     {
@@ -177,12 +170,27 @@ abstract class AbstractClient extends Client implements AwsClientInterface
         $config = $this->getConfig();
         $formerRegion = $config->get(Options::REGION);
         $global = $this->serviceDescription->getData('globalEndpoint');
+        $provider = $config->get('endpoint_provider');
+
+        if (!$provider) {
+            throw new \RuntimeException('No endpoint provider configured');
+        }
 
         // Only change the region if the service does not have a global endpoint
         if (!$global || $this->serviceDescription->getData('namespace') === 'S3') {
-            $baseUrl = self::getEndpoint($this->serviceDescription, $region, $config->get(Options::SCHEME));
-            $this->setBaseUrl($baseUrl);
-            $config->set(Options::BASE_URL, $baseUrl)->set(Options::REGION, $region);
+
+            $endpoint = call_user_func(
+                $provider,
+                array(
+                    'scheme'  => $config->get(Options::SCHEME),
+                    'region'  => $region,
+                    'service' => $config->get(Options::SERVICE)
+                )
+            );
+
+            $this->setBaseUrl($endpoint['endpoint']);
+            $config->set(Options::BASE_URL, $endpoint['endpoint']);
+            $config->set(Options::REGION, $region);
 
             // Update the signature if necessary
             $signature = $this->getSignature();
index dd81cba2351a6a1a5eec37c41bb61efb3f095865..b34a67ffd920a77307bdb14656f43927d419e85b 100644 (file)
@@ -20,13 +20,13 @@ use Aws\Common\Credentials\Credentials;
 use Aws\Common\Credentials\CredentialsInterface;
 use Aws\Common\Credentials\NullCredentials;
 use Aws\Common\Enum\ClientOptions as Options;
-use Aws\Common\Enum\Region;
 use Aws\Common\Exception\ExceptionListener;
 use Aws\Common\Exception\InvalidArgumentException;
 use Aws\Common\Exception\NamespaceExceptionFactory;
 use Aws\Common\Exception\Parser\DefaultXmlExceptionParser;
 use Aws\Common\Exception\Parser\ExceptionParserInterface;
 use Aws\Common\Iterator\AwsResourceIteratorFactory;
+use Aws\Common\RulesEndpointProvider;
 use Aws\Common\Signature\EndpointSignatureInterface;
 use Aws\Common\Signature\SignatureInterface;
 use Aws\Common\Signature\SignatureV2;
@@ -38,7 +38,6 @@ use Guzzle\Plugin\Backoff\CurlBackoffStrategy;
 use Guzzle\Plugin\Backoff\ExponentialBackoffStrategy;
 use Guzzle\Plugin\Backoff\HttpBackoffStrategy;
 use Guzzle\Plugin\Backoff\TruncatedBackoffStrategy;
-use Guzzle\Service\Client;
 use Guzzle\Service\Description\ServiceDescription;
 use Guzzle\Service\Resource\ResourceIteratorClassFactory;
 use Guzzle\Log\LogAdapterInterface;
@@ -200,6 +199,10 @@ class ClientBuilder
             (self::$commonConfigRequirements + $this->configRequirements)
         );
 
+        if (!isset($config['endpoint_provider'])) {
+            $config['endpoint_provider'] = RulesEndpointProvider::fromDefaults();
+        }
+
         // Resolve the endpoint, signature, and credentials
         $description = $this->updateConfigFromDescription($config);
         $signature = $this->getSignature($description, $config);
@@ -366,33 +369,36 @@ class ClientBuilder
             $this->setIteratorsConfig($iterators);
         }
 
-        // Ensure that the service description has regions
-        if (!$description->getData('regions')) {
-            throw new InvalidArgumentException(
-                'No regions found in the ' . $description->getData('serviceFullName'). ' description'
-            );
-        }
-
         // Make sure a valid region is set
         $region = $config->get(Options::REGION);
         $global = $description->getData('globalEndpoint');
+
         if (!$global && !$region) {
             throw new InvalidArgumentException(
                 'A region is required when using ' . $description->getData('serviceFullName')
-                . '. Set "region" to one of: ' . implode(', ', array_keys($description->getData('regions')))
             );
         } elseif ($global && (!$region || $description->getData('namespace') !== 'S3')) {
-            $region = Region::US_EAST_1;
-            $config->set(Options::REGION, $region);
+            $region = 'us-east-1';
+            $config->set(Options::REGION, 'us-east-1');
         }
 
         if (!$config->get(Options::BASE_URL)) {
-            // Set the base URL using the scheme and hostname of the service's region
-            $config->set(Options::BASE_URL, AbstractClient::getEndpoint(
-                $description,
-                $region,
-                $config->get(Options::SCHEME)
-            ));
+            $endpoint = call_user_func(
+                $config->get('endpoint_provider'),
+                array(
+                    'scheme'  => $config->get(Options::SCHEME),
+                    'region'  => $region,
+                    'service' => $config->get(Options::SERVICE)
+                )
+            );
+            $config->set(Options::BASE_URL, $endpoint['endpoint']);
+
+            // Set a signature if one was not explicitly provided.
+            if (!$config->hasKey(Options::SIGNATURE)
+                && isset($endpoint['signatureVersion'])
+            ) {
+                $config->set(Options::SIGNATURE, $endpoint['signatureVersion']);
+            }
         }
 
         return $description;
index b44bd971beb8f4f09734ed2b61b0e35ef5f48fef..017d1d7e16c96448c8e29eeca69ee4060b7101af 100644 (file)
@@ -39,6 +39,9 @@ class Region extends Enum
 
     const EU_WEST_1           = 'eu-west-1';
     const IRELAND             = 'eu-west-1';
+    
+    const EU_CENTRAL_1        = 'eu-central-1';
+    const FRANKFURT           = 'eu-central-1';
 
     const AP_SOUTHEAST_1      = 'ap-southeast-1';
     const SINGAPORE           = 'ap-southeast-1';
index dd82ff75edd70f11a76874bcdf88fbb51ef1b819..f66af6edf5351eb67da0ece01dff439ad733188f 100644 (file)
@@ -38,6 +38,10 @@ class HashUtils
             $useNative = function_exists('hex2bin');
         }
 
+        if (!$useNative && strlen($hash) % 2 !== 0) {
+            $hash = '0' . $hash;
+        }
+
         return $useNative ? hex2bin($hash) : pack("H*", $hash);
     }
 
index a1ad678610c07a060545c7352a204622a6da64ce..8690d5cb562ecac5bf57beeea3e1bcc8964eca87 100644 (file)
@@ -49,7 +49,7 @@ abstract class AbstractUploadBuilder
     /**
      * Return a new instance of the UploadBuilder
      *
-     * @return self
+     * @return static
      */
     public static function newInstance()
     {
@@ -61,7 +61,7 @@ abstract class AbstractUploadBuilder
      *
      * @param AwsClientInterface $client Client to use
      *
-     * @return self
+     * @return $this
      */
     public function setClient(AwsClientInterface $client)
     {
@@ -78,7 +78,7 @@ abstract class AbstractUploadBuilder
      *                                             multipart upload. When an ID is passed, the builder will create a
      *                                             state object using the data from a ListParts API response.
      *
-     * @return self
+     * @return $this
      */
     public function resumeFrom($state)
     {
@@ -94,7 +94,7 @@ abstract class AbstractUploadBuilder
      *                                           You can also stream from a resource returned from fopen or a Guzzle
      *                                           {@see EntityBody} object.
      *
-     * @return self
+     * @return $this
      * @throws InvalidArgumentException when the source cannot be found or opened
      */
     public function setSource($source)
@@ -123,7 +123,7 @@ abstract class AbstractUploadBuilder
      *
      * @param array $headers Headers to add to the uploaded object
      *
-     * @return self
+     * @return $this
      */
     public function setHeaders(array $headers)
     {
index 6a1e30c6413dcfeb154c7818b6af809d614ddd3a..710ad0d3385be8aee8b9b2277624e1133752df71 100644 (file)
@@ -78,6 +78,12 @@ return array(
             'class'   => 'Aws\CloudWatch\CloudWatchClient'
         ),
 
+        'cloudwatchlogs' => array(
+            'alias'   => 'CloudWatchLogs',
+            'extends' => 'default_settings',
+            'class'   => 'Aws\CloudWatchLogs\CloudWatchLogsClient'
+        ),
+
         'cognito-identity' => array(
             'alias'   => 'CognitoIdentity',
             'extends' => 'default_settings',
@@ -94,10 +100,16 @@ return array(
 
         'cognitosync' => array('extends' => 'cognito-sync'),
 
-        'cloudwatchlogs' => array(
-            'alias'   => 'CloudWatchLogs',
+        'codedeploy' => array(
+            'alias'   => 'CodeDeploy',
             'extends' => 'default_settings',
-            'class'   => 'Aws\CloudWatchLogs\CloudWatchLogsClient'
+            'class'   => 'Aws\CodeDeploy\CodeDeployClient'
+        ),
+
+        'config' => array(
+            'alias'   => 'ConfigService',
+            'extends' => 'default_settings',
+            'class'   => 'Aws\ConfigService\ConfigServiceClient'
         ),
 
         'datapipeline' => array(
@@ -173,6 +185,18 @@ return array(
             'class'   => 'Aws\Kinesis\KinesisClient'
         ),
 
+        'kms' => array(
+            'alias'   => 'Kms',
+            'extends' => 'default_settings',
+            'class'   => 'Aws\Kms\KmsClient'
+        ),
+
+        'lambda' => array(
+            'alias'   => 'Lambda',
+            'extends' => 'default_settings',
+            'class'   => 'Aws\Lambda\LambdaClient'
+        ),
+
         'iam' => array(
             'alias'   => 'Iam',
             'extends' => 'default_settings',
diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Resources/public-endpoints.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Resources/public-endpoints.php
new file mode 100644 (file)
index 0000000..f24f340
--- /dev/null
@@ -0,0 +1,64 @@
+<?php
+return array(
+    'version' => 2,
+    'endpoints' => array(
+        '*/*' => array(
+            'endpoint' => '{service}.{region}.amazonaws.com'
+        ),
+        'cn-north-1/*' => array(
+            'endpoint' => '{service}.{region}.amazonaws.com.cn',
+            'signatureVersion' => 'v4'
+        ),
+        'us-gov-west-1/iam' => array(
+            'endpoint' => 'iam.us-gov.amazonaws.com'
+        ),
+        'us-gov-west-1/sts' => array(
+            'endpoint' => 'sts.us-gov.amazonaws.com'
+        ),
+        'us-gov-west-1/s3' => array(
+            'endpoint' => 's3-{region}.amazonaws.com'
+        ),
+        '*/cloudfront' => array(
+            'endpoint' => 'cloudfront.amazonaws.com'
+        ),
+        '*/iam' => array(
+            'endpoint' => 'iam.amazonaws.com'
+        ),
+        '*/importexport' => array(
+            'endpoint' => 'importexport.amazonaws.com'
+        ),
+        '*/route53' => array(
+            'endpoint' => 'route53.amazonaws.com'
+        ),
+        '*/sts' => array(
+            'endpoint' => 'sts.amazonaws.com'
+        ),
+        'us-east-1/sdb' => array(
+            'endpoint' => 'sdb.amazonaws.com'
+        ),
+        'us-east-1/s3' => array(
+            'endpoint' => 's3.amazonaws.com'
+        ),
+        'us-west-1/s3' => array(
+            'endpoint' => 's3-{region}.amazonaws.com'
+        ),
+        'us-west-2/s3' => array(
+            'endpoint' => 's3-{region}.amazonaws.com'
+        ),
+        'eu-west-1/s3' => array(
+            'endpoint' => 's3-{region}.amazonaws.com'
+        ),
+        'ap-southeast-1/s3' => array(
+            'endpoint' => 's3-{region}.amazonaws.com'
+        ),
+        'ap-southeast-2/s3' => array(
+            'endpoint' => 's3-{region}.amazonaws.com'
+        ),
+        'ap-northeast-1/s3' => array(
+            'endpoint' => 's3-{region}.amazonaws.com'
+        ),
+        'sa-east-1/s3' => array(
+            'endpoint' => 's3-{region}.amazonaws.com'
+        )
+    )
+);
diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/RulesEndpointProvider.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/RulesEndpointProvider.php
new file mode 100644 (file)
index 0000000..ec57cb8
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+namespace Aws\Common;
+
+/**
+ * Provides endpoints based on a rules configuration file.
+ */
+class RulesEndpointProvider
+{
+    /** @var array */
+    private $patterns;
+
+    /**
+     * @param array $patterns Hash of endpoint patterns mapping to endpoint
+     *                        configurations.
+     */
+    public function __construct(array $patterns)
+    {
+        $this->patterns = $patterns;
+    }
+
+    /**
+     * Creates and returns the default RulesEndpointProvider based on the
+     * public rule sets.
+     *
+     * @return self
+     */
+    public static function fromDefaults()
+    {
+        return new self(require __DIR__ . '/Resources/public-endpoints.php');
+    }
+
+    public function __invoke(array $args = array())
+    {
+        if (!isset($args['service'])) {
+            throw new \InvalidArgumentException('Requires a "service" value');
+        }
+
+        if (!isset($args['region'])) {
+            throw new \InvalidArgumentException('Requires a "region" value');
+        }
+
+        foreach ($this->getKeys($args['region'], $args['service']) as $key) {
+            if (isset($this->patterns['endpoints'][$key])) {
+                return $this->expand($this->patterns['endpoints'][$key], $args);
+            }
+        }
+
+        throw new \RuntimeException('Could not resolve endpoint');
+    }
+
+    private function expand(array $config, array $args)
+    {
+        $scheme = isset($args['scheme']) ? $args['scheme'] : 'https';
+        $config['endpoint'] = $scheme . '://' . str_replace(
+            array('{service}', '{region}'),
+            array($args['service'], $args['region']),
+            $config['endpoint']
+        );
+
+        return $config;
+    }
+
+    private function getKeys($region, $service)
+    {
+        return array("$region/$service", "$region/*", "*/$service", "*/*");
+    }
+}
index fda63a95fc433f617a1cc03313b17c11a800f2ae..38b60b4594b194aa7adcced60f4f9d105d2c4c6a 100644 (file)
@@ -19,7 +19,6 @@ namespace Aws\Common\Signature;
 use Aws\Common\Credentials\CredentialsInterface;
 use Aws\Common\Enum\DateFormat;
 use Aws\Common\HostNameUtils;
-use Guzzle\Http\Message\EntityEnclosingRequest;
 use Guzzle\Http\Message\EntityEnclosingRequestInterface;
 use Guzzle\Http\Message\RequestFactory;
 use Guzzle\Http\Message\RequestInterface;
@@ -304,43 +303,42 @@ class SignatureV4 extends AbstractSignature implements EndpointSignatureInterfac
      */
     private function createSigningContext(RequestInterface $request, $payload)
     {
+        $signable = array(
+            'host'        => true,
+            'date'        => true,
+            'content-md5' => true
+        );
+
         // Normalize the path as required by SigV4 and ensure it's absolute
         $canon = $request->getMethod() . "\n"
             . $this->createCanonicalizedPath($request) . "\n"
             . $this->getCanonicalizedQueryString($request) . "\n";
 
-        // Create the canonical headers
-        $headers = array();
+        $canonHeaders = array();
+
         foreach ($request->getHeaders()->getAll() as $key => $values) {
             $key = strtolower($key);
-            if ($key != 'user-agent') {
-                $headers[$key] = array();
-                foreach ($values as $value) {
-                    $headers[$key][] = preg_replace('/\s+/', ' ', trim($value));
-                }
-                // Sort the value if there is more than one
-                if (count($values) > 1) {
-                    sort($headers[$key]);
+            if (isset($signable[$key]) || substr($key, 0, 6) === 'x-amz-') {
+                $values = $values->toArray();
+                if (count($values) == 1) {
+                    $values = $values[0];
+                } else {
+                    sort($values);
+                    $values = implode(',', $values);
                 }
+                $canonHeaders[$key] = $key . ':' . preg_replace('/\s+/', ' ', $values);
             }
         }
 
-        // The headers must be sorted
-        ksort($headers);
-
-        // Continue to build the canonical request by adding headers
-        foreach ($headers as $key => $values) {
-            // Combine multi-value headers into a comma separated list
-            $canon .= $key . ':' . implode(',', $values) . "\n";
-        }
-
-        // Create the signed headers
-        $signedHeaders = implode(';', array_keys($headers));
-        $canon .= "\n{$signedHeaders}\n{$payload}";
+        ksort($canonHeaders);
+        $signedHeadersString = implode(';', array_keys($canonHeaders));
+        $canon .= implode("\n", $canonHeaders) . "\n\n"
+            . $signedHeadersString . "\n"
+            . $payload;
 
         return array(
             'canonical_request' => $canon,
-            'signed_headers'    => $signedHeaders
+            'signed_headers'    => $signedHeadersString
         );
     }
 
@@ -394,6 +392,8 @@ class SignatureV4 extends AbstractSignature implements EndpointSignatureInterfac
         foreach ($queryParams as $key => $values) {
             if (is_array($values)) {
                 sort($values);
+            } elseif ($values === 0) {
+                $values = array('0');
             } elseif (!$values) {
                 $values = array('');
             }
index 8325a2b65705b05d51646ee8ac19e4290be11f06..6c19f668400c9cac07d1acc3a853f4c82882cfd2 100644 (file)
@@ -54,7 +54,7 @@ class Acp implements ToArrayInterface, \IteratorAggregate, \Countable
      *
      * @param array $data Array of ACP data
      *
-     * @return self
+     * @return Acp
      */
     public static function fromArray(array $data)
     {
@@ -100,7 +100,7 @@ class Acp implements ToArrayInterface, \IteratorAggregate, \Countable
      *
      * @param Grantee $owner ACP policy owner
      *
-     * @return self
+     * @return $this
      *
      * @throws InvalidArgumentException if the grantee does not have an ID set
      */
@@ -130,7 +130,7 @@ class Acp implements ToArrayInterface, \IteratorAggregate, \Countable
      *
      * @param array|\Traversable $grants List of grants for the ACP
      *
-     * @return self
+     * @return $this
      *
      * @throws InvalidArgumentException
      */
@@ -167,7 +167,7 @@ class Acp implements ToArrayInterface, \IteratorAggregate, \Countable
      *
      * @param Grant $grant Grant to add
      *
-     * @return self
+     * @return $this
      */
     public function addGrant(Grant $grant)
     {
@@ -205,7 +205,7 @@ class Acp implements ToArrayInterface, \IteratorAggregate, \Countable
      *
      * @param AbstractCommand $command Command to be updated
      *
-     * @return self
+     * @return $this
      */
     public function updateCommand(AbstractCommand $command)
     {
index 0e41c3cb0a0316fce8f272178a5298081f05e62b..b6d1be72167739906ebee3b4ecdd6b7eb7e534aa 100644 (file)
@@ -36,11 +36,11 @@ class AcpBuilder
     /**
      * Static method for chainable instantiation
      *
-     * @return self
+     * @return static
      */
     public static function newInstance()
     {
-        return new self;
+        return new static;
     }
 
     /**
@@ -49,7 +49,7 @@ class AcpBuilder
      * @param string $id          Owner identifier
      * @param string $displayName Owner display name
      *
-     * @return self
+     * @return $this
      */
     public function setOwner($id, $displayName = null)
     {
@@ -65,7 +65,7 @@ class AcpBuilder
      * @param string $id          Grantee identifier
      * @param string $displayName Grantee display name
      *
-     * @return self
+     * @return $this
      */
     public function addGrantForUser($permission, $id, $displayName = null)
     {
@@ -81,7 +81,7 @@ class AcpBuilder
      * @param string $permission Permission for the Grant
      * @param string $email      Grantee email address
      *
-     * @return self
+     * @return $this
      */
     public function addGrantForEmail($permission, $email)
     {
@@ -97,7 +97,7 @@ class AcpBuilder
      * @param string $permission Permission for the Grant
      * @param string $group      Grantee group
      *
-     * @return self
+     * @return $this
      */
     public function addGrantForGroup($permission, $group)
     {
@@ -113,7 +113,7 @@ class AcpBuilder
      * @param string  $permission Permission for the Grant
      * @param Grantee $grantee    The Grantee for the Grant
      *
-     * @return self
+     * @return $this
      */
     public function addGrant($permission, Grantee $grantee)
     {
index 77ce9378f45a38d4690e62618a6b26ca3a3631b5..09982d8ae7dbd46aa5fbfe512dd775c15459095d 100644 (file)
@@ -81,7 +81,7 @@ class ClearBucket extends AbstractHasDispatcher
      *
      * @param string $bucket Name of the bucket to clear
      *
-     * @return self
+     * @return $this
      */
     public function setBucket($bucket)
     {
@@ -114,7 +114,7 @@ class ClearBucket extends AbstractHasDispatcher
      *
      * @param \Iterator $iterator Iterator used to yield the keys to be deleted
      *
-     * @return self
+     * @return $this
      */
     public function setIterator(\Iterator $iterator)
     {
@@ -129,7 +129,7 @@ class ClearBucket extends AbstractHasDispatcher
      * @param string $mfa MFA token to send with each request. The value is the concatenation of the authentication
      *                    device's serial number, a space, and the value displayed on your authentication device.
      *
-     * @return self
+     * @return $this
      */
     public function setMfa($mfa)
     {
index 17d8af33a732e289f76807cca419416a80c86b04..ab6425bbb87631901b1452f7f4e0daf1949ce692 100644 (file)
@@ -38,7 +38,7 @@ class DeleteObjectsBatch extends AbstractBatchDecorator
      * @param string             $bucket Bucket that contains the objects to delete
      * @param string             $mfa    MFA token to use with the request
      *
-     * @return self
+     * @return static
      */
     public static function factory(AwsClientInterface $client, $bucket, $mfa = null)
     {
@@ -47,7 +47,7 @@ class DeleteObjectsBatch extends AbstractBatchDecorator
             ->transferWith(new DeleteObjectsTransfer($client, $bucket, $mfa))
             ->build();
 
-        return new self($batch);
+        return new static($batch);
     }
 
     /**
@@ -56,7 +56,7 @@ class DeleteObjectsBatch extends AbstractBatchDecorator
      * @param string $key       Key of the object
      * @param string $versionId VersionID of the object
      *
-     * @return self
+     * @return $this
      */
     public function addKey($key, $versionId = null)
     {
@@ -82,6 +82,6 @@ class DeleteObjectsBatch extends AbstractBatchDecorator
             throw new InvalidArgumentException('Item must be a DeleteObject command or array containing a Key and VersionId key.');
         }
 
-        return $this->decoratedBatch->add($item);
+        return parent::add($item);
     }
 }
index c3d3828c4e331ea5f7550de73fd5399e15299562..5918ff18ff7b86f414c31f50dec33df7f43d34d7 100644 (file)
@@ -64,7 +64,7 @@ class DeleteObjectsTransfer implements BatchTransferInterface
      *
      * @param string $token MFA token
      *
-     * @return self
+     * @return $this
      */
     public function setMfa($token)
     {
index afc2757e8ccace25216a6e28aff5a5be70b0af63..2e35f059511ca93bae550355413bddcf8188c676 100644 (file)
@@ -63,7 +63,7 @@ class Grant implements ToArrayInterface
      *
      * @param Grantee $grantee Affected grantee
      *
-     * @return self
+     * @return $this
      */
     public function setGrantee(Grantee $grantee)
     {
@@ -87,7 +87,7 @@ class Grant implements ToArrayInterface
      *
      * @param string $permission Permission applied
      *
-     * @return self
+     * @return $this
      *
      * @throws InvalidArgumentException
      */
index f49c70fca1c0675e037a76ff1d9ab4b2db76d9b4..7634b84a35098031bce46e0b0f783d4dea784ba6 100644 (file)
@@ -214,7 +214,7 @@ class Grantee implements ToArrayInterface
      */
     public function getHeaderValue()
     {
-        $key = self::$headerMap[$this->type];
+        $key = static::$headerMap[$this->type];
 
         return "{$key}=\"{$this->id}\"";
     }
index cae7658d72e61daa5299c1629d8ebbeb6539317e..e30f23a36cf742416289666364debe6789cd97c0 100644 (file)
@@ -67,7 +67,7 @@ class UploadBuilder extends AbstractUploadBuilder
      *
      * @param string $bucket Name of the bucket
      *
-     * @return self
+     * @return $this
      */
     public function setBucket($bucket)
     {
@@ -79,7 +79,7 @@ class UploadBuilder extends AbstractUploadBuilder
      *
      * @param string $key Key of the object to upload
      *
-     * @return self
+     * @return $this
      */
     public function setKey($key)
     {
@@ -91,7 +91,7 @@ class UploadBuilder extends AbstractUploadBuilder
      *
      * @param int $minSize Minimum acceptable part size in bytes
      *
-     * @return self
+     * @return $this
      */
     public function setMinPartSize($minSize)
     {
@@ -107,7 +107,7 @@ class UploadBuilder extends AbstractUploadBuilder
      *
      * @param int $concurrency Concurrency level
      *
-     * @return self
+     * @return $this
      */
     public function setConcurrency($concurrency)
     {
@@ -121,7 +121,7 @@ class UploadBuilder extends AbstractUploadBuilder
      *
      * @param string $md5 MD5 hash of the entire body
      *
-     * @return self
+     * @return $this
      */
     public function setMd5($md5)
     {
@@ -137,7 +137,7 @@ class UploadBuilder extends AbstractUploadBuilder
      *
      * @param bool $calculateMd5 Set to true to calculate the MD5 hash of the body
      *
-     * @return self
+     * @return $this
      */
     public function calculateMd5($calculateMd5)
     {
@@ -152,7 +152,7 @@ class UploadBuilder extends AbstractUploadBuilder
      *
      * @param bool $usePartMd5 Set to true to calculate the MD5 has of each part
      *
-     * @return self
+     * @return $this
      */
     public function calculatePartMd5($usePartMd5)
     {
@@ -166,7 +166,7 @@ class UploadBuilder extends AbstractUploadBuilder
      *
      * @param Acp $acp ACP to set on the object
      *
-     * @return self
+     * @return $this
      */
     public function setAcp(Acp $acp)
     {
@@ -179,7 +179,7 @@ class UploadBuilder extends AbstractUploadBuilder
      * @param string $name  Option name
      * @param string $value Option value
      *
-     * @return self
+     * @return $this
      */
     public function setOption($name, $value)
     {
@@ -193,7 +193,7 @@ class UploadBuilder extends AbstractUploadBuilder
      *
      * @param array $options Array of CreateMultipartUpload operation parameters
      *
-     * @return self
+     * @return $this
      */
     public function addOptions(array $options)
     {
@@ -207,7 +207,7 @@ class UploadBuilder extends AbstractUploadBuilder
      *
      * @param array $options Transfer options
      *
-     * @return self
+     * @return $this
      */
     public function setTransferOptions(array $options)
     {
index 8739cef6a04a75e69ca43af69d51eaa6b6593fbf..0d7b023f0294d2c5cc2ce3c0af690e7129a1d663 100644 (file)
@@ -45,6 +45,11 @@ return array (
             'https' => true,
             'hostname' => 's3-eu-west-1.amazonaws.com',
         ),
+        'eu-central-1' => array(
+            'http' => true,
+            'https' => true,
+            'hostname' => 's3-eu-central-1.amazonaws.com',
+        ),
         'ap-northeast-1' => array(
             'http' => true,
             'https' => true,
@@ -355,6 +360,11 @@ return array (
                     'location' => 'header',
                     'sentAs' => 'x-amz-copy-source-server-side-encryption-customer-key-MD5',
                 ),
+                'CopySourceSSEKMSKeyId' => array(
+                    'type' => 'string',
+                    'location' => 'header',
+                    'sentAs' => 'x-amz-copy-source-server-side-encryption-aws-kms-key-id',
+                ),
                 'ACP' => array(
                     'type' => 'object',
                     'additionalProperties' => true,
@@ -564,6 +574,11 @@ return array (
                     'location' => 'header',
                     'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5',
                 ),
+                'SSEKMSKeyId' => array(
+                    'type' => 'string',
+                    'location' => 'header',
+                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id',
+                ),
                 'ACP' => array(
                     'type' => 'object',
                     'additionalProperties' => true,
@@ -1068,6 +1083,11 @@ return array (
                     'location' => 'header',
                     'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5',
                 ),
+                'SSEKMSKeyId' => array(
+                    'type' => 'string',
+                    'location' => 'header',
+                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id',
+                ),
                 'SaveAs' => array(
                     'location' => 'response_body',
                 ),
@@ -1236,6 +1256,11 @@ return array (
                     'location' => 'header',
                     'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5',
                 ),
+                'SSEKMSKeyId' => array(
+                    'type' => 'string',
+                    'location' => 'header',
+                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id',
+                ),
             ),
             'errorResponses' => array(
                 array(
@@ -1843,10 +1868,22 @@ return array (
                     'location' => 'uri',
                 ),
                 'TopicConfiguration' => array(
-                    'required' => true,
                     'type' => 'object',
                     'location' => 'xml',
                     'properties' => array(
+                        'Id' => array(
+                            'type' => 'string',
+                        ),
+                        'Events' => array(
+                            'type' => 'array',
+                            'data' => array(
+                                'xmlFlattened' => true,
+                            ),
+                            'items' => array(
+                                'name' => 'Event',
+                                'type' => 'string',
+                            ),
+                        ),
                         'Event' => array(
                             'type' => 'string',
                         ),
@@ -1855,6 +1892,59 @@ return array (
                         ),
                     ),
                 ),
+                'QueueConfiguration' => array(
+                    'type' => 'object',
+                    'location' => 'xml',
+                    'properties' => array(
+                        'Id' => array(
+                            'type' => 'string',
+                        ),
+                        'Event' => array(
+                            'type' => 'string',
+                        ),
+                        'Events' => array(
+                            'type' => 'array',
+                            'data' => array(
+                                'xmlFlattened' => true,
+                            ),
+                            'items' => array(
+                                'name' => 'Event',
+                                'type' => 'string',
+                            ),
+                        ),
+                        'Queue' => array(
+                            'type' => 'string',
+                        ),
+                    ),
+                ),
+                'CloudFunctionConfiguration' => array(
+                    'type' => 'object',
+                    'location' => 'xml',
+                    'properties' => array(
+                        'Id' => array(
+                            'type' => 'string',
+                        ),
+                        'Event' => array(
+                            'type' => 'string',
+                        ),
+                        'Events' => array(
+                            'type' => 'array',
+                            'data' => array(
+                                'xmlFlattened' => true,
+                            ),
+                            'items' => array(
+                                'name' => 'Event',
+                                'type' => 'string',
+                            ),
+                        ),
+                        'CloudFunction' => array(
+                            'type' => 'string',
+                        ),
+                        'InvocationRole' => array(
+                            'type' => 'string',
+                        ),
+                    ),
+                ),
             ),
         ),
         'PutBucketPolicy' => array(
@@ -2241,6 +2331,11 @@ return array (
                     'location' => 'header',
                     'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5',
                 ),
+                'SSEKMSKeyId' => array(
+                    'type' => 'string',
+                    'location' => 'header',
+                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id',
+                ),
                 'ACP' => array(
                     'type' => 'object',
                     'additionalProperties' => true,
@@ -2399,6 +2494,11 @@ return array (
                         'Aws\\S3\\S3Client::explodeKey',
                     ),
                 ),
+                'VersionId' => array(
+                    'type' => 'string',
+                    'location' => 'query',
+                    'sentAs' => 'versionId',
+                ),
                 'Days' => array(
                     'required' => true,
                     'type' => 'numeric',
@@ -2488,6 +2588,11 @@ return array (
                     'location' => 'header',
                     'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5',
                 ),
+                'SSEKMSKeyId' => array(
+                    'type' => 'string',
+                    'location' => 'header',
+                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id',
+                ),
             ),
         ),
         'UploadPartCopy' => array(
@@ -2602,6 +2707,11 @@ return array (
                     'location' => 'header',
                     'sentAs' => 'x-amz-copy-source-server-side-encryption-customer-key-MD5',
                 ),
+                'CopySourceSSEKMSKeyId' => array(
+                    'type' => 'string',
+                    'location' => 'header',
+                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id',
+                ),
                 'command.expects' => array(
                     'static' => true,
                     'default' => 'application/xml',
@@ -2655,6 +2765,11 @@ return array (
                     'location' => 'header',
                     'sentAs' => 'x-amz-version-id',
                 ),
+                'SSEKMSKeyId' => array(
+                    'type' => 'string',
+                    'location' => 'header',
+                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id',
+                ),
                 'RequestId' => array(
                     'location' => 'header',
                     'sentAs' => 'x-amz-request-id',
@@ -2698,6 +2813,11 @@ return array (
                     'location' => 'header',
                     'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5',
                 ),
+                'SSEKMSKeyId' => array(
+                    'type' => 'string',
+                    'location' => 'header',
+                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id',
+                ),
                 'RequestId' => array(
                     'location' => 'header',
                     'sentAs' => 'x-amz-request-id',
@@ -2750,6 +2870,11 @@ return array (
                     'location' => 'header',
                     'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5',
                 ),
+                'SSEKMSKeyId' => array(
+                    'type' => 'string',
+                    'location' => 'header',
+                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id',
+                ),
                 'RequestId' => array(
                     'location' => 'header',
                     'sentAs' => 'x-amz-request-id',
@@ -3197,6 +3322,21 @@ return array (
                     'type' => 'object',
                     'location' => 'xml',
                     'properties' => array(
+                        'Id' => array(
+                            'type' => 'string',
+                        ),
+                        'Events' => array(
+                            'type' => 'array',
+                            'sentAs' => 'Event',
+                            'data' => array(
+                                'xmlFlattened' => true,
+                            ),
+                            'items' => array(
+                                'name' => 'Event',
+                                'type' => 'string',
+                                'sentAs' => 'Event',
+                            ),
+                        ),
                         'Event' => array(
                             'type' => 'string',
                         ),
@@ -3205,6 +3345,63 @@ return array (
                         ),
                     ),
                 ),
+                'QueueConfiguration' => array(
+                    'type' => 'object',
+                    'location' => 'xml',
+                    'properties' => array(
+                        'Id' => array(
+                            'type' => 'string',
+                        ),
+                        'Event' => array(
+                            'type' => 'string',
+                        ),
+                        'Events' => array(
+                            'type' => 'array',
+                            'sentAs' => 'Event',
+                            'data' => array(
+                                'xmlFlattened' => true,
+                            ),
+                            'items' => array(
+                                'name' => 'Event',
+                                'type' => 'string',
+                                'sentAs' => 'Event',
+                            ),
+                        ),
+                        'Queue' => array(
+                            'type' => 'string',
+                        ),
+                    ),
+                ),
+                'CloudFunctionConfiguration' => array(
+                    'type' => 'object',
+                    'location' => 'xml',
+                    'properties' => array(
+                        'Id' => array(
+                            'type' => 'string',
+                        ),
+                        'Event' => array(
+                            'type' => 'string',
+                        ),
+                        'Events' => array(
+                            'type' => 'array',
+                            'sentAs' => 'Event',
+                            'data' => array(
+                                'xmlFlattened' => true,
+                            ),
+                            'items' => array(
+                                'name' => 'Event',
+                                'type' => 'string',
+                                'sentAs' => 'Event',
+                            ),
+                        ),
+                        'CloudFunction' => array(
+                            'type' => 'string',
+                        ),
+                        'InvocationRole' => array(
+                            'type' => 'string',
+                        ),
+                    ),
+                ),
                 'RequestId' => array(
                     'location' => 'header',
                     'sentAs' => 'x-amz-request-id',
@@ -3478,6 +3675,11 @@ return array (
                     'location' => 'header',
                     'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5',
                 ),
+                'SSEKMSKeyId' => array(
+                    'type' => 'string',
+                    'location' => 'header',
+                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id',
+                ),
                 'RequestId' => array(
                     'location' => 'header',
                     'sentAs' => 'x-amz-request-id',
@@ -3676,6 +3878,11 @@ return array (
                     'location' => 'header',
                     'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5',
                 ),
+                'SSEKMSKeyId' => array(
+                    'type' => 'string',
+                    'location' => 'header',
+                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id',
+                ),
                 'RequestId' => array(
                     'location' => 'header',
                     'sentAs' => 'x-amz-request-id',
@@ -3745,6 +3952,10 @@ return array (
                     'type' => 'string',
                     'location' => 'xml',
                 ),
+                'Delimiter' => array(
+                    'type' => 'string',
+                    'location' => 'xml',
+                ),
                 'NextUploadIdMarker' => array(
                     'type' => 'string',
                     'location' => 'xml',
@@ -3949,6 +4160,10 @@ return array (
                     'type' => 'string',
                     'location' => 'xml',
                 ),
+                'Delimiter' => array(
+                    'type' => 'string',
+                    'location' => 'xml',
+                ),
                 'MaxKeys' => array(
                     'type' => 'numeric',
                     'location' => 'xml',
@@ -4042,6 +4257,10 @@ return array (
                     'type' => 'string',
                     'location' => 'xml',
                 ),
+                'Delimiter' => array(
+                    'type' => 'string',
+                    'location' => 'xml',
+                ),
                 'MaxKeys' => array(
                     'type' => 'numeric',
                     'location' => 'xml',
@@ -4298,6 +4517,11 @@ return array (
                     'location' => 'header',
                     'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5',
                 ),
+                'SSEKMSKeyId' => array(
+                    'type' => 'string',
+                    'location' => 'header',
+                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id',
+                ),
                 'RequestId' => array(
                     'location' => 'header',
                     'sentAs' => 'x-amz-request-id',
@@ -4349,6 +4573,11 @@ return array (
                     'location' => 'header',
                     'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5',
                 ),
+                'SSEKMSKeyId' => array(
+                    'type' => 'string',
+                    'location' => 'header',
+                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id',
+                ),
                 'RequestId' => array(
                     'location' => 'header',
                     'sentAs' => 'x-amz-request-id',
@@ -4387,6 +4616,11 @@ return array (
                     'location' => 'header',
                     'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5',
                 ),
+                'SSEKMSKeyId' => array(
+                    'type' => 'string',
+                    'location' => 'header',
+                    'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id',
+                ),
                 'RequestId' => array(
                     'location' => 'header',
                     'sentAs' => 'x-amz-request-id',
index 219e37eb92d332d46cb63aa7d0e0dcb2b980e12e..7f7c7cf22c464cce9586d09670b98d86eec09217 100644 (file)
@@ -24,7 +24,6 @@ use Aws\Common\Enum\ClientOptions as Options;
 use Aws\Common\Exception\RuntimeException;
 use Aws\Common\Exception\InvalidArgumentException;
 use Aws\Common\Signature\SignatureV4;
-use Aws\Common\Signature\SignatureInterface;
 use Aws\Common\Model\MultipartUpload\AbstractTransfer;
 use Aws\S3\Exception\AccessDeniedException;
 use Aws\S3\Exception\Parser\S3ExceptionParser;
@@ -156,7 +155,7 @@ class S3Client extends AbstractClient
      *
      * @param array|Collection $config Client configuration data
      *
-     * @return self
+     * @return S3Client
      * @link http://docs.aws.amazon.com/aws-sdk-php/guide/latest/configuration.html#client-configuration-options
      */
     public static function factory($config = array())
@@ -165,10 +164,10 @@ class S3Client extends AbstractClient
 
         // Configure the custom exponential backoff plugin for retrying S3 specific errors
         if (!isset($config[Options::BACKOFF])) {
-            $config[Options::BACKOFF] = self::createBackoffPlugin($exceptionParser);
+            $config[Options::BACKOFF] = static::createBackoffPlugin($exceptionParser);
         }
 
-        $config[Options::SIGNATURE] = $signature = self::createSignature($config);
+        $config[Options::SIGNATURE] = $signature = static::createSignature($config);
 
         $client = ClientBuilder::factory(__NAMESPACE__)
             ->setConfig($config)
@@ -222,7 +221,7 @@ class S3Client extends AbstractClient
         // Add aliases for some S3 operations
         $default = CompositeFactory::getDefaultChain($client);
         $default->add(
-            new AliasFactory($client, self::$commandAliases),
+            new AliasFactory($client, static::$commandAliases),
             'Guzzle\Service\Command\Factory\ServiceDescriptionFactory'
         );
         $client->setCommandFactory($default);
@@ -266,11 +265,16 @@ class S3Client extends AbstractClient
     {
         $currentValue = isset($config[Options::SIGNATURE]) ? $config[Options::SIGNATURE] : null;
 
+        // Force v4 if no value is provided, a region is in the config, and
+        // the region starts with "cn-" or "eu-central-".
+        $requiresV4 = !$currentValue
+            && isset($config['region'])
+            && (strpos($config['region'], 'eu-central-') === 0
+                || strpos($config['region'], 'cn-') === 0);
+
         // Use the Amazon S3 signature V4 when the value is set to "v4" or when
         // the value is not set and the region starts with "cn-".
-        if ($currentValue == 'v4' ||
-            (!$currentValue && isset($config['region']) && substr($config['region'], 0, 3) == 'cn-')
-        ) {
+        if ($currentValue == 'v4' || $requiresV4) {
             // Force SignatureV4 for specific regions or if specified in the config
             $currentValue = new S3SignatureV4('s3');
         } elseif (!$currentValue || $currentValue == 's3') {
@@ -456,7 +460,7 @@ class S3Client extends AbstractClient
     /**
      * Register the Amazon S3 stream wrapper and associates it with this client object
      *
-     * @return self
+     * @return $this
      */
     public function registerStreamWrapper()
     {
@@ -515,8 +519,7 @@ class S3Client extends AbstractClient
             ->setTransferOptions($options->toArray())
             ->addOptions($options['params'])
             ->setOption('ACL', $acl)
-            ->build()
-            ->upload();
+            ->build();
 
         if ($options['before_upload']) {
             $transfer->getEventDispatcher()->addListener(
@@ -525,7 +528,7 @@ class S3Client extends AbstractClient
             );
         }
 
-        return $transfer;
+        return $transfer->upload();
     }
 
     /**
index 7587af0fcba47c58dc6bb7f3fede072b60e2016f..edbb4fcd0828f0d260dceeda02ce43308544f038 100644 (file)
@@ -32,7 +32,10 @@ class S3SignatureV4 extends SignatureV4 implements S3SignatureInterface
     public function signRequest(RequestInterface $request, CredentialsInterface $credentials)
     {
         if (!$request->hasHeader('x-amz-content-sha256')) {
-            $request->setHeader('x-amz-content-sha256', $this->getPresignedPayload($request));
+            $request->setHeader(
+                'x-amz-content-sha256',
+                $this->getPayload($request)
+            );
         }
 
         parent::signRequest($request, $credentials);
@@ -44,14 +47,7 @@ class S3SignatureV4 extends SignatureV4 implements S3SignatureInterface
      */
     protected function getPresignedPayload(RequestInterface $request)
     {
-        $result = parent::getPresignedPayload($request);
-
-        // If the body is empty, then sign with 'UNSIGNED-PAYLOAD'
-        if ($result === self::DEFAULT_PAYLOAD) {
-            $result = hash('sha256', 'UNSIGNED-PAYLOAD');
-        }
-
-        return $result;
+        return 'UNSIGNED-PAYLOAD';
     }
 
     /**
index 3bb85aae6dfc59126bc065fb23863af7d90aa7d7..b0bdb21f5640b62e33f565126bcba3d0e10c479d 100644 (file)
@@ -133,7 +133,7 @@ class StreamWrapper
         }
 
         stream_wrapper_register('s3', get_called_class(), STREAM_IS_URL);
-        self::$client = $client;
+        static::$client = $client;
     }
 
     /**
@@ -172,7 +172,7 @@ class StreamWrapper
         }
 
         // When using mode "x" validate if the file exists before attempting to read
-        if ($mode == 'x' && self::$client->doesObjectExist($params['Bucket'], $params['Key'], $this->getOptions())) {
+        if ($mode == 'x' && static::$client->doesObjectExist($params['Bucket'], $params['Key'], $this->getOptions())) {
             $errors[] = "{$path} already exists on Amazon S3";
         }
 
@@ -219,7 +219,7 @@ class StreamWrapper
         }
 
         try {
-            self::$client->putObject($params);
+            static::$client->putObject($params);
             return true;
         } catch (\Exception $e) {
             return $this->triggerError($e->getMessage());
@@ -283,7 +283,7 @@ class StreamWrapper
     {
         try {
             $this->clearStatInfo($path);
-            self::$client->deleteObject($this->getParams($path));
+            static::$client->deleteObject($this->getParams($path));
             return true;
         } catch (\Exception $e) {
             return $this->triggerError($e->getMessage());
@@ -316,15 +316,15 @@ class StreamWrapper
     public function url_stat($path, $flags)
     {
         // Check if this path is in the url_stat cache
-        if (isset(self::$nextStat[$path])) {
-            return self::$nextStat[$path];
+        if (isset(static::$nextStat[$path])) {
+            return static::$nextStat[$path];
         }
 
         $parts = $this->getParams($path);
 
         if (!$parts['Key']) {
             // Stat "directories": buckets, or "s3://"
-            if (!$parts['Bucket'] || self::$client->doesBucketExist($parts['Bucket'])) {
+            if (!$parts['Bucket'] || static::$client->doesBucketExist($parts['Bucket'])) {
                 return $this->formatUrlStat($path);
             } else {
                 return $this->triggerError("File or directory not found: {$path}", $flags);
@@ -333,7 +333,7 @@ class StreamWrapper
 
         try {
             try {
-                $result = self::$client->headObject($parts)->toArray();
+                $result = static::$client->headObject($parts)->toArray();
                 if (substr($parts['Key'], -1, 1) == '/' && $result['ContentLength'] == 0) {
                     // Return as if it is a bucket to account for console bucket objects (e.g., zero-byte object "foo/")
                     return $this->formatUrlStat($path);
@@ -343,7 +343,7 @@ class StreamWrapper
                 }
             } catch (NoSuchKeyException $e) {
                 // Maybe this isn't an actual key, but a prefix. Do a prefix listing of objects to determine.
-                $result = self::$client->listObjects(array(
+                $result = static::$client->listObjects(array(
                     'Bucket'  => $parts['Bucket'],
                     'Prefix'  => rtrim($parts['Key'], '/') . '/',
                     'MaxKeys' => 1
@@ -404,7 +404,7 @@ class StreamWrapper
         try {
 
             if (!$params['Key']) {
-                self::$client->deleteBucket(array('Bucket' => $params['Bucket']));
+                static::$client->deleteBucket(array('Bucket' => $params['Bucket']));
                 $this->clearStatInfo($path);
                 return true;
             }
@@ -412,7 +412,7 @@ class StreamWrapper
             // Use a key that adds a trailing slash if needed.
             $prefix = rtrim($params['Key'], '/') . '/';
 
-            $result = self::$client->listObjects(array(
+            $result = static::$client->listObjects(array(
                 'Bucket'  => $params['Bucket'],
                 'Prefix'  => $prefix,
                 'MaxKeys' => 1
@@ -476,7 +476,7 @@ class StreamWrapper
             $operationParams['Delimiter'] = $delimiter;
         }
 
-        $objectIterator = self::$client->getIterator('ListObjects', $operationParams, array(
+        $objectIterator = static::$client->getIterator('ListObjects', $operationParams, array(
             'return_prefixes' => true,
             'sort_results'    => true
         ));
@@ -554,7 +554,7 @@ class StreamWrapper
 
         // Cache the object data for quick url_stat lookups used with
         // RecursiveDirectoryIterator.
-        self::$nextStat = array($key => $stat);
+        static::$nextStat = array($key => $stat);
         $this->objectIterator->next();
 
         return $result;
@@ -582,14 +582,14 @@ class StreamWrapper
 
         try {
             // Copy the object and allow overriding default parameters if desired, but by default copy metadata
-            self::$client->copyObject($this->getOptions() + array(
+            static::$client->copyObject($this->getOptions() + array(
                 'Bucket' => $partsTo['Bucket'],
                 'Key' => $partsTo['Key'],
                 'CopySource' => '/' . $partsFrom['Bucket'] . '/' . rawurlencode($partsFrom['Key']),
                 'MetadataDirective' => 'COPY'
             ));
             // Delete the original object
-            self::$client->deleteObject(array(
+            static::$client->deleteObject(array(
                 'Bucket' => $partsFrom['Bucket'],
                 'Key'    => $partsFrom['Key']
             ) + $this->getOptions());
@@ -685,7 +685,7 @@ class StreamWrapper
     protected function openReadStream(array $params, array &$errors)
     {
         // Create the command and serialize the request
-        $request = $this->getSignedRequest(self::$client->getCommand('GetObject', $params));
+        $request = $this->getSignedRequest(static::$client->getCommand('GetObject', $params));
         // Create a stream that uses the EntityBody object
         $factory = $this->getOption('stream_factory') ?: new PhpStreamRequestFactory();
         $this->body = $factory->fromRequest($request, array(), array('stream_class' => 'Guzzle\Http\EntityBody'));
@@ -723,7 +723,7 @@ class StreamWrapper
     {
         try {
             // Get the body of the object
-            $this->body = self::$client->getObject($params)->get('Body');
+            $this->body = static::$client->getObject($params)->get('Body');
             $this->body->seek(0, SEEK_END);
         } catch (S3Exception $e) {
             // The object does not exist, so use a simple write stream
@@ -810,7 +810,7 @@ class StreamWrapper
      */
     protected function clearStatInfo($path = null)
     {
-        self::$nextStat = array();
+        static::$nextStat = array();
         if ($path) {
             clearstatcache(true, $path);
         }
@@ -826,12 +826,12 @@ class StreamWrapper
      */
     private function createBucket($path, array $params)
     {
-        if (self::$client->doesBucketExist($params['Bucket'])) {
+        if (static::$client->doesBucketExist($params['Bucket'])) {
             return $this->triggerError("Directory already exists: {$path}");
         }
 
         try {
-            self::$client->createBucket($params);
+            static::$client->createBucket($params);
             $this->clearStatInfo($path);
             return true;
         } catch (\Exception $e) {
@@ -854,12 +854,12 @@ class StreamWrapper
         $params['Body'] = '';
 
         // Fail if this pseudo directory key already exists
-        if (self::$client->doesObjectExist($params['Bucket'], $params['Key'])) {
+        if (static::$client->doesObjectExist($params['Bucket'], $params['Key'])) {
             return $this->triggerError("Directory already exists: {$path}");
         }
 
         try {
-            self::$client->putObject($params);
+            static::$client->putObject($params);
             $this->clearStatInfo($path);
             return true;
         } catch (\Exception $e) {
index a2fe0fc5b8f3db075f0edd60ab9a63751615c8ef..df69f4a8519331b96025f45041aa16238ce0aee2 100644 (file)
@@ -65,7 +65,7 @@ abstract class AbstractSyncBuilder
     protected $debug;
 
     /**
-     * @return self
+     * @return static
      */
     public static function getInstance()
     {
@@ -77,7 +77,7 @@ abstract class AbstractSyncBuilder
      *
      * @param string $bucket Amazon S3 bucket name
      *
-     * @return self
+     * @return $this
      */
     public function setBucket($bucket)
     {
@@ -91,7 +91,7 @@ abstract class AbstractSyncBuilder
      *
      * @param S3Client $client Amazon S3 client
      *
-     * @return self
+     * @return $this
      */
     public function setClient(S3Client $client)
     {
@@ -105,7 +105,7 @@ abstract class AbstractSyncBuilder
      *
      * @param \Iterator $iterator
      *
-     * @return self
+     * @return $this
      */
     public function setSourceIterator(\Iterator $iterator)
     {
@@ -119,7 +119,7 @@ abstract class AbstractSyncBuilder
      *
      * @param FileNameConverterInterface $converter Filename to object key provider
      *
-     * @return self
+     * @return $this
      */
     public function setSourceFilenameConverter(FilenameConverterInterface $converter)
     {
@@ -133,7 +133,7 @@ abstract class AbstractSyncBuilder
      *
      * @param FileNameConverterInterface $converter Filename to object key provider
      *
-     * @return self
+     * @return $this
      */
     public function setTargetFilenameConverter(FilenameConverterInterface $converter)
     {
@@ -148,7 +148,7 @@ abstract class AbstractSyncBuilder
      *
      * @param string $baseDir Base directory, which will be deleted from each uploaded object key
      *
-     * @return self
+     * @return $this
      */
     public function setBaseDir($baseDir)
     {
@@ -164,7 +164,7 @@ abstract class AbstractSyncBuilder
      *
      * @param string $keyPrefix Prefix for each uploaded key
      *
-     * @return self
+     * @return $this
      */
     public function setKeyPrefix($keyPrefix)
     {
@@ -179,7 +179,7 @@ abstract class AbstractSyncBuilder
      *
      * @param string $delimiter Delimiter to use to separate paths
      *
-     * @return self
+     * @return $this
      */
     public function setDelimiter($delimiter)
     {
@@ -193,7 +193,7 @@ abstract class AbstractSyncBuilder
      *
      * @param array $params Associative array of PutObject (upload) GetObject (download) parameters
      *
-     * @return self
+     * @return $this
      */
     public function setOperationParams(array $params)
     {
@@ -207,7 +207,7 @@ abstract class AbstractSyncBuilder
      *
      * @param int $concurrency Number of concurrent transfers
      *
-     * @return self
+     * @return $this
      */
     public function setConcurrency($concurrency)
     {
@@ -221,7 +221,7 @@ abstract class AbstractSyncBuilder
      *
      * @param bool $force Set to true to force transfers without checking if it has changed
      *
-     * @return self
+     * @return $this
      */
     public function force($force = false)
     {
@@ -235,7 +235,7 @@ abstract class AbstractSyncBuilder
      *
      * @param bool|resource $enabledOrResource Set to true or false to enable or disable debug output. Pass an opened
      *                                         fopen resource to write to instead of writing to standard out.
-     * @return self
+     * @return $this
      */
     public function enableDebugOutput($enabledOrResource = true)
     {
@@ -249,7 +249,7 @@ abstract class AbstractSyncBuilder
      *
      * @param string $search Regular expression search (in preg_match format). Any filename that matches this regex
      *                       will not be transferred.
-     * @return self
+     * @return $this
      */
     public function addRegexFilter($search)
     {
@@ -301,7 +301,7 @@ abstract class AbstractSyncBuilder
     /**
      * Hook to implement in subclasses
      *
-     * @return self
+     * @return AbstractSync
      */
     abstract protected function specificBuild();
 
index b0a1e8cda4ced3d129bcc107d810148314f5da6e..d9cd044449a8e88fa97afe4c0bf23f2a70bf84fa 100644 (file)
@@ -38,7 +38,7 @@ class DownloadSyncBuilder extends AbstractSyncBuilder
      *
      * @param string $directory Directory
      *
-     * @return self
+     * @return $this
      */
     public function setDirectory($directory)
     {
index ad6333d687b81dfda0fd3c12c5c5a2cc0a048b1f..20830590692e45ffb4a52eb10d45ba94da0439c6 100644 (file)
@@ -36,7 +36,7 @@ class UploadSyncBuilder extends AbstractSyncBuilder
      *
      * @param string $path Path that contains files to upload
      *
-     * @return self
+     * @return $this
      */
     public function uploadFromDirectory($path)
     {
@@ -54,7 +54,7 @@ class UploadSyncBuilder extends AbstractSyncBuilder
      *
      * @param string $glob Glob expression
      *
-     * @return self
+     * @return $this
      * @link http://www.php.net/manual/en/function.glob.php
      */
     public function uploadFromGlob($glob)
@@ -71,7 +71,7 @@ class UploadSyncBuilder extends AbstractSyncBuilder
      *
      * @param string $acl Canned ACL for each upload
      *
-     * @return self
+     * @return $this
      */
     public function setAcl($acl)
     {
@@ -85,7 +85,7 @@ class UploadSyncBuilder extends AbstractSyncBuilder
      *
      * @param Acp $acp Access control policy
      *
-     * @return self
+     * @return $this
      */
     public function setAcp(Acp $acp)
     {
@@ -100,7 +100,7 @@ class UploadSyncBuilder extends AbstractSyncBuilder
      *
      * @param int $size Size threshold
      *
-     * @return self
+     * @return $this
      */
     public function setMultipartUploadSize($size)
     {
index 8ee49fb45d34319fee8a5adace4ebd74e2eb5878..513362a50301e2ac500852d0702e166841d9635d 100644 (file)
@@ -15,7 +15,7 @@ namespace Symfony\Component\ClassLoader;
  * ApcClassLoader implements a wrapping autoloader cached in APC for PHP 5.3.
  *
  * It expects an object implementing a findFile method to find the file. This
- * allow using it as a wrapper around the other loaders of the component (the
+ * allows using it as a wrapper around the other loaders of the component (the
  * ClassLoader and the UniversalClassLoader for instance) but also around any
  * other autoloader following this convention (the Composer one for instance)
  *
@@ -46,7 +46,7 @@ class ApcClassLoader
     /**
      * The class loader object being decorated.
      *
-     * @var \Symfony\Component\ClassLoader\ClassLoader
+     * @var object
      *   A class loader object that implements the findFile() method.
      */
     protected $decorated;
@@ -133,5 +133,4 @@ class ApcClassLoader
     {
         return call_user_func_array(array($this->decorated, $method), $args);
     }
-
 }
index 7f83dbc5592d102989d67dbd75144d09f83b68ad..efc95ec8be94c2ca4761a78a7422a8f17e5116b8 100644 (file)
@@ -71,7 +71,6 @@ class ClassMapGenerator
             foreach ($classes as $class) {
                 $map[$class] = $path;
             }
-
         }
 
         return $map;
index 429812d1156a41c287ae64c2870cc9698f7c851b..1c0c37e09887e72823dc8eb35cdf0376ae0a6ed5 100644 (file)
@@ -32,7 +32,7 @@ class Psr4ClassLoader
     public function addPrefix($prefix, $baseDir)
     {
         $prefix = trim($prefix, '\\').'\\';
-        $baseDir = rtrim($baseDir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
+        $baseDir = rtrim($baseDir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
         $this->prefixes[] = array($prefix, $baseDir);
     }
 
@@ -49,7 +49,7 @@ class Psr4ClassLoader
             list($currentPrefix, $currentBaseDir) = $current;
             if (0 === strpos($class, $currentPrefix)) {
                 $classWithoutPrefix = substr($class, strlen($currentPrefix));
-                $file = $currentBaseDir . str_replace('\\', DIRECTORY_SEPARATOR, $classWithoutPrefix) . '.php';
+                $file = $currentBaseDir.str_replace('\\', DIRECTORY_SEPARATOR, $classWithoutPrefix).'.php';
                 if (file_exists($file)) {
                     return $file;
                 }
index fc222b1c9e3988a6c0753af83644b50905b53836..3c785049d209915554dc7cda893563458ac39a75 100644 (file)
@@ -9,51 +9,63 @@ standard or the PEAR naming convention.
 
 First, register the autoloader:
 
-    require_once __DIR__.'/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';
+```php
+require_once __DIR__.'/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';
 
-    use Symfony\Component\ClassLoader\UniversalClassLoader;
+use Symfony\Component\ClassLoader\UniversalClassLoader;
 
-    $loader = new UniversalClassLoader();
-    $loader->register();
+$loader = new UniversalClassLoader();
+$loader->register();
+```
 
 Then, register some namespaces with the `registerNamespace()` method:
 
-    $loader->registerNamespace('Symfony', __DIR__.'/src');
-    $loader->registerNamespace('Monolog', __DIR__.'/vendor/monolog/src');
+```php
+$loader->registerNamespace('Symfony', __DIR__.'/src');
+$loader->registerNamespace('Monolog', __DIR__.'/vendor/monolog/src');
+```
 
 The `registerNamespace()` method takes a namespace prefix and a path where to
 look for the classes as arguments.
 
 You can also register a sub-namespaces:
 
-    $loader->registerNamespace('Doctrine\\Common', __DIR__.'/vendor/doctrine-common/lib');
+```php
+$loader->registerNamespace('Doctrine\\Common', __DIR__.'/vendor/doctrine-common/lib');
+```
 
 The order of registration is significant and the first registered namespace
 takes precedence over later registered one.
 
 You can also register more than one path for a given namespace:
 
-    $loader->registerNamespace('Symfony', array(__DIR__.'/src', __DIR__.'/symfony/src'));
+```php
+$loader->registerNamespace('Symfony', array(__DIR__.'/src', __DIR__.'/symfony/src'));
+```
 
 Alternatively, you can use the `registerNamespaces()` method to register more
 than one namespace at once:
 
-    $loader->registerNamespaces(array(
-        'Symfony'          => array(__DIR__.'/src', __DIR__.'/symfony/src'),
-        'Doctrine\\Common' => __DIR__.'/vendor/doctrine-common/lib',
-        'Doctrine'         => __DIR__.'/vendor/doctrine/lib',
-        'Monolog'          => __DIR__.'/vendor/monolog/src',
-    ));
+```php
+$loader->registerNamespaces(array(
+    'Symfony'          => array(__DIR__.'/src', __DIR__.'/symfony/src'),
+    'Doctrine\\Common' => __DIR__.'/vendor/doctrine-common/lib',
+    'Doctrine'         => __DIR__.'/vendor/doctrine/lib',
+    'Monolog'          => __DIR__.'/vendor/monolog/src',
+));
+```
 
 For better performance, you can use the APC based version of the universal
 class loader:
 
-    require_once __DIR__.'/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';
-    require_once __DIR__.'/src/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php';
+```php
+require_once __DIR__.'/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';
+require_once __DIR__.'/src/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php';
 
-    use Symfony\Component\ClassLoader\ApcUniversalClassLoader;
+use Symfony\Component\ClassLoader\ApcUniversalClassLoader;
 
-    $loader = new ApcUniversalClassLoader('apc.prefix.');
+$loader = new ApcUniversalClassLoader('apc.prefix.');
+```
 
 Furthermore, the component provides tools to aggregate classes into a single
 file, which is especially useful to improve performance on servers that do not
index 38a17f284534b53cb1be6aa3c4ef63354991d783..9755256c79a4ded3453d90e8c70b543b12130437 100644 (file)
@@ -55,13 +55,13 @@ class ApcUniversalClassLoaderTest extends \PHPUnit_Framework_TestCase
        $this->assertTrue(class_exists($className), $message);
    }
 
-   public function getLoadClassTests()
-   {
-       return array(
+    public function getLoadClassTests()
+    {
+        return array(
            array('\\Apc\\Namespaced\\Foo', 'Apc\\Namespaced\\Foo',   '->loadClass() loads Apc\Namespaced\Foo class'),
            array('Apc_Pearlike_Foo',    'Apc_Pearlike_Foo',      '->loadClass() loads Apc_Pearlike_Foo class'),
        );
-   }
+    }
 
    /**
     * @dataProvider getLoadClassFromFallbackTests
@@ -77,15 +77,15 @@ class ApcUniversalClassLoaderTest extends \PHPUnit_Framework_TestCase
        $this->assertTrue(class_exists($className), $message);
    }
 
-   public function getLoadClassFromFallbackTests()
-   {
-       return array(
+    public function getLoadClassFromFallbackTests()
+    {
+        return array(
            array('\\Apc\\Namespaced\\Baz',    'Apc\\Namespaced\\Baz',    '->loadClass() loads Apc\Namespaced\Baz class'),
            array('Apc_Pearlike_Baz',       'Apc_Pearlike_Baz',       '->loadClass() loads Apc_Pearlike_Baz class'),
            array('\\Apc\\Namespaced\\FooBar', 'Apc\\Namespaced\\FooBar', '->loadClass() loads Apc\Namespaced\Baz class from fallback dir'),
            array('Apc_Pearlike_FooBar',    'Apc_Pearlike_FooBar',    '->loadClass() loads Apc_Pearlike_Baz class from fallback dir'),
        );
-   }
+    }
 
    /**
     * @dataProvider getLoadClassNamespaceCollisionTests
@@ -100,9 +100,9 @@ class ApcUniversalClassLoaderTest extends \PHPUnit_Framework_TestCase
        $this->assertTrue(class_exists($className), $message);
    }
 
-   public function getLoadClassNamespaceCollisionTests()
-   {
-       return array(
+    public function getLoadClassNamespaceCollisionTests()
+    {
+        return array(
            array(
                array(
                    'Apc\\NamespaceCollision\\A' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha',
@@ -136,7 +136,7 @@ class ApcUniversalClassLoaderTest extends \PHPUnit_Framework_TestCase
                '->loadClass() loads NamespaceCollision\A\B\Bar from beta.',
            ),
        );
-   }
+    }
 
    /**
     * @dataProvider getLoadClassPrefixCollisionTests
@@ -150,9 +150,9 @@ class ApcUniversalClassLoaderTest extends \PHPUnit_Framework_TestCase
        $this->assertTrue(class_exists($className), $message);
    }
 
-   public function getLoadClassPrefixCollisionTests()
-   {
-       return array(
+    public function getLoadClassPrefixCollisionTests()
+    {
+        return array(
            array(
                array(
                    'ApcPrefixCollision_A_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha/Apc',
@@ -186,5 +186,5 @@ class ApcUniversalClassLoaderTest extends \PHPUnit_Framework_TestCase
                '->loadClass() loads ApcPrefixCollision_A_B_Bar from beta.',
            ),
        );
-   }
+    }
 }
index b8600fc54ed7b4567dc88cce8c11394da3cae6b3..35617e363ea481fb0ba81feb6526a9cc5edc4303 100644 (file)
@@ -76,7 +76,7 @@ class ClassMapGeneratorTest extends \PHPUnit_Framework_TestCase
                 'Namespaced\\Foo'          => realpath(__DIR__).'/Fixtures/Namespaced/Foo.php',
                 'Namespaced\\Baz'          => realpath(__DIR__).'/Fixtures/Namespaced/Baz.php',
                 'Namespaced\\WithComments' => realpath(__DIR__).'/Fixtures/Namespaced/WithComments.php',
-                )
+                ),
             ),
             array(__DIR__.'/Fixtures/beta/NamespaceCollision', array(
                 'NamespaceCollision\\A\\B\\Bar' => realpath(__DIR__).'/Fixtures/beta/NamespaceCollision/A/B/Bar.php',
index d19e07fc11a5e50a9b0b0d39e1fbe57d97a024ce..7db8cd3b67ccc101199cd572baace913570d0ade 100644 (file)
@@ -1,14 +1,24 @@
 <?php
 namespace {
-    class A {}
+    class A
+    {
+    }
 }
 
 namespace Alpha {
-    class A {}
-    class B {}
+    class A
+    {
+    }
+    class B
+    {
+    }
 }
 
 namespace Beta {
-    class A {}
-    class B {}
+    class A
+    {
+    }
+    class B
+    {
+    }
 }
index 2d92c378e1a41e7bb06bb11347cb7e6cfa5e6b0e..70950be6ff23b2f09f2e2a3221d29827370956eb 100644 (file)
@@ -25,6 +25,7 @@ namespace Foo {
 
     class CBar implements IBar
     {
-        use TBar, TFooBar;
+        use TBar;
+        use TFooBar;
     }
 }
index 65cae485ad2a13a1467e794c0ffd804cab7ae401..21a7afbd6e75ba8c99bfe592765f774838704051 100644 (file)
@@ -24,7 +24,7 @@ class Psr4ClassLoaderTest extends \PHPUnit_Framework_TestCase
         $loader = new Psr4ClassLoader();
         $loader->addPrefix(
             'Acme\\DemoLib',
-            __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'psr-4'
+            __DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'psr-4'
         );
         $loader->loadClass($className);
         $this->assertTrue(class_exists($className), sprintf('loadClass() should load %s', $className));
@@ -39,7 +39,7 @@ class Psr4ClassLoaderTest extends \PHPUnit_Framework_TestCase
             array('Acme\\DemoLib\\Foo'),
             array('Acme\\DemoLib\\Class_With_Underscores'),
             array('Acme\\DemoLib\\Lets\\Go\\Deeper\\Foo'),
-            array('Acme\\DemoLib\\Lets\\Go\\Deeper\\Class_With_Underscores')
+            array('Acme\\DemoLib\\Lets\\Go\\Deeper\\Class_With_Underscores'),
         );
     }
 
@@ -52,7 +52,7 @@ class Psr4ClassLoaderTest extends \PHPUnit_Framework_TestCase
         $loader = new Psr4ClassLoader();
         $loader->addPrefix(
             'Acme\\DemoLib',
-            __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'psr-4'
+            __DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'psr-4'
         );
         $loader->loadClass($className);
         $this->assertFalse(class_exists($className), sprintf('loadClass() should not load %s', $className));
@@ -65,7 +65,7 @@ class Psr4ClassLoaderTest extends \PHPUnit_Framework_TestCase
     {
         return array(
             array('Acme\\DemoLib\\I_Do_Not_Exist'),
-            array('UnknownVendor\\SomeLib\\I_Do_Not_Exist')
+            array('UnknownVendor\\SomeLib\\I_Do_Not_Exist'),
         );
     }
 }
index 43f9a7d02c44e4d99e1755eac998a2efce98d66e..8a3149f3198815f788dc22315a4e8794ca51d391 100644 (file)
@@ -287,7 +287,6 @@ class UniversalClassLoader
                     return $file;
                 }
             }
-
         } else {
             // PEAR-like class name
             $normalizedClass = str_replace('_', DIRECTORY_SEPARATOR, $class).'.php';
index 299a79af932830bbd0ced96583c1b80828c338a6..30096bc83f1403cfac12fc9499ec61ac782bb718 100644 (file)
@@ -12,7 +12,7 @@
 namespace Symfony\Component\ClassLoader;
 
 /**
- * XcacheClassLoader implements a wrapping autoloader cached in Xcache for PHP 5.3.
+ * XcacheClassLoader implements a wrapping autoloader cached in XCache for PHP 5.3.
  *
  * It expects an object implementing a findFile method to find the file. This
  * allows using it as a wrapper around the other loaders of the component (the
@@ -43,31 +43,35 @@ namespace Symfony\Component\ClassLoader;
 class XcacheClassLoader
 {
     private $prefix;
-    private $classFinder;
+
+    /**
+     * @var object A class loader object that implements the findFile() method
+     */
+    private $decorated;
 
     /**
      * Constructor.
      *
-     * @param string $prefix      A prefix to create a namespace in Xcache
-     * @param object $classFinder An object that implements findFile() method.
+     * @param string $prefix      The XCache namespace prefix to use.
+     * @param object $decorated   A class loader object that implements the findFile() method.
      *
      * @throws \RuntimeException
      * @throws \InvalidArgumentException
      *
      * @api
      */
-    public function __construct($prefix, $classFinder)
+    public function __construct($prefix, $decorated)
     {
-        if (!extension_loaded('Xcache')) {
-            throw new \RuntimeException('Unable to use XcacheClassLoader as Xcache is not enabled.');
+        if (!extension_loaded('xcache')) {
+            throw new \RuntimeException('Unable to use XcacheClassLoader as XCache is not enabled.');
         }
 
-        if (!method_exists($classFinder, 'findFile')) {
+        if (!method_exists($decorated, 'findFile')) {
             throw new \InvalidArgumentException('The class finder must implement a "findFile" method.');
         }
 
         $this->prefix = $prefix;
-        $this->classFinder = $classFinder;
+        $this->decorated = $decorated;
     }
 
     /**
@@ -116,10 +120,18 @@ class XcacheClassLoader
         if (xcache_isset($this->prefix.$class)) {
             $file = xcache_get($this->prefix.$class);
         } else {
-            $file = $this->classFinder->findFile($class);
+            $file = $this->decorated->findFile($class);
             xcache_set($this->prefix.$class, $file);
         }
 
         return $file;
     }
+
+    /**
+     * Passes through all unknown calls onto the decorated object.
+     */
+    public function __call($method, $args)
+    {
+        return call_user_func_array(array($this->decorated, $method), $args);
+    }
 }
index 410226bb36347f388609b62a3f987152bba83d41..b797667208bb5967a8934732e15391484ce17a8e 100644 (file)
@@ -271,7 +271,7 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
         if ($listener instanceof \Closure) {
             $info += array(
                 'type' => 'Closure',
-                'pretty' => 'closure'
+                'pretty' => 'closure',
             );
         } elseif (is_string($listener)) {
             try {
index 3fdbfd8822e3d61ea69f1064fd3fb20e6ecb2ce8..c85ebdafc15a2553fe1902859a53ba0373382cc9 100644 (file)
@@ -64,8 +64,8 @@ interface EventDispatcherInterface
     /**
      * Removes an event listener from the specified events.
      *
-     * @param string|array $eventName The event(s) to remove a listener from
-     * @param callable     $listener  The listener to remove
+     * @param string   $eventName The event to remove a listener from
+     * @param callable $listener  The listener to remove
      */
     public function removeListener($eventName, $listener);
 
index 22bf74fdc9d66f38a250218276cc6d0b492806ce..c928f136692be8f5b70cbd12c22fa69884267e0d 100644 (file)
@@ -4,16 +4,18 @@ EventDispatcher Component
 The Symfony2 EventDispatcher component implements the Mediator pattern in a
 simple and effective way to make your projects truly extensible.
 
-    use Symfony\Component\EventDispatcher\EventDispatcher;
-    use Symfony\Component\EventDispatcher\Event;
+```php
+use Symfony\Component\EventDispatcher\EventDispatcher;
+use Symfony\Component\EventDispatcher\Event;
 
-    $dispatcher = new EventDispatcher();
+$dispatcher = new EventDispatcher();
 
-    $dispatcher->addListener('event_name', function (Event $event) {
-        // ...
-    });
+$dispatcher->addListener('event_name', function (Event $event) {
+    // ...
+});
 
-    $dispatcher->dispatch('event_name');
+$dispatcher->dispatch('event_name');
+```
 
 Resources
 ---------
index 8ccfabb1ca4074050dff57fe45f0eaaec938a67f..47dd5da168234a144eeb27834046243fb7f35f67 100644 (file)
@@ -24,7 +24,7 @@ class TraceableEventDispatcherTest extends \PHPUnit_Framework_TestCase
         $dispatcher = new EventDispatcher();
         $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch());
 
-        $tdispatcher->addListener('foo', $listener = function () { ; });
+        $tdispatcher->addListener('foo', $listener = function () {; });
         $listeners = $dispatcher->getListeners('foo');
         $this->assertCount(1, $listeners);
         $this->assertSame($listener, $listeners[0]);
@@ -38,7 +38,7 @@ class TraceableEventDispatcherTest extends \PHPUnit_Framework_TestCase
         $dispatcher = new EventDispatcher();
         $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch());
 
-        $tdispatcher->addListener('foo', $listener = function () { ; });
+        $tdispatcher->addListener('foo', $listener = function () {; });
         $this->assertSame($dispatcher->getListeners('foo'), $tdispatcher->getListeners('foo'));
     }
 
@@ -50,7 +50,7 @@ class TraceableEventDispatcherTest extends \PHPUnit_Framework_TestCase
         $this->assertFalse($dispatcher->hasListeners('foo'));
         $this->assertFalse($tdispatcher->hasListeners('foo'));
 
-        $tdispatcher->addListener('foo', $listener = function () { ; });
+        $tdispatcher->addListener('foo', $listener = function () {; });
         $this->assertTrue($dispatcher->hasListeners('foo'));
         $this->assertTrue($tdispatcher->hasListeners('foo'));
     }
@@ -75,7 +75,7 @@ class TraceableEventDispatcherTest extends \PHPUnit_Framework_TestCase
     {
         $dispatcher = new EventDispatcher();
         $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch());
-        $tdispatcher->addListener('foo', $listener = function () { ; });
+        $tdispatcher->addListener('foo', $listener = function () {; });
 
         $this->assertEquals(array(), $tdispatcher->getCalledListeners());
         $this->assertEquals(array('foo.closure' => array('event' => 'foo', 'type' => 'Closure', 'pretty' => 'closure')), $tdispatcher->getNotCalledListeners());
@@ -92,8 +92,8 @@ class TraceableEventDispatcherTest extends \PHPUnit_Framework_TestCase
 
         $dispatcher = new EventDispatcher();
         $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch(), $logger);
-        $tdispatcher->addListener('foo', $listener1 = function () { ; });
-        $tdispatcher->addListener('foo', $listener2 = function () { ; });
+        $tdispatcher->addListener('foo', $listener1 = function () {; });
+        $tdispatcher->addListener('foo', $listener2 = function () {; });
 
         $logger->expects($this->at(0))->method('debug')->with("Notified event \"foo\" to listener \"closure\".");
         $logger->expects($this->at(1))->method('debug')->with("Notified event \"foo\" to listener \"closure\".");
@@ -108,7 +108,7 @@ class TraceableEventDispatcherTest extends \PHPUnit_Framework_TestCase
         $dispatcher = new EventDispatcher();
         $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch(), $logger);
         $tdispatcher->addListener('foo', $listener1 = function (Event $event) { $event->stopPropagation(); });
-        $tdispatcher->addListener('foo', $listener2 = function () { ; });
+        $tdispatcher->addListener('foo', $listener2 = function () {; });
 
         $logger->expects($this->at(0))->method('debug')->with("Notified event \"foo\" to listener \"closure\".");
         $logger->expects($this->at(1))->method('debug')->with("Listener \"closure\" stopped propagation of the event \"foo\".");
index 5959db0d4227f294bf29c79f8c8f4e6e845a566b..b291e1ee3c47d8d4c563f94a6a7be59ca2b28dc8 100644 (file)
@@ -37,7 +37,10 @@ class RegisterListenersPassTest extends \PHPUnit_Framework_TestCase
             ->method('getClass')
             ->will($this->returnValue('stdClass'));
 
-        $builder = $this->getMock('Symfony\Component\DependencyInjection\ContainerBuilder');
+        $builder = $this->getMock(
+            'Symfony\Component\DependencyInjection\ContainerBuilder',
+            array('hasDefinition', 'findTaggedServiceIds', 'getDefinition')
+        );
         $builder->expects($this->any())
             ->method('hasDefinition')
             ->will($this->returnValue(true));
@@ -69,7 +72,10 @@ class RegisterListenersPassTest extends \PHPUnit_Framework_TestCase
             ->method('getClass')
             ->will($this->returnValue('Symfony\Component\EventDispatcher\Tests\DependencyInjection\SubscriberService'));
 
-        $builder = $this->getMock('Symfony\Component\DependencyInjection\ContainerBuilder');
+        $builder = $this->getMock(
+            'Symfony\Component\DependencyInjection\ContainerBuilder',
+            array('hasDefinition', 'findTaggedServiceIds', 'getDefinition', 'findDefinition')
+        );
         $builder->expects($this->any())
             ->method('hasDefinition')
             ->will($this->returnValue(true));
@@ -136,5 +142,7 @@ class RegisterListenersPassTest extends \PHPUnit_Framework_TestCase
 
 class SubscriberService implements \Symfony\Component\EventDispatcher\EventSubscriberInterface
 {
-    public static function getSubscribedEvents() {}
+    public static function getSubscribedEvents()
+    {
+    }
 }
index efc0c29fab865c274792857bce8ab79db2e80c7e..2bd0750b141608a5f3ad29a6e378d2291e94d1a0 100644 (file)
@@ -362,7 +362,7 @@ class TestEventSubscriberWithMultipleListeners implements EventSubscriberInterfa
     {
         return array('pre.foo' => array(
             array('preFoo1'),
-            array('preFoo2', 10)
+            array('preFoo2', 10),
         ));
     }
 }
index 5dfda92f2af48829ca0d689d739f4195ef3fd812..1090bcb29609ef5143bd08e8cf3dc5594d9b73cd 100644 (file)
@@ -18,7 +18,6 @@ use Symfony\Component\EventDispatcher\GenericEvent;
  */
 class GenericEventTest extends \PHPUnit_Framework_TestCase
 {
-
     /**
      * @var GenericEvent
      */
index 3715ece302fb1e15fa176aa2f58000cfbf0952db..75fd243d529ea6e475fef02dfd4b563de1c9dd2d 100644 (file)
@@ -19,7 +19,7 @@
         "php": ">=5.3.3"
     },
     "require-dev": {
-        "symfony/dependency-injection": "~2.0",
+        "symfony/dependency-injection": "~2.0,<2.6.0",
         "symfony/config": "~2.0",
         "symfony/stopwatch": "~2.2",
         "psr/log": "~1.0"