commit
1a73e607bd
@ -1 +1 @@ |
||||
Subproject commit 217626723957161191572ea50172a3943c30696d |
||||
Subproject commit 25e8568d41a9b9a6d1662ccf33058822a890e7f5 |
||||
@ -1,20 +0,0 @@ |
||||
ownCloud gives you freedom and control over your own data. |
||||
A personal cloud which runs on your own server. |
||||
|
||||
http://ownCloud.org |
||||
|
||||
Installation instructions: http://doc.owncloud.org/server/5.0/developer_manual/app/gettingstarted.html |
||||
Contribution Guidelines: http://owncloud.org/dev/contribute/ |
||||
|
||||
Source code: https://github.com/owncloud |
||||
Mailing list: https://mail.kde.org/mailman/listinfo/owncloud |
||||
IRC channel: https://webchat.freenode.net/?channels=owncloud |
||||
Diaspora: https://joindiaspora.com/u/owncloud |
||||
Identi.ca: https://identi.ca/owncloud |
||||
|
||||
Important notice on translations: |
||||
Please submit translations via Transifex: |
||||
https://www.transifex.com/projects/p/owncloud/ |
||||
|
||||
For more detailed information about translations: |
||||
http://owncloud.org/dev/translation/ |
||||
@ -0,0 +1,26 @@ |
||||
# ownCloud |
||||
|
||||
[ownCloud](http://ownCloud.org) gives you freedom and control over your own data. |
||||
A personal cloud which runs on your own server. |
||||
|
||||
### Build Status on [Jenkins CI](https://ci.owncloud.org/) |
||||
Git master: [](https://ci.owncloud.org/job/ownCloud-Server%28master%29/) |
||||
|
||||
### Installation instructions |
||||
http://doc.owncloud.org/server/5.0/developer_manual/app/gettingstarted.html |
||||
|
||||
### Contribution Guidelines |
||||
http://owncloud.org/dev/contribute/ |
||||
|
||||
### Get in touch |
||||
* [Forum](http://forum.owncloud.org) |
||||
* [Mailing list](https://mail.kde.org/mailman/listinfo/owncloud) |
||||
* [IRC channel](https://webchat.freenode.net/?channels=owncloud) |
||||
* [Twitter](https://twitter.com/ownClouders) |
||||
|
||||
### Important notice on translations |
||||
Please submit translations via Transifex: |
||||
https://www.transifex.com/projects/p/owncloud/ |
||||
|
||||
For more detailed information about translations: |
||||
http://owncloud.org/dev/translation/ |
||||
@ -1,4 +1,18 @@ |
||||
<?php $TRANSLATIONS = array( |
||||
"Password successfully changed." => "암호가 성공적으로 변경되었습니다", |
||||
"Could not change the password. Maybe the old password was not correct." => "암호를 변경할수 없습니다. 아마도 예전 암호가 정확하지 않은것 같습니다.", |
||||
"Private key password successfully updated." => "개인키 암호가 성공적으로 업데이트 됨.", |
||||
"Saving..." => "저장 중...", |
||||
"Encryption" => "암호화" |
||||
"personal settings" => "개인 설정", |
||||
"Encryption" => "암호화", |
||||
"Recovery key password" => "키 비밀번호 복구", |
||||
"Change recovery key password:" => "복구 키 비밀번호 변경", |
||||
"Old Recovery key password" => "예전 복구 키 비밀번호", |
||||
"New Recovery key password" => "새 복구 키 비밀번호", |
||||
"Change Password" => "암호 변경", |
||||
"Old log-in password" => "예전 로그인 암호", |
||||
"Current log-in password" => "현재 로그인 암호", |
||||
"Update Private Key Password" => "개인 키 암호 업데이트", |
||||
"File recovery settings updated" => "파일 복구 설정 업데이트됨", |
||||
"Could not update file recovery" => "파일 복구를 업데이트 할수 없습니다" |
||||
); |
||||
|
||||
@ -0,0 +1,107 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common; |
||||
|
||||
use Guzzle\Service\Builder\ServiceBuilder; |
||||
use Guzzle\Service\Builder\ServiceBuilderLoader; |
||||
|
||||
/** |
||||
* Base class for interacting with web service clients |
||||
*/ |
||||
class Aws extends ServiceBuilder |
||||
{ |
||||
/** |
||||
* @var string Current version of the SDK |
||||
*/ |
||||
const VERSION = '2.4.0'; |
||||
|
||||
/** |
||||
* Create a new service locator for the AWS SDK |
||||
* |
||||
* You can configure the service locator is four different ways: |
||||
* |
||||
* 1. Use the default configuration file shipped with the SDK that wires class names with service short names and |
||||
* specify global parameters to add to every definition (e.g. key, secret, credentials, etc) |
||||
* |
||||
* 2. Use a custom configuration file that extends the default config and supplies credentials for each service. |
||||
* |
||||
* 3. Use a custom config file that wires services to custom short names for services. |
||||
* |
||||
* 4. If you are on Amazon EC2, you can use the default configuration file and not provide any credentials so that |
||||
* you are using InstanceProfile credentials. |
||||
* |
||||
* @param array|string $config The full path to a .php or .js|.json file, or an associative array of data |
||||
* to use as global parameters to pass to each service. |
||||
* @param array $globalParameters Global parameters to pass to every service as it is instantiated. |
||||
* |
||||
* @return Aws |
||||
*/ |
||||
public static function factory($config = null, array $globalParameters = array()) |
||||
{ |
||||
if (!$config) { |
||||
// If nothing is passed in, then use the default configuration file with credentials from the environment |
||||
$config = self::getDefaultServiceDefinition(); |
||||
} elseif (is_array($config)) { |
||||
// If an array was passed, then use the default configuration file with parameter overrides |
||||
$globalParameters = $config; |
||||
$config = self::getDefaultServiceDefinition(); |
||||
} |
||||
|
||||
$loader = new ServiceBuilderLoader(); |
||||
$loader->addAlias('_aws', self::getDefaultServiceDefinition()) |
||||
->addAlias('_sdk1', __DIR__ . '/Resources/sdk1-config.php'); |
||||
|
||||
return $loader->load($config, $globalParameters); |
||||
} |
||||
|
||||
/** |
||||
* Get the full path to the default service builder definition file |
||||
* |
||||
* @return string |
||||
*/ |
||||
public static function getDefaultServiceDefinition() |
||||
{ |
||||
return __DIR__ . '/Resources/aws-config.php'; |
||||
} |
||||
|
||||
/** |
||||
* Returns the configuration for the service builder |
||||
* |
||||
* @return array |
||||
*/ |
||||
public function getConfig() |
||||
{ |
||||
return $this->builderConfig; |
||||
} |
||||
|
||||
/** |
||||
* Enables the facades for the clients defined in the service builder |
||||
* |
||||
* @param string|null $namespace The namespace that the facades should be mounted to. Defaults to global namespace |
||||
* |
||||
* @return Aws |
||||
*/ |
||||
public function enableFacades($namespace = null) |
||||
{ |
||||
$facadeClass = 'Aws\\Common\\Facade\\Facade'; |
||||
if (class_exists($facadeClass)) { |
||||
$facadeClass::mountFacades($this, $namespace); |
||||
} |
||||
|
||||
return $this; |
||||
} |
||||
} |
||||
@ -0,0 +1,273 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Client; |
||||
|
||||
use Aws\Common\Aws; |
||||
use Aws\Common\Credentials\Credentials; |
||||
use Aws\Common\Credentials\CredentialsInterface; |
||||
use Aws\Common\Enum\ClientOptions as Options; |
||||
use Aws\Common\Exception\InvalidArgumentException; |
||||
use Aws\Common\Signature\EndpointSignatureInterface; |
||||
use Aws\Common\Signature\SignatureInterface; |
||||
use Aws\Common\Signature\SignatureListener; |
||||
use Aws\Common\Waiter\WaiterClassFactory; |
||||
use Aws\Common\Waiter\CompositeWaiterFactory; |
||||
use Aws\Common\Waiter\WaiterFactoryInterface; |
||||
use Aws\Common\Waiter\WaiterConfigFactory; |
||||
use Guzzle\Common\Collection; |
||||
use Guzzle\Service\Client; |
||||
use Guzzle\Service\Description\ServiceDescriptionInterface; |
||||
|
||||
/** |
||||
* Abstract AWS client |
||||
*/ |
||||
abstract class AbstractClient extends Client implements AwsClientInterface |
||||
{ |
||||
/** |
||||
* @var CredentialsInterface AWS credentials |
||||
*/ |
||||
protected $credentials; |
||||
|
||||
/** |
||||
* @var SignatureInterface Signature implementation of the service |
||||
*/ |
||||
protected $signature; |
||||
|
||||
/** |
||||
* @var WaiterFactoryInterface Factory used to create waiter classes |
||||
*/ |
||||
protected $waiterFactory; |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public static function getAllEvents() |
||||
{ |
||||
return array_merge(Client::getAllEvents(), array( |
||||
'client.region_changed', |
||||
'client.credentials_changed', |
||||
)); |
||||
} |
||||
|
||||
/** |
||||
* @param CredentialsInterface $credentials AWS credentials |
||||
* @param SignatureInterface $signature Signature implementation |
||||
* @param Collection $config Configuration options |
||||
* |
||||
* @throws InvalidArgumentException if an endpoint provider isn't provided |
||||
*/ |
||||
public function __construct(CredentialsInterface $credentials, SignatureInterface $signature, Collection $config) |
||||
{ |
||||
// Bootstrap with Guzzle |
||||
parent::__construct($config->get(Options::BASE_URL), $config); |
||||
$this->credentials = $credentials; |
||||
$this->signature = $signature; |
||||
|
||||
// Make sure the user agent is prefixed by the SDK version |
||||
$this->setUserAgent('aws-sdk-php2/' . Aws::VERSION, true); |
||||
|
||||
// Add the event listener so that requests are signed before they are sent |
||||
$dispatcher = $this->getEventDispatcher(); |
||||
$dispatcher->addSubscriber(new SignatureListener($credentials, $signature)); |
||||
|
||||
if ($backoff = $config->get(Options::BACKOFF)) { |
||||
$dispatcher->addSubscriber($backoff, -255); |
||||
} |
||||
} |
||||
|
||||
public function __call($method, $args) |
||||
{ |
||||
if (substr($method, 0, 3) === 'get' && substr($method, -8) === 'Iterator') { |
||||
// Allow magic method calls for iterators (e.g. $client->get<CommandName>Iterator($params)) |
||||
$commandOptions = isset($args[0]) ? $args[0] : null; |
||||
$iteratorOptions = isset($args[1]) ? $args[1] : array(); |
||||
return $this->getIterator(substr($method, 3, -8), $commandOptions, $iteratorOptions); |
||||
} elseif (substr($method, 0, 9) == 'waitUntil') { |
||||
// Allow magic method calls for waiters (e.g. $client->waitUntil<WaiterName>($params)) |
||||
return $this->waitUntil(substr($method, 9), isset($args[0]) ? $args[0]: array()); |
||||
} else { |
||||
return parent::__call(ucfirst($method), $args); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 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 |
||||
*/ |
||||
public static function getEndpoint(ServiceDescriptionInterface $description, $region, $scheme) |
||||
{ |
||||
$service = $description->getData('serviceFullName'); |
||||
// Lookup the region in the service description |
||||
if (!($regions = $description->getData('regions'))) { |
||||
throw new InvalidArgumentException("No regions found in the {$service} description"); |
||||
} |
||||
// Ensure that the region exists for the service |
||||
if (!isset($regions[$region])) { |
||||
throw new InvalidArgumentException("{$region} is not a valid region for {$service}"); |
||||
} |
||||
// Ensure that the scheme is valid |
||||
if ($regions[$region][$scheme] == false) { |
||||
throw new InvalidArgumentException("{$scheme} is not a valid URI scheme for {$service} in {$region}"); |
||||
} |
||||
|
||||
return $scheme . '://' . $regions[$region]['hostname']; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getCredentials() |
||||
{ |
||||
return $this->credentials; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function setCredentials(CredentialsInterface $credentials) |
||||
{ |
||||
$formerCredentials = $this->credentials; |
||||
$this->credentials = $credentials; |
||||
|
||||
// Dispatch an event that the credentials have been changed |
||||
$this->dispatch('client.credentials_changed', array( |
||||
'credentials' => $credentials, |
||||
'former_credentials' => $formerCredentials, |
||||
)); |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getSignature() |
||||
{ |
||||
return $this->signature; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getRegions() |
||||
{ |
||||
return $this->serviceDescription->getData('regions'); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getRegion() |
||||
{ |
||||
return $this->getConfig(Options::REGION); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function setRegion($region) |
||||
{ |
||||
$config = $this->getConfig(); |
||||
$formerRegion = $config->get(Options::REGION); |
||||
$global = $this->serviceDescription->getData('globalEndpoint'); |
||||
|
||||
// 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); |
||||
|
||||
// Update the signature if necessary |
||||
$signature = $this->getSignature(); |
||||
if ($signature instanceof EndpointSignatureInterface) { |
||||
/** @var $signature EndpointSignatureInterface */ |
||||
$signature->setRegionName($region); |
||||
} |
||||
|
||||
// Dispatch an event that the region has been changed |
||||
$this->dispatch('client.region_changed', array( |
||||
'region' => $region, |
||||
'former_region' => $formerRegion, |
||||
)); |
||||
} |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function waitUntil($waiter, array $input = array()) |
||||
{ |
||||
$this->getWaiter($waiter, $input)->wait(); |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getWaiter($waiter, array $input = array()) |
||||
{ |
||||
return $this->getWaiterFactory()->build($waiter) |
||||
->setClient($this) |
||||
->setConfig($input); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function setWaiterFactory(WaiterFactoryInterface $waiterFactory) |
||||
{ |
||||
$this->waiterFactory = $waiterFactory; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getWaiterFactory() |
||||
{ |
||||
if (!$this->waiterFactory) { |
||||
$clientClass = get_class($this); |
||||
// Use a composite factory that checks for classes first, then config waiters |
||||
$this->waiterFactory = new CompositeWaiterFactory(array( |
||||
new WaiterClassFactory(substr($clientClass, 0, strrpos($clientClass, '\\')) . '\\Waiter') |
||||
)); |
||||
if ($this->getDescription()) { |
||||
$this->waiterFactory->addFactory(new WaiterConfigFactory($this->getDescription()->getData('waiters'))); |
||||
} |
||||
} |
||||
|
||||
return $this->waiterFactory; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getApiVersion() |
||||
{ |
||||
return $this->serviceDescription->getApiVersion(); |
||||
} |
||||
} |
||||
@ -0,0 +1,118 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Client; |
||||
|
||||
use Aws\Common\Credentials\CredentialsInterface; |
||||
use Aws\Common\Signature\SignatureInterface; |
||||
use Aws\Common\Waiter\WaiterFactoryInterface; |
||||
use Aws\Common\Waiter\WaiterInterface; |
||||
use Guzzle\Service\ClientInterface; |
||||
|
||||
/** |
||||
* Interface that all AWS clients implement |
||||
*/ |
||||
interface AwsClientInterface extends ClientInterface |
||||
{ |
||||
/** |
||||
* Returns the AWS credentials associated with the client |
||||
* |
||||
* @return CredentialsInterface |
||||
*/ |
||||
public function getCredentials(); |
||||
|
||||
/** |
||||
* Sets the credentials object associated with the client |
||||
* |
||||
* @param CredentialsInterface $credentials Credentials object to use |
||||
* |
||||
* @return self |
||||
*/ |
||||
public function setCredentials(CredentialsInterface $credentials); |
||||
|
||||
/** |
||||
* Returns the signature implementation used with the client |
||||
* |
||||
* @return SignatureInterface |
||||
*/ |
||||
public function getSignature(); |
||||
|
||||
/** |
||||
* Get a list of available regions and region data |
||||
* |
||||
* @return array |
||||
*/ |
||||
public function getRegions(); |
||||
|
||||
/** |
||||
* Get the name of the region to which the client is configured to send requests |
||||
* |
||||
* @return string |
||||
*/ |
||||
public function getRegion(); |
||||
|
||||
/** |
||||
* Change the region to which the client is configured to send requests |
||||
* |
||||
* @param string $region Name of the region |
||||
* |
||||
* @return self |
||||
*/ |
||||
public function setRegion($region); |
||||
|
||||
/** |
||||
* Get the waiter factory being used by the client |
||||
* |
||||
* @return WaiterFactoryInterface |
||||
*/ |
||||
public function getWaiterFactory(); |
||||
|
||||
/** |
||||
* Set the waiter factory to use with the client |
||||
* |
||||
* @param WaiterFactoryInterface $waiterFactory Factory used to create waiters |
||||
* |
||||
* @return self |
||||
*/ |
||||
public function setWaiterFactory(WaiterFactoryInterface $waiterFactory); |
||||
|
||||
/** |
||||
* Wait until a resource is available or an associated waiter returns true |
||||
* |
||||
* @param string $waiter Name of the waiter |
||||
* @param array $input Values used as input for the underlying operation and to control the waiter |
||||
* |
||||
* @return self |
||||
*/ |
||||
public function waitUntil($waiter, array $input = array()); |
||||
|
||||
/** |
||||
* Get a named waiter object |
||||
* |
||||
* @param string $waiter Name of the waiter |
||||
* @param array $input Values used as input for the underlying operation and to control the waiter |
||||
* |
||||
* @return WaiterInterface |
||||
*/ |
||||
public function getWaiter($waiter, array $input = array()); |
||||
|
||||
/** |
||||
* Get the API version of the client (e.g. 2006-03-01) |
||||
* |
||||
* @return string |
||||
*/ |
||||
public function getApiVersion(); |
||||
} |
||||
@ -0,0 +1,454 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Client; |
||||
|
||||
use Aws\Common\Credentials\Credentials; |
||||
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\Signature\EndpointSignatureInterface; |
||||
use Aws\Common\Signature\SignatureInterface; |
||||
use Aws\Common\Signature\SignatureV2; |
||||
use Aws\Common\Signature\SignatureV3; |
||||
use Aws\Common\Signature\SignatureV3Https; |
||||
use Aws\Common\Signature\SignatureV4; |
||||
use Guzzle\Common\Collection; |
||||
use Guzzle\Plugin\Backoff\BackoffPlugin; |
||||
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; |
||||
use Guzzle\Log\ClosureLogAdapter; |
||||
use Guzzle\Plugin\Backoff\BackoffLogger; |
||||
|
||||
/** |
||||
* Builder for creating AWS service clients |
||||
*/ |
||||
class ClientBuilder |
||||
{ |
||||
/** |
||||
* @var array Default client config |
||||
*/ |
||||
protected static $commonConfigDefaults = array('scheme' => 'https'); |
||||
|
||||
/** |
||||
* @var array Default client requirements |
||||
*/ |
||||
protected static $commonConfigRequirements = array(Options::SERVICE_DESCRIPTION); |
||||
|
||||
/** |
||||
* @var string The namespace of the client |
||||
*/ |
||||
protected $clientNamespace; |
||||
|
||||
/** |
||||
* @var array The config options |
||||
*/ |
||||
protected $config = array(); |
||||
|
||||
/** |
||||
* @var array The config defaults |
||||
*/ |
||||
protected $configDefaults = array(); |
||||
|
||||
/** |
||||
* @var array The config requirements |
||||
*/ |
||||
protected $configRequirements = array(); |
||||
|
||||
/** |
||||
* @var ExceptionParserInterface The Parser interface for the client |
||||
*/ |
||||
protected $exceptionParser; |
||||
|
||||
/** |
||||
* @var array Array of configuration data for iterators available for the client |
||||
*/ |
||||
protected $iteratorsConfig = array(); |
||||
|
||||
/** |
||||
* Factory method for creating the client builder |
||||
* |
||||
* @param string $namespace The namespace of the client |
||||
* |
||||
* @return ClientBuilder |
||||
*/ |
||||
public static function factory($namespace = null) |
||||
{ |
||||
return new static($namespace); |
||||
} |
||||
|
||||
/** |
||||
* Constructs a client builder |
||||
* |
||||
* @param string $namespace The namespace of the client |
||||
*/ |
||||
public function __construct($namespace = null) |
||||
{ |
||||
$this->clientNamespace = $namespace; |
||||
} |
||||
|
||||
/** |
||||
* Sets the config options |
||||
* |
||||
* @param array|Collection $config The config options |
||||
* |
||||
* @return ClientBuilder |
||||
*/ |
||||
public function setConfig($config) |
||||
{ |
||||
$this->config = $this->processArray($config); |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* Sets the config options' defaults |
||||
* |
||||
* @param array|Collection $defaults The default values |
||||
* |
||||
* @return ClientBuilder |
||||
*/ |
||||
public function setConfigDefaults($defaults) |
||||
{ |
||||
$this->configDefaults = $this->processArray($defaults); |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* Sets the required config options |
||||
* |
||||
* @param array|Collection $required The required config options |
||||
* |
||||
* @return ClientBuilder |
||||
*/ |
||||
public function setConfigRequirements($required) |
||||
{ |
||||
$this->configRequirements = $this->processArray($required); |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* Sets the exception parser. If one is not provided the builder will use |
||||
* the default XML exception parser. |
||||
* |
||||
* @param ExceptionParserInterface $parser The exception parser |
||||
* |
||||
* @return ClientBuilder |
||||
*/ |
||||
public function setExceptionParser(ExceptionParserInterface $parser) |
||||
{ |
||||
$this->exceptionParser = $parser; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* Set the configuration for the client's iterators |
||||
* |
||||
* @param array $config Configuration data for client's iterators |
||||
* |
||||
* @return ClientBuilder |
||||
*/ |
||||
public function setIteratorsConfig(array $config) |
||||
{ |
||||
$this->iteratorsConfig = $config; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* Performs the building logic using all of the parameters that have been |
||||
* set and falling back to default values. Returns an instantiate service |
||||
* client with credentials prepared and plugins attached. |
||||
* |
||||
* @return AwsClientInterface |
||||
* @throws InvalidArgumentException |
||||
*/ |
||||
public function build() |
||||
{ |
||||
// Resolve configuration |
||||
$config = Collection::fromConfig( |
||||
$this->config, |
||||
array_merge(self::$commonConfigDefaults, $this->configDefaults), |
||||
(self::$commonConfigRequirements + $this->configRequirements) |
||||
); |
||||
|
||||
// Resolve endpoint and signature from the config and service description |
||||
$description = $this->updateConfigFromDescription($config); |
||||
$signature = $this->getSignature($description, $config); |
||||
|
||||
// Resolve credentials |
||||
if (!$credentials = $config->get('credentials')) { |
||||
$credentials = Credentials::factory($config); |
||||
} |
||||
|
||||
// Resolve exception parser |
||||
if (!$this->exceptionParser) { |
||||
$this->exceptionParser = new DefaultXmlExceptionParser(); |
||||
} |
||||
|
||||
// Resolve backoff strategy |
||||
$backoff = $config->get(Options::BACKOFF); |
||||
if ($backoff === null) { |
||||
$backoff = new BackoffPlugin( |
||||
// Retry failed requests up to 3 times if it is determined that the request can be retried |
||||
new TruncatedBackoffStrategy(3, |
||||
// Retry failed requests with 400-level responses due to throttling |
||||
new ThrottlingErrorChecker($this->exceptionParser, |
||||
// Retry failed requests with 500-level responses |
||||
new HttpBackoffStrategy(array(500, 503, 509), |
||||
// Retry failed requests due to transient network or cURL problems |
||||
new CurlBackoffStrategy(null, |
||||
// Retry requests that failed due to expired credentials |
||||
new ExpiredCredentialsChecker($this->exceptionParser, |
||||
new ExponentialBackoffStrategy() |
||||
) |
||||
) |
||||
) |
||||
) |
||||
) |
||||
); |
||||
$config->set(Options::BACKOFF, $backoff); |
||||
} |
||||
|
||||
if ($backoff) { |
||||
$this->addBackoffLogger($backoff, $config); |
||||
} |
||||
|
||||
// Determine service and class name |
||||
$clientClass = 'Aws\Common\Client\DefaultClient'; |
||||
if ($this->clientNamespace) { |
||||
$serviceName = substr($this->clientNamespace, strrpos($this->clientNamespace, '\\') + 1); |
||||
$clientClass = $this->clientNamespace . '\\' . $serviceName . 'Client'; |
||||
} |
||||
|
||||
/** @var $client AwsClientInterface */ |
||||
$client = new $clientClass($credentials, $signature, $config); |
||||
$client->setDescription($description); |
||||
|
||||
// Add exception marshaling so that more descriptive exception are thrown |
||||
if ($this->clientNamespace) { |
||||
$exceptionFactory = new NamespaceExceptionFactory( |
||||
$this->exceptionParser, |
||||
"{$this->clientNamespace}\\Exception", |
||||
"{$this->clientNamespace}\\Exception\\{$serviceName}Exception" |
||||
); |
||||
$client->addSubscriber(new ExceptionListener($exceptionFactory)); |
||||
} |
||||
|
||||
// Add the UserAgentPlugin to append to the User-Agent header of requests |
||||
$client->addSubscriber(new UserAgentListener()); |
||||
|
||||
// Filters used for the cache plugin |
||||
$client->getConfig()->set( |
||||
'params.cache.key_filter', |
||||
'header=date,x-amz-date,x-amz-security-token,x-amzn-authorization' |
||||
); |
||||
|
||||
// Set the iterator resource factory based on the provided iterators config |
||||
$client->setResourceIteratorFactory(new AwsResourceIteratorFactory( |
||||
$this->iteratorsConfig, |
||||
new ResourceIteratorClassFactory($this->clientNamespace . '\\Iterator') |
||||
)); |
||||
|
||||
// Disable parameter validation if needed |
||||
if ($config->get(Options::VALIDATION) === false) { |
||||
$params = $config->get('command.params') ?: array(); |
||||
$params['command.disable_validation'] = true; |
||||
$config->set('command.params', $params); |
||||
} |
||||
|
||||
return $client; |
||||
} |
||||
|
||||
/** |
||||
* Add backoff logging to the backoff plugin if needed |
||||
* |
||||
* @param BackoffPlugin $plugin Backoff plugin |
||||
* @param Collection $config Configuration settings |
||||
* |
||||
* @throws InvalidArgumentException |
||||
*/ |
||||
protected function addBackoffLogger(BackoffPlugin $plugin, Collection $config) |
||||
{ |
||||
// The log option can be set to `debug` or an instance of a LogAdapterInterface |
||||
if ($logger = $config->get(Options::BACKOFF_LOGGER)) { |
||||
$format = $config->get(Options::BACKOFF_LOGGER_TEMPLATE); |
||||
if ($logger === 'debug') { |
||||
$logger = new ClosureLogAdapter(function ($message) { |
||||
trigger_error($message . "\n"); |
||||
}); |
||||
} elseif (!($logger instanceof LogAdapterInterface)) { |
||||
throw new InvalidArgumentException( |
||||
Options::BACKOFF_LOGGER . ' must be set to `debug` or an instance of ' |
||||
. 'Guzzle\\Common\\Log\\LogAdapterInterface' |
||||
); |
||||
} |
||||
// Create the plugin responsible for logging exponential backoff retries |
||||
$logPlugin = new BackoffLogger($logger); |
||||
// You can specify a custom format or use the default |
||||
if ($format) { |
||||
$logPlugin->setTemplate($format); |
||||
} |
||||
$plugin->addSubscriber($logPlugin); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Ensures that an array (e.g. for config data) is actually in array form |
||||
* |
||||
* @param array|Collection $array The array data |
||||
* |
||||
* @return array |
||||
* @throws InvalidArgumentException if the arg is not an array or Collection |
||||
*/ |
||||
protected function processArray($array) |
||||
{ |
||||
if ($array instanceof Collection) { |
||||
$array = $array->getAll(); |
||||
} |
||||
|
||||
if (!is_array($array)) { |
||||
throw new InvalidArgumentException('The config must be provided as an array or Collection.'); |
||||
} |
||||
|
||||
return $array; |
||||
} |
||||
|
||||
/** |
||||
* Update a configuration object from a service description |
||||
* |
||||
* @param Collection $config Config to update |
||||
* |
||||
* @return ServiceDescription |
||||
* @throws InvalidArgumentException |
||||
*/ |
||||
protected function updateConfigFromDescription(Collection $config) |
||||
{ |
||||
$description = $config->get(Options::SERVICE_DESCRIPTION); |
||||
if (!($description instanceof ServiceDescription)) { |
||||
// Inject the version into the sprintf template if it is a string |
||||
if (is_string($description)) { |
||||
$description = sprintf($description, $config->get(Options::VERSION)); |
||||
} |
||||
$description = ServiceDescription::factory($description); |
||||
$config->set(Options::SERVICE_DESCRIPTION, $description); |
||||
} |
||||
|
||||
if (!$config->get(Options::SERVICE)) { |
||||
$config->set(Options::SERVICE, $description->getData('endpointPrefix')); |
||||
} |
||||
|
||||
if ($iterators = $description->getData('iterators')) { |
||||
$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); |
||||
} |
||||
|
||||
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) |
||||
)); |
||||
} |
||||
|
||||
return $description; |
||||
} |
||||
|
||||
/** |
||||
* Return an appropriate signature object for a a client based on a description |
||||
* |
||||
* @param ServiceDescription $description Description that holds a signature option |
||||
* @param Collection $config Configuration options |
||||
* |
||||
* @return SignatureInterface |
||||
* @throws InvalidArgumentException |
||||
*/ |
||||
protected function getSignature(ServiceDescription $description, Collection $config) |
||||
{ |
||||
if (!$signature = $config->get(Options::SIGNATURE)) { |
||||
switch ($description->getData('signatureVersion')) { |
||||
case 'v2': |
||||
$signature = new SignatureV2(); |
||||
break; |
||||
case 'v3': |
||||
$signature = new SignatureV3(); |
||||
break; |
||||
case 'v3https': |
||||
$signature = new SignatureV3Https(); |
||||
break; |
||||
case 'v4': |
||||
$signature = new SignatureV4(); |
||||
break; |
||||
default: |
||||
throw new InvalidArgumentException('Service description does not specify a valid signatureVersion'); |
||||
} |
||||
} |
||||
|
||||
// Allow a custom service name or region value to be provided |
||||
if ($signature instanceof EndpointSignatureInterface) { |
||||
|
||||
// Determine the service name to use when signing |
||||
if (!$service = $config->get(Options::SIGNATURE_SERVICE)) { |
||||
if (!$service = $description->getData('signingName')) { |
||||
$service = $description->getData('endpointPrefix'); |
||||
} |
||||
} |
||||
$signature->setServiceName($service); |
||||
|
||||
// Determine the region to use when signing requests |
||||
if (!$region = $config->get(Options::SIGNATURE_REGION)) { |
||||
$region = $config->get(Options::REGION); |
||||
} |
||||
$signature->setRegionName($region); |
||||
} |
||||
|
||||
return $signature; |
||||
} |
||||
} |
||||
@ -0,0 +1,76 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Client; |
||||
|
||||
use Aws\Common\Enum\ClientOptions as Options; |
||||
use Guzzle\Common\Collection; |
||||
|
||||
/** |
||||
* Generic client for interacting with an AWS service |
||||
*/ |
||||
class DefaultClient extends AbstractClient |
||||
{ |
||||
/** |
||||
* Factory method to create a default client using an array of configuration options. |
||||
* |
||||
* The following array keys and values are available options: |
||||
* |
||||
* - Credential options (`key`, `secret`, and optional `token` OR `credentials` is required) |
||||
* - key: AWS Access Key ID |
||||
* - secret: AWS secret access key |
||||
* - credentials: You can optionally provide a custom `Aws\Common\Credentials\CredentialsInterface` object |
||||
* - token: Custom AWS security token to use with request authentication |
||||
* - token.ttd: UNIX timestamp for when the custom credentials expire |
||||
* - credentials.cache: Used to cache credentials when using providers that require HTTP requests. Set the true |
||||
* to use the default APC cache or provide a `Guzzle\Cache\CacheAdapterInterface` object. |
||||
* - credentials.cache.key: Optional custom cache key to use with the credentials |
||||
* - credentials.client: Pass this option to specify a custom `Guzzle\Http\ClientInterface` to use if your |
||||
* credentials require a HTTP request (e.g. RefreshableInstanceProfileCredentials) |
||||
* - Region and Endpoint options (a `region` and optional `scheme` OR a `base_url` is required) |
||||
* - region: Region name (e.g. 'us-east-1', 'us-west-1', 'us-west-2', 'eu-west-1', etc...) |
||||
* - scheme: URI Scheme of the base URL (e.g. 'https', 'http'). |
||||
* - service: Specify the name of the service |
||||
* - base_url: Instead of using a `region` and `scheme`, you can specify a custom base URL for the client |
||||
* - Signature options |
||||
* - signature: You can optionally provide a custom signature implementation used to sign requests |
||||
* - signature.service: Set to explicitly override the service name used in signatures |
||||
* - signature.region: Set to explicitly override the region name used in signatures |
||||
* - Exponential backoff options |
||||
* - client.backoff.logger: `Guzzle\Log\LogAdapterInterface` object used to log backoff retries. Use |
||||
* 'debug' to emit PHP warnings when a retry is issued. |
||||
* - client.backoff.logger.template: Optional template to use for exponential backoff log messages. See |
||||
* `Guzzle\Plugin\Backoff\BackoffLogger` for formatting information. |
||||
* - Generic client options |
||||
* - ssl.certificate_authority: Set to true to use the bundled CA cert (default), system to use the certificate |
||||
* bundled with your system, or pass the full path to an SSL certificate bundle. This option should be used |
||||
* when you encounter curl error code 60. |
||||
* - curl.CURLOPT_VERBOSE: Set to true to output curl debug information during transfers |
||||
* - curl.*: Prefix any available cURL option with `curl.` to add cURL options to each request. |
||||
* See: http://www.php.net/manual/en/function.curl-setopt.php |
||||
* |
||||
* @param array|Collection $config Client configuration data |
||||
* |
||||
* @return self |
||||
*/ |
||||
public static function factory($config = array()) |
||||
{ |
||||
return ClientBuilder::factory() |
||||
->setConfig($config) |
||||
->setConfigDefaults(array(Options::SCHEME => 'https')) |
||||
->build(); |
||||
} |
||||
} |
||||
@ -0,0 +1,80 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Client; |
||||
|
||||
use Aws\Common\Credentials\AbstractRefreshableCredentials; |
||||
use Aws\Common\Client\AwsClientInterface; |
||||
use Aws\Common\Exception\Parser\ExceptionParserInterface; |
||||
use Guzzle\Http\Exception\HttpException; |
||||
use Guzzle\Http\Message\RequestInterface; |
||||
use Guzzle\Http\Message\Response; |
||||
use Guzzle\Plugin\Backoff\BackoffStrategyInterface; |
||||
use Guzzle\Plugin\Backoff\AbstractBackoffStrategy; |
||||
|
||||
/** |
||||
* Backoff logic that handles retrying requests when credentials expire |
||||
*/ |
||||
class ExpiredCredentialsChecker extends AbstractBackoffStrategy |
||||
{ |
||||
/** |
||||
* @var array Array of known retrying exception codes |
||||
*/ |
||||
protected $retryable = array( |
||||
'RequestExpired' => true, |
||||
'ExpiredTokenException' => true, |
||||
'ExpiredToken' => true |
||||
); |
||||
|
||||
/** |
||||
* @var ExceptionParserInterface Exception parser used to parse exception responses |
||||
*/ |
||||
protected $exceptionParser; |
||||
|
||||
public function __construct(ExceptionParserInterface $exceptionParser, BackoffStrategyInterface $next = null) { |
||||
$this->exceptionParser = $exceptionParser; |
||||
$this->next = $next; |
||||
} |
||||
|
||||
public function makesDecision() |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
protected function getDelay($retries, RequestInterface $request, Response $response = null, HttpException $e = null) |
||||
{ |
||||
if ($response && $response->isClientError()) { |
||||
|
||||
$parts = $this->exceptionParser->parse($request, $response); |
||||
if (!isset($this->retryable[$parts['code']]) || !$request->getClient()) { |
||||
return null; |
||||
} |
||||
|
||||
/** @var $client AwsClientInterface */ |
||||
$client = $request->getClient(); |
||||
// Only retry if the credentials can be refreshed |
||||
if (!($client->getCredentials() instanceof AbstractRefreshableCredentials)) { |
||||
return null; |
||||
} |
||||
|
||||
// Resign the request using new credentials |
||||
$client->getSignature()->signRequest($request, $client->getCredentials()->setExpiration(-1)); |
||||
|
||||
// Retry immediately with no delay |
||||
return 0; |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,75 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Client; |
||||
|
||||
use Aws\Common\Exception\Parser\ExceptionParserInterface; |
||||
use Guzzle\Http\Exception\HttpException; |
||||
use Guzzle\Http\Message\RequestInterface; |
||||
use Guzzle\Http\Message\Response; |
||||
use Guzzle\Plugin\Backoff\BackoffStrategyInterface; |
||||
use Guzzle\Plugin\Backoff\AbstractBackoffStrategy; |
||||
|
||||
/** |
||||
* Backoff logic that handles throttling exceptions from services |
||||
*/ |
||||
class ThrottlingErrorChecker extends AbstractBackoffStrategy |
||||
{ |
||||
/** @var array Whitelist of exception codes (as indexes) that indicate throttling */ |
||||
protected static $throttlingExceptions = array( |
||||
'RequestLimitExceeded' => true, |
||||
'Throttling' => true, |
||||
'ThrottlingException' => true, |
||||
'ProvisionedThroughputExceededException' => true, |
||||
'RequestThrottled' => true, |
||||
); |
||||
|
||||
/** |
||||
* @var ExceptionParserInterface Exception parser used to parse exception responses |
||||
*/ |
||||
protected $exceptionParser; |
||||
|
||||
public function __construct(ExceptionParserInterface $exceptionParser, BackoffStrategyInterface $next = null) |
||||
{ |
||||
$this->exceptionParser = $exceptionParser; |
||||
if ($next) { |
||||
$this->setNext($next); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function makesDecision() |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
protected function getDelay( |
||||
$retries, |
||||
RequestInterface $request, |
||||
Response $response = null, |
||||
HttpException $e = null |
||||
) { |
||||
if ($response && $response->isClientError()) { |
||||
$parts = $this->exceptionParser->parse($request, $response); |
||||
return isset(self::$throttlingExceptions[$parts['code']]) ? true : null; |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,93 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Client; |
||||
|
||||
use Guzzle\Common\Event; |
||||
use Guzzle\Http\EntityBody; |
||||
use Guzzle\Service\Command\AbstractCommand as Command; |
||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface; |
||||
|
||||
/** |
||||
* Prepares the body parameter of a command such that the parameter is more flexible (e.g. accepts file handles) with |
||||
* the value it accepts but converts it to the correct format for the command. Also looks for a "Filename" parameter. |
||||
*/ |
||||
class UploadBodyListener implements EventSubscriberInterface |
||||
{ |
||||
/** |
||||
* @var array The names of the commands of which to modify the body parameter |
||||
*/ |
||||
protected $commands; |
||||
|
||||
/** |
||||
* @var string The key for the upload body parameter |
||||
*/ |
||||
protected $bodyParameter; |
||||
|
||||
/** |
||||
* @var string The key for the source file parameter |
||||
*/ |
||||
protected $sourceParameter; |
||||
|
||||
/** |
||||
* @param array $commands The commands to modify |
||||
* @param string $bodyParameter The key for the body parameter |
||||
* @param string $sourceParameter The key for the source file parameter |
||||
*/ |
||||
public function __construct(array $commands, $bodyParameter = 'Body', $sourceParameter = 'SourceFile') |
||||
{ |
||||
$this->commands = $commands; |
||||
$this->bodyParameter = (string) $bodyParameter; |
||||
$this->sourceParameter = (string) $sourceParameter; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public static function getSubscribedEvents() |
||||
{ |
||||
return array('command.before_prepare' => array('onCommandBeforePrepare')); |
||||
} |
||||
|
||||
/** |
||||
* Converts filenames and file handles into EntityBody objects before the command is validated |
||||
* |
||||
* @param Event $event Event emitted |
||||
*/ |
||||
public function onCommandBeforePrepare(Event $event) |
||||
{ |
||||
/** @var $command Command */ |
||||
$command = $event['command']; |
||||
if (in_array($command->getName(), $this->commands)) { |
||||
// Get the interesting parameters |
||||
$source = $command->get($this->sourceParameter); |
||||
$body = $command->get($this->bodyParameter); |
||||
|
||||
// If a file path is passed in then get the file handle |
||||
if (is_string($source) && file_exists($source)) { |
||||
$body = fopen($source, 'r'); |
||||
} |
||||
|
||||
if (null !== $body) { |
||||
$body = EntityBody::factory($body); |
||||
} |
||||
|
||||
// Prepare the body parameter and remove the source file parameter |
||||
$command->remove($this->sourceParameter); |
||||
$command->set($this->bodyParameter, $body); |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,61 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Client; |
||||
|
||||
use Guzzle\Common\Event; |
||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface; |
||||
|
||||
/** |
||||
* Listener used to append strings to the User-Agent header of a request based |
||||
* on the `ua.append` option. `ua.append` can contain a string or array of values. |
||||
*/ |
||||
class UserAgentListener implements EventSubscriberInterface |
||||
{ |
||||
/** |
||||
* @var string Option used to store User-Agent modifiers |
||||
*/ |
||||
const OPTION = 'ua.append'; |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public static function getSubscribedEvents() |
||||
{ |
||||
return array('command.before_send' => 'onBeforeSend'); |
||||
} |
||||
|
||||
/** |
||||
* Adds strings to the User-Agent header using the `ua.append` parameter of a command |
||||
* |
||||
* @param Event $event Event emitted |
||||
*/ |
||||
public function onBeforeSend(Event $event) |
||||
{ |
||||
$command = $event['command']; |
||||
if ($userAgentAppends = $command->get(self::OPTION)) { |
||||
$request = $command->getRequest(); |
||||
$userAgent = (string) $request->getHeader('User-Agent'); |
||||
foreach ((array) $userAgentAppends as $append) { |
||||
$append = ' ' . $append; |
||||
if (strpos($userAgent, $append) === false) { |
||||
$userAgent .= $append; |
||||
} |
||||
} |
||||
$request->setHeader('User-Agent', $userAgent); |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,100 @@ |
||||
<?php |
||||
|
||||
namespace Aws\Common\Command; |
||||
|
||||
use Guzzle\Http\Message\RequestInterface; |
||||
use Guzzle\Service\Description\Parameter; |
||||
use Guzzle\Service\Command\CommandInterface; |
||||
use Guzzle\Service\Command\LocationVisitor\Request\AbstractRequestVisitor; |
||||
|
||||
/** |
||||
* Location visitor used to serialize AWS query parameters (e.g. EC2, SES, SNS, SQS, etc) as POST fields |
||||
*/ |
||||
class AwsQueryVisitor extends AbstractRequestVisitor |
||||
{ |
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function visit(CommandInterface $command, RequestInterface $request, Parameter $param, $value) |
||||
{ |
||||
$query = array(); |
||||
$this->customResolver($value, $param, $query, $param->getWireName()); |
||||
$request->addPostFields($query); |
||||
} |
||||
|
||||
/** |
||||
* Map nested parameters into the location_key based parameters |
||||
* |
||||
* @param array $value Value to map |
||||
* @param Parameter $param Parameter that holds information about the current key |
||||
* @param array $query Built up query string values |
||||
* @param string $prefix String to prepend to sub query values |
||||
*/ |
||||
protected function customResolver($value, Parameter $param, array &$query, $prefix = '') |
||||
{ |
||||
switch ($param->getType()) { |
||||
case 'object': |
||||
$this->resolveObject($param, $value, $prefix, $query); |
||||
break; |
||||
case 'array': |
||||
$this->resolveArray($param, $value, $prefix, $query); |
||||
break; |
||||
default: |
||||
$query[$prefix] = $param->filter($value); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Custom handling for objects |
||||
* |
||||
* @param Parameter $param Parameter for the object |
||||
* @param array $value Value that is set for this parameter |
||||
* @param string $prefix Prefix for the resulting key |
||||
* @param array $query Query string array passed by reference |
||||
*/ |
||||
protected function resolveObject(Parameter $param, array $value, $prefix, array &$query) |
||||
{ |
||||
// Maps are implemented using additional properties |
||||
$hasAdditionalProperties = ($param->getAdditionalProperties() instanceof Parameter); |
||||
$additionalPropertyCount = 0; |
||||
|
||||
foreach ($value as $name => $v) { |
||||
if ($subParam = $param->getProperty($name)) { |
||||
// if the parameter was found by name as a regular property |
||||
$key = $prefix . '.' . $subParam->getWireName(); |
||||
$this->customResolver($v, $subParam, $query, $key); |
||||
} elseif ($hasAdditionalProperties) { |
||||
// Handle map cases like &Attribute.1.Name=<name>&Attribute.1.Value=<value> |
||||
$additionalPropertyCount++; |
||||
$query["{$prefix}.{$additionalPropertyCount}.Name"] = $name; |
||||
$newPrefix = "{$prefix}.{$additionalPropertyCount}.Value"; |
||||
if (is_array($v)) { |
||||
$this->customResolver($v, $param->getAdditionalProperties(), $query, $newPrefix); |
||||
} else { |
||||
$query[$newPrefix] = $param->filter($v); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Custom handling for arrays |
||||
* |
||||
* @param Parameter $param Parameter for the object |
||||
* @param array $value Value that is set for this parameter |
||||
* @param string $prefix Prefix for the resulting key |
||||
* @param array $query Query string array passed by reference |
||||
*/ |
||||
protected function resolveArray(Parameter $param, array $value, $prefix, array &$query) |
||||
{ |
||||
$offset = $param->getData('offset') ?: 1; |
||||
foreach ($value as $index => $v) { |
||||
$index += $offset; |
||||
if (is_array($v) && $items = $param->getItems()) { |
||||
$this->customResolver($v, $items, $query, $prefix . '.' . $index); |
||||
} else { |
||||
$query[$prefix . '.' . $index] = $param->filter($v); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,47 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Command; |
||||
|
||||
use Guzzle\Service\Command\OperationCommand; |
||||
use Guzzle\Http\Curl\CurlHandle; |
||||
|
||||
/** |
||||
* Adds AWS JSON body functionality to dynamically generated HTTP requests |
||||
*/ |
||||
class JsonCommand extends OperationCommand |
||||
{ |
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
protected function build() |
||||
{ |
||||
parent::build(); |
||||
|
||||
// Ensure that the body of the request ALWAYS includes some JSON. By default, this is an empty object. |
||||
if (!$this->request->getBody()) { |
||||
$this->request->setBody('{}'); |
||||
} |
||||
|
||||
// Never send the Expect header when interacting with a JSON query service |
||||
$this->request->removeHeader('Expect'); |
||||
|
||||
// Always send JSON requests as a raw string rather than using streams to avoid issues with |
||||
// cURL error code 65: "necessary data rewind wasn't possible". |
||||
// This could be removed after PHP addresses https://bugs.php.net/bug.php?id=47204 |
||||
$this->request->getCurlOptions()->set(CurlHandle::BODY_AS_STRING, true); |
||||
} |
||||
} |
||||
@ -0,0 +1,53 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Command; |
||||
|
||||
use Guzzle\Service\Command\OperationCommand; |
||||
|
||||
/** |
||||
* Adds AWS Query service serialization |
||||
*/ |
||||
class QueryCommand extends OperationCommand |
||||
{ |
||||
/** |
||||
* @var AwsQueryVisitor |
||||
*/ |
||||
protected static $queryVisitor; |
||||
|
||||
/** |
||||
* @var XmlResponseLocationVisitor |
||||
*/ |
||||
protected static $xmlVisitor; |
||||
|
||||
/** |
||||
* Register the aws.query visitor |
||||
*/ |
||||
protected function init() |
||||
{ |
||||
// @codeCoverageIgnoreStart |
||||
if (!self::$queryVisitor) { |
||||
self::$queryVisitor = new AwsQueryVisitor(); |
||||
} |
||||
if (!self::$xmlVisitor) { |
||||
self::$xmlVisitor = new XmlResponseLocationVisitor(); |
||||
} |
||||
// @codeCoverageIgnoreEnd |
||||
|
||||
$this->getRequestSerializer()->addVisitor('aws.query', self::$queryVisitor); |
||||
$this->getResponseParser()->addVisitor('xml', self::$xmlVisitor); |
||||
} |
||||
} |
||||
@ -0,0 +1,74 @@ |
||||
<?php |
||||
|
||||
namespace Aws\Common\Command; |
||||
|
||||
use Guzzle\Service\Description\Operation; |
||||
use Guzzle\Service\Command\CommandInterface; |
||||
use Guzzle\Http\Message\Response; |
||||
use Guzzle\Service\Description\Parameter; |
||||
use Guzzle\Service\Command\LocationVisitor\Response\XmlVisitor; |
||||
|
||||
/** |
||||
* Class used for custom AWS XML response parsing of query services |
||||
*/ |
||||
class XmlResponseLocationVisitor extends XmlVisitor |
||||
{ |
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function before(CommandInterface $command, array &$result) |
||||
{ |
||||
parent::before($command, $result); |
||||
|
||||
// Unwrapped wrapped responses |
||||
$operation = $command->getOperation(); |
||||
if ($operation->getServiceDescription()->getData('resultWrapped')) { |
||||
$wrappingNode = $operation->getName() . 'Result'; |
||||
if (isset($result[$wrappingNode])) { |
||||
$result = $result[$wrappingNode] + $result; |
||||
unset($result[$wrappingNode]); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Accounts for wrapper nodes |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function visit( |
||||
CommandInterface $command, |
||||
Response $response, |
||||
Parameter $param, |
||||
&$value, |
||||
$context = null |
||||
) { |
||||
parent::visit($command, $response, $param, $value, $context); |
||||
|
||||
// Account for wrapper nodes (e.g. RDS, ElastiCache, etc) |
||||
if ($param->getData('wrapper')) { |
||||
$wireName = $param->getWireName(); |
||||
$value += $value[$wireName]; |
||||
unset($value[$wireName]); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Filter used when converting XML maps into associative arrays in service descriptions |
||||
* |
||||
* @param array $value Value to filter |
||||
* @param string $entryName Name of each entry |
||||
* @param string $keyName Name of each key |
||||
* @param string $valueName Name of each value |
||||
* |
||||
* @return array Returns the map of the XML data |
||||
*/ |
||||
public static function xmlMap($value, $entryName, $keyName, $valueName) |
||||
{ |
||||
$result = array(); |
||||
foreach ($value as $entry) { |
||||
$result[$entry[$keyName]] = $entry[$valueName]; |
||||
} |
||||
|
||||
return $result; |
||||
} |
||||
} |
||||
@ -0,0 +1,136 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Credentials; |
||||
|
||||
/** |
||||
* Abstract credentials decorator |
||||
*/ |
||||
class AbstractCredentialsDecorator implements CredentialsInterface |
||||
{ |
||||
/** |
||||
* @var CredentialsInterface Wrapped credentials object |
||||
*/ |
||||
protected $credentials; |
||||
|
||||
/** |
||||
* Constructs a new BasicAWSCredentials object, with the specified AWS |
||||
* access key and AWS secret key |
||||
* |
||||
* @param CredentialsInterface $credentials |
||||
*/ |
||||
public function __construct(CredentialsInterface $credentials) |
||||
{ |
||||
$this->credentials = $credentials; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function serialize() |
||||
{ |
||||
return $this->credentials->serialize(); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function unserialize($serialized) |
||||
{ |
||||
$this->credentials = new Credentials('', ''); |
||||
$this->credentials->unserialize($serialized); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getAccessKeyId() |
||||
{ |
||||
return $this->credentials->getAccessKeyId(); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getSecretKey() |
||||
{ |
||||
return $this->credentials->getSecretKey(); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getSecurityToken() |
||||
{ |
||||
return $this->credentials->getSecurityToken(); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getExpiration() |
||||
{ |
||||
return $this->credentials->getExpiration(); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function isExpired() |
||||
{ |
||||
return $this->credentials->isExpired(); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function setAccessKeyId($key) |
||||
{ |
||||
$this->credentials->setAccessKeyId($key); |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function setSecretKey($secret) |
||||
{ |
||||
$this->credentials->setSecretKey($secret); |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function setSecurityToken($token) |
||||
{ |
||||
$this->credentials->setSecurityToken($token); |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function setExpiration($timestamp) |
||||
{ |
||||
$this->credentials->setExpiration($timestamp); |
||||
|
||||
return $this; |
||||
} |
||||
} |
||||
@ -0,0 +1,76 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Credentials; |
||||
|
||||
/** |
||||
* Abstract decorator to provide a foundation for refreshable credentials |
||||
*/ |
||||
abstract class AbstractRefreshableCredentials extends AbstractCredentialsDecorator |
||||
{ |
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getAccessKeyId() |
||||
{ |
||||
if ($this->credentials->isExpired()) { |
||||
$this->refresh(); |
||||
} |
||||
|
||||
return $this->credentials->getAccessKeyId(); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getSecretKey() |
||||
{ |
||||
if ($this->credentials->isExpired()) { |
||||
$this->refresh(); |
||||
} |
||||
|
||||
return $this->credentials->getSecretKey(); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getSecurityToken() |
||||
{ |
||||
if ($this->credentials->isExpired()) { |
||||
$this->refresh(); |
||||
} |
||||
|
||||
return $this->credentials->getSecurityToken(); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function serialize() |
||||
{ |
||||
if ($this->credentials->isExpired()) { |
||||
$this->refresh(); |
||||
} |
||||
|
||||
return $this->credentials->serialize(); |
||||
} |
||||
|
||||
/** |
||||
* Attempt to get new credentials |
||||
*/ |
||||
abstract protected function refresh(); |
||||
} |
||||
@ -0,0 +1,73 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Credentials; |
||||
|
||||
use Guzzle\Cache\CacheAdapterInterface; |
||||
|
||||
/** |
||||
* Credentials decorator used to implement caching credentials |
||||
*/ |
||||
class CacheableCredentials extends AbstractRefreshableCredentials |
||||
{ |
||||
/** |
||||
* @var CacheAdapterInterface Cache adapter used to store credentials |
||||
*/ |
||||
protected $cache; |
||||
|
||||
/** |
||||
* @var string Cache key used to store the credentials |
||||
*/ |
||||
protected $cacheKey; |
||||
|
||||
/** |
||||
* CacheableCredentials is a decorator that decorates other credentials |
||||
* |
||||
* @param CredentialsInterface $credentials Credentials to adapt |
||||
* @param CacheAdapterInterface $cache Cache to use to store credentials |
||||
* @param string $cacheKey Cache key of the credentials |
||||
*/ |
||||
public function __construct(CredentialsInterface $credentials, CacheAdapterInterface $cache, $cacheKey) |
||||
{ |
||||
$this->credentials = $credentials; |
||||
$this->cache = $cache; |
||||
$this->cacheKey = $cacheKey; |
||||
} |
||||
|
||||
/** |
||||
* Attempt to get new credentials from cache or from the adapted object |
||||
*/ |
||||
protected function refresh() |
||||
{ |
||||
if (!$cache = $this->cache->fetch($this->cacheKey)) { |
||||
// The credentials were not found, so try again and cache if new |
||||
$this->credentials->getAccessKeyId(); |
||||
if (!$this->credentials->isExpired()) { |
||||
// The credentials were updated, so cache them |
||||
$this->cache->save($this->cacheKey, $this->credentials, $this->credentials->getExpiration() - time()); |
||||
} |
||||
} else { |
||||
// The credentials were found in cache, so update the adapter object |
||||
// if the cached credentials are not expired |
||||
if (!$cache->isExpired()) { |
||||
$this->credentials->setAccessKeyId($cache->getAccessKeyId()); |
||||
$this->credentials->setSecretKey($cache->getSecretKey()); |
||||
$this->credentials->setSecurityToken($cache->getSecurityToken()); |
||||
$this->credentials->setExpiration($cache->getExpiration()); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,276 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Credentials; |
||||
|
||||
use Aws\Common\Enum\ClientOptions as Options; |
||||
use Aws\Common\Exception\InvalidArgumentException; |
||||
use Aws\Common\Exception\RequiredExtensionNotLoadedException; |
||||
use Aws\Common\Exception\RuntimeException; |
||||
use Guzzle\Http\ClientInterface; |
||||
use Guzzle\Common\FromConfigInterface; |
||||
use Guzzle\Cache\CacheAdapterInterface; |
||||
use Guzzle\Cache\DoctrineCacheAdapter; |
||||
|
||||
/** |
||||
* Basic implementation of the AWSCredentials interface that allows callers to |
||||
* pass in the AWS access key and secret access in the constructor. |
||||
*/ |
||||
class Credentials implements CredentialsInterface, FromConfigInterface |
||||
{ |
||||
const ENV_KEY = 'AWS_ACCESS_KEY_ID'; |
||||
const ENV_SECRET = 'AWS_SECRET_KEY'; |
||||
|
||||
/** |
||||
* @var string AWS Access key ID |
||||
*/ |
||||
protected $key; |
||||
|
||||
/** |
||||
* @var string AWS Secret access key |
||||
*/ |
||||
protected $secret; |
||||
|
||||
/** |
||||
* @var string Security token |
||||
*/ |
||||
protected $token; |
||||
|
||||
/** |
||||
* @var int Time to die of token |
||||
*/ |
||||
protected $ttd; |
||||
|
||||
/** |
||||
* Get the available keys for the factory method |
||||
* |
||||
* @return array |
||||
*/ |
||||
public static function getConfigDefaults() |
||||
{ |
||||
return array( |
||||
Options::KEY => null, |
||||
Options::SECRET => null, |
||||
Options::TOKEN => null, |
||||
Options::TOKEN_TTD => null, |
||||
Options::CREDENTIALS_CACHE => null, |
||||
Options::CREDENTIALS_CACHE_KEY => null, |
||||
Options::CREDENTIALS_CLIENT => null |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* Factory method for creating new credentials. This factory method will |
||||
* create the appropriate credentials object with appropriate decorators |
||||
* based on the passed configuration options. |
||||
* |
||||
* @param array $config Options to use when instantiating the credentials |
||||
* |
||||
* @return CredentialsInterface |
||||
* @throws InvalidArgumentException If the caching options are invalid |
||||
* @throws RuntimeException If using the default cache and APC is disabled |
||||
*/ |
||||
public static function factory($config = array()) |
||||
{ |
||||
// Add default key values |
||||
foreach (self::getConfigDefaults() as $key => $value) { |
||||
if (!isset($config[$key])) { |
||||
$config[$key] = $value; |
||||
} |
||||
} |
||||
|
||||
// Start tracking the cache key |
||||
$cacheKey = $config[Options::CREDENTIALS_CACHE_KEY]; |
||||
|
||||
// Create the credentials object |
||||
if (!$config[Options::KEY] || !$config[Options::SECRET]) { |
||||
// No keys were provided, so attempt to retrieve some from the environment |
||||
$envKey = isset($_SERVER[self::ENV_KEY]) ? $_SERVER[self::ENV_KEY] : getenv(self::ENV_KEY); |
||||
$envSecret = isset($_SERVER[self::ENV_SECRET]) ? $_SERVER[self::ENV_SECRET] : getenv(self::ENV_SECRET); |
||||
if ($envKey && $envSecret) { |
||||
// Use credentials set in the environment variables |
||||
$credentials = new static($envKey, $envSecret); |
||||
} else { |
||||
// Use instance profile credentials (available on EC2 instances) |
||||
$credentials = new RefreshableInstanceProfileCredentials( |
||||
new static('', '', '', 1), |
||||
$config[Options::CREDENTIALS_CLIENT] |
||||
); |
||||
} |
||||
// If no cache key was set, use the crc32 hostname of the server |
||||
$cacheKey = $cacheKey ?: 'credentials_' . crc32(gethostname()); |
||||
} else { |
||||
// Instantiate using short or long term credentials |
||||
$credentials = new static( |
||||
$config[Options::KEY], |
||||
$config[Options::SECRET], |
||||
$config[Options::TOKEN], |
||||
$config[Options::TOKEN_TTD] |
||||
); |
||||
// If no cache key was set, use the access key ID |
||||
$cacheKey = $cacheKey ?: 'credentials_' . $config[Options::KEY]; |
||||
} |
||||
|
||||
// Check if the credentials are refreshable, and if so, configure caching |
||||
$cache = $config[Options::CREDENTIALS_CACHE]; |
||||
if ($cacheKey && $cache) { |
||||
if ($cache === 'true' || $cache === true) { |
||||
// If no cache adapter was provided, then create one for the user |
||||
// @codeCoverageIgnoreStart |
||||
if (!extension_loaded('apc')) { |
||||
throw new RequiredExtensionNotLoadedException('PHP has not been compiled with APC. Unable to cache ' |
||||
. 'the credentials.'); |
||||
} elseif (!class_exists('Doctrine\Common\Cache\ApcCache')) { |
||||
throw new RuntimeException( |
||||
'Cannot set ' . Options::CREDENTIALS_CACHE . ' to true because the Doctrine cache component is ' |
||||
. 'not installed. Either install doctrine/cache or pass in an instantiated ' |
||||
. 'Guzzle\Cache\CacheAdapterInterface object' |
||||
); |
||||
} |
||||
// @codeCoverageIgnoreEnd |
||||
$cache = new DoctrineCacheAdapter(new \Doctrine\Common\Cache\ApcCache()); |
||||
} elseif (!($cache instanceof CacheAdapterInterface)) { |
||||
throw new InvalidArgumentException('Unable to utilize caching with the specified options'); |
||||
} |
||||
// Decorate the credentials with a cache |
||||
$credentials = new CacheableCredentials($credentials, $cache, $cacheKey); |
||||
} |
||||
|
||||
return $credentials; |
||||
} |
||||
|
||||
/** |
||||
* Constructs a new BasicAWSCredentials object, with the specified AWS |
||||
* access key and AWS secret key |
||||
* |
||||
* @param string $accessKeyId AWS access key ID |
||||
* @param string $secretAccessKey AWS secret access key |
||||
* @param string $token Security token to use |
||||
* @param int $expiration UNIX timestamp for when credentials expire |
||||
*/ |
||||
public function __construct($accessKeyId, $secretAccessKey, $token = null, $expiration = null) |
||||
{ |
||||
$this->key = trim($accessKeyId); |
||||
$this->secret = trim($secretAccessKey); |
||||
$this->token = $token; |
||||
$this->ttd = $expiration; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function serialize() |
||||
{ |
||||
return json_encode(array( |
||||
Options::KEY => $this->key, |
||||
Options::SECRET => $this->secret, |
||||
Options::TOKEN => $this->token, |
||||
Options::TOKEN_TTD => $this->ttd |
||||
)); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function unserialize($serialized) |
||||
{ |
||||
$data = json_decode($serialized, true); |
||||
$this->key = $data[Options::KEY]; |
||||
$this->secret = $data[Options::SECRET]; |
||||
$this->token = $data[Options::TOKEN]; |
||||
$this->ttd = $data[Options::TOKEN_TTD]; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getAccessKeyId() |
||||
{ |
||||
return $this->key; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getSecretKey() |
||||
{ |
||||
return $this->secret; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getSecurityToken() |
||||
{ |
||||
return $this->token; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getExpiration() |
||||
{ |
||||
return $this->ttd; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function isExpired() |
||||
{ |
||||
return $this->ttd !== null && time() >= $this->ttd; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function setAccessKeyId($key) |
||||
{ |
||||
$this->key = $key; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function setSecretKey($secret) |
||||
{ |
||||
$this->secret = $secret; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function setSecurityToken($token) |
||||
{ |
||||
$this->token = $token; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function setExpiration($timestamp) |
||||
{ |
||||
$this->ttd = $timestamp; |
||||
|
||||
return $this; |
||||
} |
||||
} |
||||
@ -0,0 +1,96 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Credentials; |
||||
|
||||
/** |
||||
* Provides access to the AWS credentials used for accessing AWS services: AWS |
||||
* access key ID, secret access key, and security token. These credentials are |
||||
* used to securely sign requests to AWS services. |
||||
*/ |
||||
interface CredentialsInterface extends \Serializable |
||||
{ |
||||
/** |
||||
* Returns the AWS access key ID for this credentials object. |
||||
* |
||||
* @return string |
||||
*/ |
||||
public function getAccessKeyId(); |
||||
|
||||
/** |
||||
* Returns the AWS secret access key for this credentials object. |
||||
* |
||||
* @return string |
||||
*/ |
||||
public function getSecretKey(); |
||||
|
||||
/** |
||||
* Get the associated security token if available |
||||
* |
||||
* @return string|null |
||||
*/ |
||||
public function getSecurityToken(); |
||||
|
||||
/** |
||||
* Get the UNIX timestamp in which the credentials will expire |
||||
* |
||||
* @return int|null |
||||
*/ |
||||
public function getExpiration(); |
||||
|
||||
/** |
||||
* Set the AWS access key ID for this credentials object. |
||||
* |
||||
* @param string $key AWS access key ID |
||||
* |
||||
* @return self |
||||
*/ |
||||
public function setAccessKeyId($key); |
||||
|
||||
/** |
||||
* Set the AWS secret access key for this credentials object. |
||||
* |
||||
* @param string $secret AWS secret access key |
||||
* |
||||
* @return CredentialsInterface |
||||
*/ |
||||
public function setSecretKey($secret); |
||||
|
||||
/** |
||||
* Set the security token to use with this credentials object |
||||
* |
||||
* @param string $token Security token |
||||
* |
||||
* @return self |
||||
*/ |
||||
public function setSecurityToken($token); |
||||
|
||||
/** |
||||
* Set the UNIX timestamp in which the credentials will expire |
||||
* |
||||
* @param int $timestamp UNIX timestamp expiration |
||||
* |
||||
* @return self |
||||
*/ |
||||
public function setExpiration($timestamp); |
||||
|
||||
/** |
||||
* Check if the credentials are expired |
||||
* |
||||
* @return bool |
||||
*/ |
||||
public function isExpired(); |
||||
} |
||||
@ -0,0 +1,59 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Credentials; |
||||
|
||||
use Aws\Common\InstanceMetadata\InstanceMetadataClient; |
||||
use Aws\Common\Exception\InstanceProfileCredentialsException; |
||||
|
||||
/** |
||||
* Credentials decorator used to implement retrieving credentials from the |
||||
* EC2 metadata server |
||||
*/ |
||||
class RefreshableInstanceProfileCredentials extends AbstractRefreshableCredentials |
||||
{ |
||||
/** |
||||
* @var InstanceMetadataClient |
||||
*/ |
||||
protected $client; |
||||
|
||||
/** |
||||
* Constructs a new instance profile credentials decorator |
||||
* |
||||
* @param CredentialsInterface $credentials Credentials to adapt |
||||
* @param InstanceMetadataClient $client Client used to get new credentials |
||||
*/ |
||||
public function __construct(CredentialsInterface $credentials, InstanceMetadataClient $client = null) |
||||
{ |
||||
$this->credentials = $credentials; |
||||
$this->client = $client ?: InstanceMetadataClient::factory(); |
||||
} |
||||
|
||||
/** |
||||
* Attempt to get new credentials from the instance profile |
||||
* |
||||
* @throws InstanceProfileCredentialsException On error |
||||
*/ |
||||
protected function refresh() |
||||
{ |
||||
$credentials = $this->client->getInstanceProfileCredentials(); |
||||
// Expire the token 1 minute before it actually expires to pre-fetch before expiring |
||||
$this->credentials->setAccessKeyId($credentials->getAccessKeyId()) |
||||
->setSecretKey($credentials->getSecretKey()) |
||||
->setSecurityToken($credentials->getSecurityToken()) |
||||
->setExpiration($credentials->getExpiration()); |
||||
} |
||||
} |
||||
@ -0,0 +1,55 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common; |
||||
|
||||
/** |
||||
* Represents an enumerable set of values |
||||
*/ |
||||
abstract class Enum |
||||
{ |
||||
/** |
||||
* @var array A cache of all enum values to increase performance |
||||
*/ |
||||
protected static $cache = array(); |
||||
|
||||
/** |
||||
* Returns the names (or keys) of all of constants in the enum |
||||
* |
||||
* @return array |
||||
*/ |
||||
public static function keys() |
||||
{ |
||||
return array_keys(static::values()); |
||||
} |
||||
|
||||
/** |
||||
* Return the names and values of all the constants in the enum |
||||
* |
||||
* @return array |
||||
*/ |
||||
public static function values() |
||||
{ |
||||
$class = get_called_class(); |
||||
|
||||
if (!isset(self::$cache[$class])) { |
||||
$reflected = new \ReflectionClass($class); |
||||
self::$cache[$class] = $reflected->getConstants(); |
||||
} |
||||
|
||||
return self::$cache[$class]; |
||||
} |
||||
} |
||||
@ -0,0 +1,146 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Enum; |
||||
|
||||
use Aws\Common\Enum; |
||||
|
||||
/** |
||||
* Contains enumerable default factory options that can be passed to a client's factory method |
||||
*/ |
||||
class ClientOptions extends Enum |
||||
{ |
||||
/** |
||||
* @var string AWS Access Key ID |
||||
*/ |
||||
const KEY = 'key'; |
||||
|
||||
/** |
||||
* @var string AWS secret access key |
||||
*/ |
||||
const SECRET = 'secret'; |
||||
|
||||
/** |
||||
* @var string You can optionally provide a custom `Aws\Common\Credentials\CredentialsInterface` object |
||||
*/ |
||||
const CREDENTIALS = 'credentials'; |
||||
|
||||
/** |
||||
* @var string Custom AWS security token to use with request authentication |
||||
*/ |
||||
const TOKEN = 'token'; |
||||
|
||||
/** |
||||
* @var string UNIX timestamp for when the custom credentials expire |
||||
*/ |
||||
const TOKEN_TTD = 'token.ttd'; |
||||
|
||||
/** |
||||
* @var string Used to cache credentials when using providers that require HTTP requests. Set the trueto use the |
||||
* default APC cache or provide a `Guzzle\Cache\CacheAdapterInterface` object. |
||||
*/ |
||||
const CREDENTIALS_CACHE = 'credentials.cache'; |
||||
|
||||
/** |
||||
* @var string Optional custom cache key to use with the credentials |
||||
*/ |
||||
const CREDENTIALS_CACHE_KEY = 'credentials.cache.key'; |
||||
|
||||
/** |
||||
* @var string Pass this option to specify a custom `Guzzle\Http\ClientInterface` to use if your credentials require |
||||
* a HTTP request (e.g. RefreshableInstanceProfileCredentials) |
||||
*/ |
||||
const CREDENTIALS_CLIENT = 'credentials.client'; |
||||
|
||||
/** |
||||
* @var string Region name (e.g. 'us-east-1', 'us-west-1', 'us-west-2', 'eu-west-1', etc...) |
||||
*/ |
||||
const REGION = 'region'; |
||||
|
||||
/** |
||||
* @var string URI Scheme of the base URL (e.g. 'https', 'http'). |
||||
*/ |
||||
const SCHEME = 'scheme'; |
||||
|
||||
/** |
||||
* @var string Specify the name of the service |
||||
*/ |
||||
const SERVICE = 'service'; |
||||
|
||||
/** |
||||
* @var string Instead of using a `region` and `scheme`, you can specify a custom base URL for the client |
||||
*/ |
||||
const BASE_URL = 'base_url'; |
||||
|
||||
/** |
||||
* @var string You can optionally provide a custom signature implementation used to sign requests |
||||
*/ |
||||
const SIGNATURE = 'signature'; |
||||
|
||||
/** |
||||
* @var string Set to explicitly override the service name used in signatures |
||||
*/ |
||||
const SIGNATURE_SERVICE = 'signature.service'; |
||||
|
||||
/** |
||||
* @var string Set to explicitly override the region name used in signatures |
||||
*/ |
||||
const SIGNATURE_REGION = 'signature.region'; |
||||
|
||||
/** |
||||
* @var string Option key holding an exponential backoff plugin |
||||
*/ |
||||
const BACKOFF = 'client.backoff'; |
||||
|
||||
/** |
||||
* @var string `Guzzle\Log\LogAdapterInterface` object used to log backoff retries. Use 'debug' to emit PHP |
||||
* warnings when a retry is issued. |
||||
*/ |
||||
const BACKOFF_LOGGER = 'client.backoff.logger'; |
||||
|
||||
/** |
||||
* @var string Optional template to use for exponential backoff log messages. See |
||||
* `Guzzle\Plugin\Backoff\BackoffLogger` for formatting information. |
||||
*/ |
||||
const BACKOFF_LOGGER_TEMPLATE = 'client.backoff.logger.template'; |
||||
|
||||
/** |
||||
* @var string Set to true to use the bundled CA cert or pass the full path to an SSL certificate bundle. This |
||||
* option should be modified when you encounter curl error code 60. Set to "system" to use the cacert |
||||
* bundle on your system. |
||||
*/ |
||||
const SSL_CERT = 'ssl.certificate_authority'; |
||||
|
||||
/** |
||||
* @var string Service description to use with the client |
||||
*/ |
||||
const SERVICE_DESCRIPTION = 'service.description'; |
||||
|
||||
/** |
||||
* @var string Whether or not modeled responses have transformations applied to them |
||||
*/ |
||||
const MODEL_PROCESSING = 'command.model_processing'; |
||||
|
||||
/** |
||||
* @var bool Set to false to disable validation |
||||
*/ |
||||
const VALIDATION = 'validation'; |
||||
|
||||
/** |
||||
* @var string API version used by the client |
||||
*/ |
||||
const VERSION = 'version'; |
||||
} |
||||
@ -0,0 +1,31 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Enum; |
||||
|
||||
use Aws\Common\Enum; |
||||
|
||||
/** |
||||
* Contains enumerable date format values used in the SDK |
||||
*/ |
||||
class DateFormat extends Enum |
||||
{ |
||||
const ISO8601 = 'Ymd\THis\Z'; |
||||
const ISO8601_S3 = 'Y-m-d\TH:i:s\Z'; |
||||
const RFC1123 = 'D, d M Y H:i:s \G\M\T'; |
||||
const RFC2822 = \DateTime::RFC2822; |
||||
const SHORT = 'Ymd'; |
||||
} |
||||
@ -0,0 +1,57 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Enum; |
||||
|
||||
use Aws\Common\Enum; |
||||
|
||||
/** |
||||
* Contains enumerable region code values. These should be useful in most cases, |
||||
* with Amazon S3 being the most notable exception |
||||
* |
||||
* @link http://docs.amazonwebservices.com/general/latest/gr/rande.html AWS Regions and Endpoints |
||||
*/ |
||||
class Region extends Enum |
||||
{ |
||||
const US_EAST_1 = 'us-east-1'; |
||||
const VIRGINIA = 'us-east-1'; |
||||
const NORTHERN_VIRGINIA = 'us-east-1'; |
||||
|
||||
const US_WEST_1 = 'us-west-1'; |
||||
const CALIFORNIA = 'us-west-1'; |
||||
const NORTHERN_CALIFORNIA = 'us-west-1'; |
||||
|
||||
const US_WEST_2 = 'us-west-2'; |
||||
const OREGON = 'us-west-2'; |
||||
|
||||
const EU_WEST_1 = 'eu-west-1'; |
||||
const IRELAND = 'eu-west-1'; |
||||
|
||||
const AP_SOUTHEAST_1 = 'ap-southeast-1'; |
||||
const SINGAPORE = 'ap-southeast-1'; |
||||
|
||||
const AP_SOUTHEAST_2 = 'ap-southeast-2'; |
||||
const SYDNEY = 'ap-southeast-2'; |
||||
|
||||
const AP_NORTHEAST_1 = 'ap-northeast-1'; |
||||
const TOKYO = 'ap-northeast-1'; |
||||
|
||||
const SA_EAST_1 = 'sa-east-1'; |
||||
const SAO_PAULO = 'sa-east-1'; |
||||
|
||||
const US_GOV_WEST_1 = 'us-gov-west-1'; |
||||
const GOV_CLOUD_US = 'us-gov-west-1'; |
||||
} |
||||
@ -0,0 +1,53 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Enum; |
||||
|
||||
use Aws\Common\Enum; |
||||
|
||||
/** |
||||
* Contains enumerable byte-size values |
||||
*/ |
||||
class Size extends Enum |
||||
{ |
||||
const B = 1; |
||||
const BYTE = 1; |
||||
const BYTES = 1; |
||||
|
||||
const KB = 1024; |
||||
const KILOBYTE = 1024; |
||||
const KILOBYTES = 1024; |
||||
|
||||
const MB = 1048576; |
||||
const MEGABYTE = 1048576; |
||||
const MEGABYTES = 1048576; |
||||
|
||||
const GB = 1073741824; |
||||
const GIGABYTE = 1073741824; |
||||
const GIGABYTES = 1073741824; |
||||
|
||||
const TB = 1099511627776; |
||||
const TERABYTE = 1099511627776; |
||||
const TERABYTES = 1099511627776; |
||||
|
||||
const PB = 1125899906842624; |
||||
const PETABYTE = 1125899906842624; |
||||
const PETABYTES = 1125899906842624; |
||||
|
||||
const EB = 1152921504606846976; |
||||
const EXABYTE = 1152921504606846976; |
||||
const EXABYTES = 1152921504606846976; |
||||
} |
||||
@ -0,0 +1,46 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Enum; |
||||
|
||||
use Aws\Common\Enum; |
||||
|
||||
/** |
||||
* Contains enumerable time values |
||||
*/ |
||||
class Time extends Enum |
||||
{ |
||||
const SECOND = 1; |
||||
const SECONDS = 1; |
||||
|
||||
const MINUTE = 60; |
||||
const MINUTES = 60; |
||||
|
||||
const HOUR = 3600; |
||||
const HOURS = 3600; |
||||
|
||||
const DAY = 86400; |
||||
const DAYS = 86400; |
||||
|
||||
const WEEK = 604800; |
||||
const WEEKS = 604800; |
||||
|
||||
const MONTH = 2592000; |
||||
const MONTHS = 2592000; |
||||
|
||||
const YEAR = 31557600; |
||||
const YEARS = 31557600; |
||||
} |
||||
@ -0,0 +1,55 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Enum; |
||||
|
||||
use Aws\Common\Enum; |
||||
|
||||
/** |
||||
* User-Agent header strings for various high level operations |
||||
*/ |
||||
class UaString extends Enum |
||||
{ |
||||
/** |
||||
* @var string Name of the option used to add to the UA string |
||||
*/ |
||||
const OPTION = 'ua.append'; |
||||
|
||||
/** |
||||
* @var string Resource iterator |
||||
*/ |
||||
const ITERATOR = 'ITR'; |
||||
|
||||
/** |
||||
* @var string Resource waiter |
||||
*/ |
||||
const WAITER = 'WTR'; |
||||
|
||||
/** |
||||
* @var string Session handlers (e.g. Amazon DynamoDB session handler) |
||||
*/ |
||||
const SESSION = 'SES'; |
||||
|
||||
/** |
||||
* @var string Multipart upload helper for Amazon S3 |
||||
*/ |
||||
const MULTIPART_UPLOAD = 'MUP'; |
||||
|
||||
/** |
||||
* @var string Command executed during a batch transfer |
||||
*/ |
||||
const BATCH = 'BAT'; |
||||
} |
||||
@ -0,0 +1,30 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception; |
||||
|
||||
/** |
||||
* "Marker Interface" implemented by every exception in the AWS SDK |
||||
*/ |
||||
interface AwsExceptionInterface |
||||
{ |
||||
public function getCode(); |
||||
public function getLine(); |
||||
public function getFile(); |
||||
public function getMessage(); |
||||
public function getPrevious(); |
||||
public function getTrace(); |
||||
} |
||||
@ -0,0 +1,22 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception; |
||||
|
||||
/** |
||||
* AWS SDK namespaced version of the SPL BadMethodCallException. |
||||
*/ |
||||
class BadMethodCallException extends \BadMethodCallException implements AwsExceptionInterface {} |
||||
@ -0,0 +1,22 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception; |
||||
|
||||
/** |
||||
* AWS SDK namespaced version of the SPL DomainException. |
||||
*/ |
||||
class DomainException extends \DomainException implements AwsExceptionInterface {} |
||||
@ -0,0 +1,36 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception; |
||||
|
||||
use Guzzle\Http\Message\RequestInterface; |
||||
use Guzzle\Http\Message\Response; |
||||
|
||||
/** |
||||
* Interface used to create AWS exception |
||||
*/ |
||||
interface ExceptionFactoryInterface |
||||
{ |
||||
/** |
||||
* Returns an AWS service specific exception |
||||
* |
||||
* @param RequestInterface $request Unsuccessful request |
||||
* @param Response $response Unsuccessful response that was encountered |
||||
* |
||||
* @return \Exception|AwsExceptionInterface |
||||
*/ |
||||
public function fromResponse(RequestInterface $request, Response $response); |
||||
} |
||||
@ -0,0 +1,59 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception; |
||||
|
||||
use Guzzle\Common\Event; |
||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface; |
||||
|
||||
/** |
||||
* Converts generic Guzzle response exceptions into AWS specific exceptions |
||||
*/ |
||||
class ExceptionListener implements EventSubscriberInterface |
||||
{ |
||||
/** |
||||
* @var ExceptionFactoryInterface Factory used to create new exceptions |
||||
*/ |
||||
protected $factory; |
||||
|
||||
/** |
||||
* @param ExceptionFactoryInterface $factory Factory used to create exceptions |
||||
*/ |
||||
public function __construct(ExceptionFactoryInterface $factory) |
||||
{ |
||||
$this->factory = $factory; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public static function getSubscribedEvents() |
||||
{ |
||||
return array('request.error' => array('onRequestError', -1)); |
||||
} |
||||
|
||||
/** |
||||
* Throws a more meaningful request exception if available |
||||
* |
||||
* @param Event $event Event emitted |
||||
*/ |
||||
public function onRequestError(Event $event) |
||||
{ |
||||
$e = $this->factory->fromResponse($event['request'], $event['response']); |
||||
$event->stopPropagation(); |
||||
throw $e; |
||||
} |
||||
} |
||||
@ -0,0 +1,50 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception; |
||||
|
||||
use Aws\Common\Exception\RuntimeException; |
||||
|
||||
/** |
||||
* Exception thrown when an error occurs with instance profile credentials |
||||
*/ |
||||
class InstanceProfileCredentialsException extends RuntimeException |
||||
{ |
||||
/** |
||||
* @var string |
||||
*/ |
||||
protected $statusCode; |
||||
|
||||
/** |
||||
* Set the error response code received from the instance metadata |
||||
* |
||||
* @param string $code Response code |
||||
*/ |
||||
public function setStatusCode($code) |
||||
{ |
||||
$this->statusCode = $code; |
||||
} |
||||
|
||||
/** |
||||
* Get the error response code from the service |
||||
* |
||||
* @return string|null |
||||
*/ |
||||
public function getStatusCode() |
||||
{ |
||||
return $this->statusCode; |
||||
} |
||||
} |
||||
@ -0,0 +1,22 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception; |
||||
|
||||
/** |
||||
* AWS SDK namespaced version of the SPL InvalidArgumentException. |
||||
*/ |
||||
class InvalidArgumentException extends \InvalidArgumentException implements AwsExceptionInterface {} |
||||
@ -0,0 +1,22 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception; |
||||
|
||||
/** |
||||
* AWS SDK namespaced version of the SPL LogicException. |
||||
*/ |
||||
class LogicException extends \LogicException implements AwsExceptionInterface {} |
||||
@ -0,0 +1,55 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception; |
||||
|
||||
use Aws\Common\Model\MultipartUpload\TransferStateInterface; |
||||
|
||||
/** |
||||
* Thrown when a {@see Aws\Common\MultipartUpload\TransferInterface} object encounters an error during transfer |
||||
*/ |
||||
class MultipartUploadException extends RuntimeException |
||||
{ |
||||
/** |
||||
* @var TransferStateInterface State of the transfer when the error was encountered |
||||
*/ |
||||
protected $state; |
||||
|
||||
/** |
||||
* @param TransferStateInterface $state Transfer state |
||||
* @param \Exception $exception Last encountered exception |
||||
*/ |
||||
public function __construct(TransferStateInterface $state, \Exception $exception = null) |
||||
{ |
||||
parent::__construct( |
||||
'An error was encountered while performing a multipart upload: ' . $exception->getMessage(), |
||||
0, |
||||
$exception |
||||
); |
||||
|
||||
$this->state = $state; |
||||
} |
||||
|
||||
/** |
||||
* Get the state of the transfer |
||||
* |
||||
* @return TransferStateInterface |
||||
*/ |
||||
public function getState() |
||||
{ |
||||
return $this->state; |
||||
} |
||||
} |
||||
@ -0,0 +1,103 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception; |
||||
|
||||
use Aws\Common\Exception\Parser\ExceptionParserInterface; |
||||
use Guzzle\Http\Message\RequestInterface; |
||||
use Guzzle\Http\Message\Response; |
||||
|
||||
/** |
||||
* Attempts to create exceptions by inferring the name from the code and a base |
||||
* namespace that contains exceptions. Exception classes are expected to be in |
||||
* upper camelCase and always end in 'Exception'. 'Exception' will be appended |
||||
* if it is not present in the exception code. |
||||
*/ |
||||
class NamespaceExceptionFactory implements ExceptionFactoryInterface |
||||
{ |
||||
/** |
||||
* @var ExceptionParserInterface $parser Parser used to parse responses |
||||
*/ |
||||
protected $parser; |
||||
|
||||
/** |
||||
* @var string Base namespace containing exception classes |
||||
*/ |
||||
protected $baseNamespace; |
||||
|
||||
/** |
||||
* @var string Default class to instantiate if a match is not found |
||||
*/ |
||||
protected $defaultException; |
||||
|
||||
/** |
||||
* @param ExceptionParserInterface $parser Parser used to parse exceptions |
||||
* @param string $baseNamespace Namespace containing exceptions |
||||
* @param string $defaultException Default class to use if one is not mapped |
||||
*/ |
||||
public function __construct( |
||||
ExceptionParserInterface $parser, |
||||
$baseNamespace, |
||||
$defaultException = 'Aws\Common\Exception\ServiceResponseException' |
||||
) { |
||||
$this->parser = $parser; |
||||
$this->baseNamespace = $baseNamespace; |
||||
$this->defaultException = $defaultException; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function fromResponse(RequestInterface $request, Response $response) |
||||
{ |
||||
$parts = $this->parser->parse($request, $response); |
||||
|
||||
// Removing leading 'AWS.' and embedded periods |
||||
$className = $this->baseNamespace . '\\' . str_replace(array('AWS.', '.'), '', $parts['code']); |
||||
if (substr($className, -9) !== 'Exception') { |
||||
$className .= 'Exception'; |
||||
} |
||||
|
||||
$className = class_exists($className) ? $className : $this->defaultException; |
||||
|
||||
return $this->createException($className, $request, $response, $parts); |
||||
} |
||||
|
||||
/** |
||||
* Create an prepare an exception object |
||||
* |
||||
* @param string $className Name of the class to create |
||||
* @param RequestInterface $request Request |
||||
* @param Response $response Response received |
||||
* @param array $parts Parsed exception data |
||||
* |
||||
* @return \Exception |
||||
*/ |
||||
protected function createException($className, RequestInterface $request, Response $response, array $parts) |
||||
{ |
||||
$class = new $className($parts['message']); |
||||
|
||||
if ($class instanceof ServiceResponseException) { |
||||
$class->setExceptionCode($parts['code']); |
||||
$class->setExceptionType($parts['type']); |
||||
$class->setResponse($response); |
||||
$class->setRequest($request); |
||||
$class->setRequestId($parts['request_id']); |
||||
} |
||||
|
||||
return $class; |
||||
} |
||||
} |
||||
@ -0,0 +1,22 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception; |
||||
|
||||
/** |
||||
* AWS SDK namespaced version of the SPL OverflowException. |
||||
*/ |
||||
class OutOfBoundsException extends \OutOfBoundsException implements AwsExceptionInterface {} |
||||
@ -0,0 +1,22 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception; |
||||
|
||||
/** |
||||
* AWS SDK namespaced version of the SPL OverflowException. |
||||
*/ |
||||
class OverflowException extends \OverflowException implements AwsExceptionInterface {} |
||||
@ -0,0 +1,66 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception\Parser; |
||||
|
||||
use Guzzle\Http\Message\RequestInterface; |
||||
use Guzzle\Http\Message\Response; |
||||
|
||||
/** |
||||
* Parses JSON encoded exception responses |
||||
*/ |
||||
abstract class AbstractJsonExceptionParser implements ExceptionParserInterface |
||||
{ |
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function parse(RequestInterface $request, Response $response) |
||||
{ |
||||
// Build array of default error data |
||||
$data = array( |
||||
'code' => null, |
||||
'message' => null, |
||||
'type' => $response->isClientError() ? 'client' : 'server', |
||||
'request_id' => (string) $response->getHeader('x-amzn-RequestId'), |
||||
'parsed' => null |
||||
); |
||||
|
||||
// Parse the json and normalize key casings |
||||
if (null !== $json = json_decode($response->getBody(true), true)) { |
||||
$data['parsed'] = array_change_key_case($json); |
||||
} |
||||
|
||||
// Do additional, protocol-specific parsing and return the result |
||||
$data = $this->doParse($data, $response); |
||||
|
||||
// Remove "Fault" suffix from exception names |
||||
if (isset($data['code']) && strpos($data['code'], 'Fault')) { |
||||
$data['code'] = preg_replace('/^([a-zA-Z]+)Fault$/', '$1', $data['code']); |
||||
} |
||||
|
||||
return $data; |
||||
} |
||||
|
||||
/** |
||||
* Pull relevant exception data out of the parsed json |
||||
* |
||||
* @param array $data The exception data |
||||
* @param Response $response The response from the service containing the error |
||||
* |
||||
* @return array |
||||
*/ |
||||
abstract protected function doParse(array $data, Response $response); |
||||
} |
||||
@ -0,0 +1,100 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception\Parser; |
||||
|
||||
use Guzzle\Http\Message\RequestInterface; |
||||
use Guzzle\Http\Message\Response; |
||||
|
||||
/** |
||||
* Parses default XML exception responses |
||||
*/ |
||||
class DefaultXmlExceptionParser implements ExceptionParserInterface |
||||
{ |
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function parse(RequestInterface $request, Response $response) |
||||
{ |
||||
$data = array( |
||||
'code' => null, |
||||
'message' => null, |
||||
'type' => $response->isClientError() ? 'client' : 'server', |
||||
'request_id' => null, |
||||
'parsed' => null |
||||
); |
||||
|
||||
if ($body = $response->getBody(true)) { |
||||
$this->parseBody(new \SimpleXMLElement($body), $data); |
||||
} else { |
||||
$this->parseHeaders($request, $response, $data); |
||||
} |
||||
|
||||
return $data; |
||||
} |
||||
|
||||
/** |
||||
* Parses additional exception information from the response headers |
||||
* |
||||
* @param RequestInterface $request Request that was issued |
||||
* @param Response $response The response from the request |
||||
* @param array $data The current set of exception data |
||||
*/ |
||||
protected function parseHeaders(RequestInterface $request, Response $response, array &$data) |
||||
{ |
||||
$data['message'] = $response->getStatusCode() . ' ' . $response->getReasonPhrase(); |
||||
if ($requestId = $response->getHeader('x-amz-request-id')) { |
||||
$data['request_id'] = $requestId; |
||||
$data['message'] .= " (Request-ID: $requestId)"; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Parses additional exception information from the response body |
||||
* |
||||
* @param \SimpleXMLElement $body The response body as XML |
||||
* @param array $data The current set of exception data |
||||
*/ |
||||
protected function parseBody(\SimpleXMLElement $body, array &$data) |
||||
{ |
||||
$data['parsed'] = $body; |
||||
|
||||
$namespaces = $body->getDocNamespaces(); |
||||
if (isset($namespaces[''])) { |
||||
// Account for the default namespace being defined and PHP not being able to handle it :( |
||||
$body->registerXPathNamespace('ns', $namespaces['']); |
||||
$prefix = 'ns:'; |
||||
} else { |
||||
$prefix = ''; |
||||
} |
||||
|
||||
if ($tempXml = $body->xpath("//{$prefix}Code[1]")) { |
||||
$data['code'] = (string) $tempXml[0]; |
||||
} |
||||
|
||||
if ($tempXml = $body->xpath("//{$prefix}Message[1]")) { |
||||
$data['message'] = (string) $tempXml[0]; |
||||
} |
||||
|
||||
$tempXml = $body->xpath("//{$prefix}RequestId[1]"); |
||||
if (empty($tempXml)) { |
||||
$tempXml = $body->xpath("//{$prefix}RequestID[1]"); |
||||
} |
||||
if (isset($tempXml[0])) { |
||||
$data['request_id'] = (string) $tempXml[0]; |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,42 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception\Parser; |
||||
|
||||
use Guzzle\Http\Message\RequestInterface; |
||||
use Guzzle\Http\Message\Response; |
||||
|
||||
/** |
||||
* Interface used to parse exceptions into an associative array of data |
||||
*/ |
||||
interface ExceptionParserInterface |
||||
{ |
||||
/** |
||||
* Parses an exception into an array of data containing at minimum the |
||||
* following array keys: |
||||
* - type: Exception type |
||||
* - code: Exception code |
||||
* - message: Exception message |
||||
* - request_id: Request ID |
||||
* - parsed: The parsed representation of the data (array, SimpleXMLElement, etc) |
||||
* |
||||
* @param RequestInterface $request |
||||
* @param Response $response Unsuccessful response |
||||
* |
||||
* @return array |
||||
*/ |
||||
public function parse(RequestInterface $request, Response $response); |
||||
} |
||||
@ -0,0 +1,39 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception\Parser; |
||||
|
||||
use Guzzle\Http\Message\Response; |
||||
|
||||
/** |
||||
* Parses JSON encoded exception responses from query services |
||||
*/ |
||||
class JsonQueryExceptionParser extends AbstractJsonExceptionParser |
||||
{ |
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
protected function doParse(array $data, Response $response) |
||||
{ |
||||
if ($json = $data['parsed']) { |
||||
$parts = explode('#', $json['__type']); |
||||
$data['code'] = isset($parts[1]) ? $parts[1] : $parts[0]; |
||||
$data['message'] = isset($json['message']) ? $json['message'] : null; |
||||
} |
||||
|
||||
return $data; |
||||
} |
||||
} |
||||
@ -0,0 +1,48 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception\Parser; |
||||
|
||||
use Guzzle\Http\Message\Response; |
||||
|
||||
/** |
||||
* Parses JSON encoded exception responses from REST services |
||||
*/ |
||||
class JsonRestExceptionParser extends AbstractJsonExceptionParser |
||||
{ |
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
protected function doParse(array $data, Response $response) |
||||
{ |
||||
// Merge in error data from the JSON body |
||||
if ($json = $data['parsed']) { |
||||
$data = array_replace($data, $json); |
||||
} |
||||
|
||||
// Correct error type from services like Amazon Glacier |
||||
if (!empty($data['type'])) { |
||||
$data['type'] = strtolower($data['type']); |
||||
} |
||||
|
||||
// Retrieve the error code from services like Amazon Elastic Transcoder |
||||
if ($code = (string) $response->getHeader('x-amzn-ErrorType')) { |
||||
$data['code'] = substr($code, 0, strpos($code, ':')); |
||||
} |
||||
|
||||
return $data; |
||||
} |
||||
} |
||||
@ -0,0 +1,22 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception; |
||||
|
||||
/** |
||||
* Thrown when a particular PHP extension is required to execute the guarded logic, but the extension is not loaded |
||||
*/ |
||||
class RequiredExtensionNotLoadedException extends RuntimeException {} |
||||
@ -0,0 +1,22 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception; |
||||
|
||||
/** |
||||
* AWS SDK namespaced version of the SPL RuntimeException. |
||||
*/ |
||||
class RuntimeException extends \RuntimeException implements AwsExceptionInterface {} |
||||
@ -0,0 +1,183 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception; |
||||
|
||||
use Guzzle\Http\Message\RequestInterface; |
||||
use Guzzle\Http\Message\Response; |
||||
|
||||
/** |
||||
* Default AWS exception |
||||
*/ |
||||
class ServiceResponseException extends RuntimeException |
||||
{ |
||||
/** |
||||
* @var Response Response |
||||
*/ |
||||
protected $response; |
||||
|
||||
/** |
||||
* @var RequestInterface Request |
||||
*/ |
||||
protected $request; |
||||
|
||||
/** |
||||
* @var string Request ID |
||||
*/ |
||||
protected $requestId; |
||||
|
||||
/** |
||||
* @var string Exception type (client / server) |
||||
*/ |
||||
protected $exceptionType; |
||||
|
||||
/** |
||||
* @var string Exception code |
||||
*/ |
||||
protected $exceptionCode; |
||||
|
||||
/** |
||||
* Set the exception code |
||||
* |
||||
* @param string $code Exception code |
||||
*/ |
||||
public function setExceptionCode($code) |
||||
{ |
||||
$this->exceptionCode = $code; |
||||
} |
||||
|
||||
/** |
||||
* Get the exception code |
||||
* |
||||
* @return string|null |
||||
*/ |
||||
public function getExceptionCode() |
||||
{ |
||||
return $this->exceptionCode; |
||||
} |
||||
|
||||
/** |
||||
* Set the exception type |
||||
* |
||||
* @param string $type Exception type |
||||
*/ |
||||
public function setExceptionType($type) |
||||
{ |
||||
$this->exceptionType = $type; |
||||
} |
||||
|
||||
/** |
||||
* Get the exception type (one of client or server) |
||||
* |
||||
* @return string|null |
||||
*/ |
||||
public function getExceptionType() |
||||
{ |
||||
return $this->exceptionType; |
||||
} |
||||
|
||||
/** |
||||
* Set the request ID |
||||
* |
||||
* @param string $id Request ID |
||||
*/ |
||||
public function setRequestId($id) |
||||
{ |
||||
$this->requestId = $id; |
||||
} |
||||
|
||||
/** |
||||
* Get the Request ID |
||||
* |
||||
* @return string|null |
||||
*/ |
||||
public function getRequestId() |
||||
{ |
||||
return $this->requestId; |
||||
} |
||||
|
||||
/** |
||||
* Set the associated response |
||||
* |
||||
* @param Response $response Response |
||||
*/ |
||||
public function setResponse(Response $response) |
||||
{ |
||||
$this->response = $response; |
||||
} |
||||
|
||||
/** |
||||
* Get the associated response object |
||||
* |
||||
* @return Response|null |
||||
*/ |
||||
public function getResponse() |
||||
{ |
||||
return $this->response; |
||||
} |
||||
|
||||
/** |
||||
* Set the associated request |
||||
* |
||||
* @param RequestInterface $request |
||||
*/ |
||||
public function setRequest(RequestInterface $request) |
||||
{ |
||||
$this->request = $request; |
||||
} |
||||
|
||||
/** |
||||
* Get the associated request object |
||||
* |
||||
* @return RequestInterface|null |
||||
*/ |
||||
public function getRequest() |
||||
{ |
||||
return $this->request; |
||||
} |
||||
|
||||
/** |
||||
* Get the status code of the response |
||||
* |
||||
* @return int|null |
||||
*/ |
||||
public function getStatusCode() |
||||
{ |
||||
return $this->response ? $this->response->getStatusCode() : null; |
||||
} |
||||
|
||||
/** |
||||
* Cast to a string |
||||
* |
||||
* @return string |
||||
*/ |
||||
public function __toString() |
||||
{ |
||||
$message = get_class($this) . ': ' |
||||
. 'AWS Error Code: ' . $this->getExceptionCode() . ', ' |
||||
. 'Status Code: ' . $this->getStatusCode() . ', ' |
||||
. 'AWS Request ID: ' . $this->getRequestId() . ', ' |
||||
. 'AWS Error Type: ' . $this->getExceptionType() . ', ' |
||||
. 'AWS Error Message: ' . $this->getMessage(); |
||||
|
||||
// Add the User-Agent if available |
||||
if ($this->request) { |
||||
$message .= ', ' . 'User-Agent: ' . $this->request->getHeader('User-Agent'); |
||||
} |
||||
|
||||
return $message; |
||||
} |
||||
} |
||||
@ -0,0 +1,22 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Exception; |
||||
|
||||
/** |
||||
* AWS SDK namespaced version of the SPL UnexpectedValueException. |
||||
*/ |
||||
class UnexpectedValueException extends \UnexpectedValueException implements AwsExceptionInterface {} |
||||
@ -0,0 +1,67 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Facade; |
||||
|
||||
use Aws\Common\Aws; |
||||
|
||||
/** |
||||
* Base facade class that handles the delegation logic |
||||
*/ |
||||
abstract class Facade implements FacadeInterface |
||||
{ |
||||
/** @var Aws */ |
||||
protected static $serviceBuilder; |
||||
|
||||
/** |
||||
* Mounts the facades by extracting information from the service builder config and using creating class aliases |
||||
* |
||||
* @param string|null $targetNamespace Namespace that the facades should be mounted to. Defaults to global namespace |
||||
* |
||||
* @param Aws $serviceBuilder |
||||
*/ |
||||
public static function mountFacades(Aws $serviceBuilder, $targetNamespace = null) |
||||
{ |
||||
self::$serviceBuilder = $serviceBuilder; |
||||
require_once __DIR__ . '/facade-classes.php'; |
||||
foreach ($serviceBuilder->getConfig() as $service) { |
||||
if (isset($service['alias'], $service['class'])) { |
||||
$facadeClass = __NAMESPACE__ . '\\' . $service['alias']; |
||||
$facadeAlias = ltrim($targetNamespace . '\\' . $service['alias'], '\\'); |
||||
if (!class_exists($facadeAlias)) { |
||||
// @codeCoverageIgnoreStart |
||||
class_alias($facadeClass, $facadeAlias); |
||||
// @codeCoverageIgnoreEnd |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Returns the instance of the client that the facade operates on |
||||
* |
||||
* @return \Aws\Common\Client\AwsClientInterface |
||||
*/ |
||||
public static function getClient() |
||||
{ |
||||
return self::$serviceBuilder->get(static::getServiceBuilderKey()); |
||||
} |
||||
|
||||
public static function __callStatic($method, $args) |
||||
{ |
||||
return call_user_func_array(array(self::getClient(), $method), $args); |
||||
} |
||||
} |
||||
@ -0,0 +1,32 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Facade; |
||||
|
||||
/** |
||||
* Interface that defines a client facade. Facades are convenient static classes that allow you to run client methods |
||||
* statically on a default instance from the service builder. The facades themselves are aliased into the global |
||||
* namespace for ease of use. |
||||
*/ |
||||
interface FacadeInterface |
||||
{ |
||||
/** |
||||
* Returns the key used to access the client instance from the Service Builder |
||||
* |
||||
* @return string |
||||
*/ |
||||
public static function getServiceBuilderKey(); |
||||
} |
||||
@ -0,0 +1,267 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Facade; |
||||
|
||||
/** |
||||
* The following classes are used to implement the static client facades and are aliased into the global namespaced. We |
||||
* discourage the use of these classes directly by their full namespace since they are not autoloaded and are considered |
||||
* an implementation detail that could possibly be changed in the future. |
||||
*/ |
||||
|
||||
// @codeCoverageIgnoreStart |
||||
|
||||
class AutoScaling extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'autoscaling'; |
||||
} |
||||
} |
||||
|
||||
class CloudFormation extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'cloudformation'; |
||||
} |
||||
} |
||||
|
||||
class CloudFront extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'cloudfront'; |
||||
} |
||||
} |
||||
|
||||
class CloudSearch extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'cloudsearch'; |
||||
} |
||||
} |
||||
|
||||
class CloudWatch extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'cloudwatch'; |
||||
} |
||||
} |
||||
|
||||
class DataPipeline extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'datapipeline'; |
||||
} |
||||
} |
||||
|
||||
class DirectConnect extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'directconnect'; |
||||
} |
||||
} |
||||
|
||||
class DynamoDb extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'dynamodb'; |
||||
} |
||||
} |
||||
|
||||
class Ec2 extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'ec2'; |
||||
} |
||||
} |
||||
|
||||
class ElastiCache extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'elasticache'; |
||||
} |
||||
} |
||||
|
||||
class ElasticBeanstalk extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'elasticbeanstalk'; |
||||
} |
||||
} |
||||
|
||||
class ElasticLoadBalancing extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'elasticloadbalancing'; |
||||
} |
||||
} |
||||
|
||||
class ElasticTranscoder extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'elastictranscoder'; |
||||
} |
||||
} |
||||
|
||||
class Emr extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'emr'; |
||||
} |
||||
} |
||||
|
||||
class Glacier extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'glacier'; |
||||
} |
||||
} |
||||
|
||||
class Iam extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'iam'; |
||||
} |
||||
} |
||||
|
||||
class ImportExport extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'importexport'; |
||||
} |
||||
} |
||||
|
||||
class OpsWorks extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'opsworks'; |
||||
} |
||||
} |
||||
|
||||
class Rds extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'rds'; |
||||
} |
||||
} |
||||
|
||||
class Redshift extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'redshift'; |
||||
} |
||||
} |
||||
|
||||
class Route53 extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'route53'; |
||||
} |
||||
} |
||||
|
||||
class S3 extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 's3'; |
||||
} |
||||
} |
||||
|
||||
class SimpleDb extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'sdb'; |
||||
} |
||||
} |
||||
|
||||
class Ses extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'ses'; |
||||
} |
||||
} |
||||
|
||||
class Sns extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'sns'; |
||||
} |
||||
} |
||||
|
||||
class Sqs extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'sqs'; |
||||
} |
||||
} |
||||
|
||||
class StorageGateway extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'storagegateway'; |
||||
} |
||||
} |
||||
|
||||
class Sts extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'sts'; |
||||
} |
||||
} |
||||
|
||||
class Support extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'support'; |
||||
} |
||||
} |
||||
|
||||
class Swf extends Facade |
||||
{ |
||||
public static function getServiceBuilderKey() |
||||
{ |
||||
return 'swf'; |
||||
} |
||||
} |
||||
|
||||
// @codeCoverageIgnoreEnd |
||||
@ -0,0 +1,87 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Hash; |
||||
|
||||
use Aws\Common\Exception\LogicException; |
||||
|
||||
/** |
||||
* Encapsulates the creation of a hash from streamed chunks of data |
||||
*/ |
||||
class ChunkHash implements ChunkHashInterface |
||||
{ |
||||
/** |
||||
* @var resource The hash context as created by `hash_init()` |
||||
*/ |
||||
protected $context; |
||||
|
||||
/** |
||||
* @var string The resulting hash in hex form |
||||
*/ |
||||
protected $hash; |
||||
|
||||
/** |
||||
* @var string The resulting hash in binary form |
||||
*/ |
||||
protected $hashRaw; |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function __construct($algorithm = self::DEFAULT_ALGORITHM) |
||||
{ |
||||
HashUtils::validateAlgorithm($algorithm); |
||||
$this->context = hash_init($algorithm); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function addData($data) |
||||
{ |
||||
if (!$this->context) { |
||||
throw new LogicException('You may not add more data to a finalized chunk hash.'); |
||||
} |
||||
|
||||
hash_update($this->context, $data); |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getHash($returnBinaryForm = false) |
||||
{ |
||||
if (!$this->hash) { |
||||
$this->hashRaw = hash_final($this->context, true); |
||||
$this->hash = HashUtils::binToHex($this->hashRaw); |
||||
$this->context = null; |
||||
} |
||||
|
||||
return $returnBinaryForm ? $this->hashRaw : $this->hash; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function __clone() |
||||
{ |
||||
if ($this->context) { |
||||
$this->context = hash_copy($this->context); |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,52 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Hash; |
||||
|
||||
/** |
||||
* Interface for objects that encapsulate the creation of a hash from streamed chunks of data |
||||
*/ |
||||
interface ChunkHashInterface |
||||
{ |
||||
const DEFAULT_ALGORITHM = 'sha256'; |
||||
|
||||
/** |
||||
* Constructs the chunk hash and sets the algorithm to use for hashing |
||||
* |
||||
* @param string $algorithm A valid hash algorithm name as returned by `hash_algos()` |
||||
* |
||||
* @return self |
||||
*/ |
||||
public function __construct($algorithm = 'sha256'); |
||||
|
||||
/** |
||||
* Add a chunk of data to be hashed |
||||
* |
||||
* @param string $data Data to be hashed |
||||
* |
||||
* @return self |
||||
*/ |
||||
public function addData($data); |
||||
|
||||
/** |
||||
* Return the results of the hash |
||||
* |
||||
* @param bool $returnBinaryForm If true, returns the hash in binary form instead of hex form |
||||
* |
||||
* @return string |
||||
*/ |
||||
public function getHash($returnBinaryForm = false); |
||||
} |
||||
@ -0,0 +1,72 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Hash; |
||||
|
||||
use Aws\Common\Exception\InvalidArgumentException; |
||||
|
||||
/** |
||||
* Contains hashing utilities |
||||
*/ |
||||
class HashUtils |
||||
{ |
||||
/** |
||||
* Converts a hash in hex form to binary form |
||||
* |
||||
* @param string $hash Hash in hex form |
||||
* |
||||
* @return string Hash in binary form |
||||
*/ |
||||
public static function hexToBin($hash) |
||||
{ |
||||
// If using PHP 5.4, there is a native function to convert from hex to binary |
||||
static $useNative; |
||||
if ($useNative === null) { |
||||
$useNative = function_exists('hex2bin'); |
||||
} |
||||
|
||||
return $useNative ? hex2bin($hash) : pack("H*", $hash); |
||||
} |
||||
|
||||
/** |
||||
* Converts a hash in binary form to hex form |
||||
* |
||||
* @param string $hash Hash in binary form |
||||
* |
||||
* @return string Hash in hex form |
||||
*/ |
||||
public static function binToHex($hash) |
||||
{ |
||||
return bin2hex($hash); |
||||
} |
||||
|
||||
/** |
||||
* Checks if the algorithm specified exists and throws an exception if it does not |
||||
* |
||||
* @param string $algorithm Name of the algorithm to validate |
||||
* |
||||
* @return bool |
||||
* @throws InvalidArgumentException if the algorithm doesn't exist |
||||
*/ |
||||
public static function validateAlgorithm($algorithm) |
||||
{ |
||||
if (!in_array($algorithm, hash_algos(), true)) { |
||||
throw new InvalidArgumentException("The hashing algorithm specified ({$algorithm}) does not exist."); |
||||
} |
||||
|
||||
return true; |
||||
} |
||||
} |
||||
@ -0,0 +1,195 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Hash; |
||||
|
||||
use Aws\Common\Enum\Size; |
||||
use Aws\Common\Exception\InvalidArgumentException; |
||||
use Aws\Common\Exception\LogicException; |
||||
use Guzzle\Http\EntityBody; |
||||
|
||||
/** |
||||
* Encapsulates the creation of a tree hash from streamed chunks of data |
||||
*/ |
||||
class TreeHash implements ChunkHashInterface |
||||
{ |
||||
/** |
||||
* @var string The algorithm used for hashing |
||||
*/ |
||||
protected $algorithm; |
||||
|
||||
/** |
||||
* @var array Set of binary checksums from which the tree hash is derived |
||||
*/ |
||||
protected $checksums = array(); |
||||
|
||||
/** |
||||
* @var string The resulting hash in hex form |
||||
*/ |
||||
protected $hash; |
||||
|
||||
/** |
||||
* @var string The resulting hash in binary form |
||||
*/ |
||||
protected $hashRaw; |
||||
|
||||
/** |
||||
* Create a tree hash from an array of existing tree hash checksums |
||||
* |
||||
* @param array $checksums Set of checksums |
||||
* @param bool $inBinaryForm Whether or not the checksums are already in binary form |
||||
* @param string $algorithm A valid hash algorithm name as returned by `hash_algos()` |
||||
* |
||||
* @return TreeHash |
||||
*/ |
||||
public static function fromChecksums(array $checksums, $inBinaryForm = false, $algorithm = self::DEFAULT_ALGORITHM) |
||||
{ |
||||
$treeHash = new self($algorithm); |
||||
|
||||
// Convert checksums to binary form if provided in hex form and add them to the tree hash |
||||
$treeHash->checksums = $inBinaryForm ? $checksums : array_map('Aws\Common\Hash\HashUtils::hexToBin', $checksums); |
||||
|
||||
// Pre-calculate hash |
||||
$treeHash->getHash(); |
||||
|
||||
return $treeHash; |
||||
} |
||||
|
||||
/** |
||||
* Create a tree hash from a content body |
||||
* |
||||
* @param string|resource|EntityBody $content Content to create a tree hash for |
||||
* @param string $algorithm A valid hash algorithm name as returned by `hash_algos()` |
||||
* |
||||
* @return TreeHash |
||||
*/ |
||||
public static function fromContent($content, $algorithm = self::DEFAULT_ALGORITHM) |
||||
{ |
||||
$treeHash = new self($algorithm); |
||||
|
||||
// Read the data in 1MB chunks and add to tree hash |
||||
$content = EntityBody::factory($content); |
||||
while ($data = $content->read(Size::MB)) { |
||||
$treeHash->addData($data); |
||||
} |
||||
|
||||
// Pre-calculate hash |
||||
$treeHash->getHash(); |
||||
|
||||
return $treeHash; |
||||
} |
||||
|
||||
/** |
||||
* Validates an entity body with a tree hash checksum |
||||
* |
||||
* @param string|resource|EntityBody $content Content to create a tree hash for |
||||
* @param string $checksum The checksum to use for validation |
||||
* @param string $algorithm A valid hash algorithm name as returned by `hash_algos()` |
||||
* |
||||
* @return bool |
||||
*/ |
||||
public static function validateChecksum($content, $checksum, $algorithm = self::DEFAULT_ALGORITHM) |
||||
{ |
||||
$treeHash = self::fromContent($content, $algorithm); |
||||
|
||||
return ($checksum === $treeHash->getHash()); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function __construct($algorithm = self::DEFAULT_ALGORITHM) |
||||
{ |
||||
HashUtils::validateAlgorithm($algorithm); |
||||
$this->algorithm = $algorithm; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
* @throws LogicException if the root tree hash is already calculated |
||||
* @throws InvalidArgumentException if the data is larger than 1MB |
||||
*/ |
||||
public function addData($data) |
||||
{ |
||||
// Error if hash is already calculated |
||||
if ($this->hash) { |
||||
throw new LogicException('You may not add more data to a finalized tree hash.'); |
||||
} |
||||
|
||||
// Make sure that only 1MB chunks or smaller get passed in |
||||
if (strlen($data) > Size::MB) { |
||||
throw new InvalidArgumentException('The chunk of data added is too large for tree hashing.'); |
||||
} |
||||
|
||||
// Store the raw hash of this data segment |
||||
$this->checksums[] = hash($this->algorithm, $data, true); |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* Add a checksum to the tree hash directly |
||||
* |
||||
* @param string $checksum The checksum to add |
||||
* @param bool $inBinaryForm Whether or not the checksum is already in binary form |
||||
* |
||||
* @return self |
||||
* @throws LogicException if the root tree hash is already calculated |
||||
*/ |
||||
public function addChecksum($checksum, $inBinaryForm = false) |
||||
{ |
||||
// Error if hash is already calculated |
||||
if ($this->hash) { |
||||
throw new LogicException('You may not add more checksums to a finalized tree hash.'); |
||||
} |
||||
|
||||
// Convert the checksum to binary form if necessary |
||||
$this->checksums[] = $inBinaryForm ? $checksum : HashUtils::hexToBin($checksum); |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getHash($returnBinaryForm = false) |
||||
{ |
||||
if (!$this->hash) { |
||||
// Perform hashes up the tree to arrive at the root checksum of the tree hash |
||||
$hashes = $this->checksums; |
||||
while (count($hashes) > 1) { |
||||
$sets = array_chunk($hashes, 2); |
||||
$hashes = array(); |
||||
foreach ($sets as $set) { |
||||
$hashes[] = (count($set) === 1) ? $set[0] : hash($this->algorithm, $set[0] . $set[1], true); |
||||
} |
||||
} |
||||
|
||||
$this->hashRaw = $hashes[0]; |
||||
$this->hash = HashUtils::binToHex($this->hashRaw); |
||||
} |
||||
|
||||
return $returnBinaryForm ? $this->hashRaw : $this->hash; |
||||
} |
||||
|
||||
/** |
||||
* @return array Array of raw checksums composing the tree hash |
||||
*/ |
||||
public function getChecksums() |
||||
{ |
||||
return $this->checksums; |
||||
} |
||||
} |
||||
@ -0,0 +1,85 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common; |
||||
|
||||
use Guzzle\Http\Url; |
||||
|
||||
/** |
||||
* Utility class for parsing regions and services from URLs |
||||
*/ |
||||
class HostNameUtils |
||||
{ |
||||
const DEFAULT_REGION = 'us-east-1'; |
||||
const DEFAULT_GOV_REGION = 'us-gov-west-1'; |
||||
|
||||
/** |
||||
* Parse the AWS region name from a URL |
||||
* |
||||
* |
||||
* @param Url $url HTTP URL |
||||
* |
||||
* @return string |
||||
* @link http://docs.amazonwebservices.com/general/latest/gr/rande.html |
||||
*/ |
||||
public static function parseRegionName(Url $url) |
||||
{ |
||||
// If we don't recognize the domain, just return the default |
||||
if (substr($url->getHost(), -14) != '.amazonaws.com') { |
||||
return self::DEFAULT_REGION; |
||||
} |
||||
|
||||
$serviceAndRegion = substr($url->getHost(), 0, -14); |
||||
// Special handling for S3 regions |
||||
$separator = strpos($serviceAndRegion, 's3') === 0 ? '-' : '.'; |
||||
$separatorPos = strpos($serviceAndRegion, $separator); |
||||
|
||||
// If don't detect a separator, then return the default region |
||||
if ($separatorPos === false) { |
||||
return self::DEFAULT_REGION; |
||||
} |
||||
|
||||
$region = substr($serviceAndRegion, $separatorPos + 1); |
||||
|
||||
// All GOV regions currently use the default GOV region |
||||
if ($region == 'us-gov') { |
||||
return self::DEFAULT_GOV_REGION; |
||||
} |
||||
|
||||
return $region; |
||||
} |
||||
|
||||
/** |
||||
* Parse the AWS service name from a URL |
||||
* |
||||
* @param Url $url HTTP URL |
||||
* |
||||
* @return string Returns a service name (or empty string) |
||||
* @link http://docs.amazonwebservices.com/general/latest/gr/rande.html |
||||
*/ |
||||
public static function parseServiceName(Url $url) |
||||
{ |
||||
// The service name is the first part of the host |
||||
$parts = explode('.', $url->getHost(), 2); |
||||
|
||||
// Special handling for S3 |
||||
if (stripos($parts[0], 's3') === 0) { |
||||
return 's3'; |
||||
} |
||||
|
||||
return $parts[0]; |
||||
} |
||||
} |
||||
@ -0,0 +1,99 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\InstanceMetadata; |
||||
|
||||
use Aws\Common\Enum\ClientOptions as Options; |
||||
use Aws\Common\Exception\InstanceProfileCredentialsException; |
||||
use Aws\Common\Credentials\Credentials; |
||||
use Aws\Common\Client\AbstractClient; |
||||
use Guzzle\Common\Collection; |
||||
use Guzzle\Http\Message\RequestFactory; |
||||
|
||||
/** |
||||
* Client used for interacting with the Amazon EC2 instance metadata server |
||||
*/ |
||||
class InstanceMetadataClient extends AbstractClient |
||||
{ |
||||
/** |
||||
* Factory method to create a new InstanceMetadataClient using an array |
||||
* of configuration options. |
||||
* |
||||
* The configuration options accepts the following array keys and values: |
||||
* - base_url: Override the base URL of the instance metadata server |
||||
* - version: Version of the metadata server to interact with |
||||
* |
||||
* @param array|Collection $config Configuration options |
||||
* |
||||
* @return InstanceMetadataClient |
||||
*/ |
||||
public static function factory($config = array()) |
||||
{ |
||||
$config = Collection::fromConfig($config, array( |
||||
Options::BASE_URL => 'http://169.254.169.254/{version}/', |
||||
'version' => 'latest', |
||||
), array('base_url', 'version')); |
||||
|
||||
return new self($config); |
||||
} |
||||
|
||||
/** |
||||
* Constructor override |
||||
*/ |
||||
public function __construct(Collection $config) |
||||
{ |
||||
$this->setConfig($config); |
||||
$this->setBaseUrl($config->get(Options::BASE_URL)); |
||||
$this->defaultHeaders = new Collection(); |
||||
$this->setRequestFactory(RequestFactory::getInstance()); |
||||
} |
||||
|
||||
/** |
||||
* Get instance profile credentials |
||||
* |
||||
* @return Credentials |
||||
* @throws InstanceProfileCredentialsException |
||||
*/ |
||||
public function getInstanceProfileCredentials() |
||||
{ |
||||
try { |
||||
$request = $this->get('meta-data/iam/security-credentials/'); |
||||
$request->getCurlOptions()->set(CURLOPT_TIMEOUT, 1)->set(CURLOPT_CONNECTTIMEOUT, 1); |
||||
$credentials = trim($request->send()->getBody(true)); |
||||
$result = $this->get("meta-data/iam/security-credentials/{$credentials}")->send()->json(); |
||||
} catch (\Exception $e) { |
||||
$message = 'Error retrieving credentials from the instance profile metadata server. When you are not' |
||||
. ' running inside of Amazon EC2, you must provide your AWS access key ID and secret access key in' |
||||
. ' the "key" and "secret" options when creating a client or provide an instantiated' |
||||
. ' Aws\\Common\\Credentials\\CredentialsInterface object.'; |
||||
throw new InstanceProfileCredentialsException($message, $e->getCode(), $e); |
||||
} |
||||
|
||||
// Ensure that the status code was successful |
||||
if ($result['Code'] !== 'Success') { |
||||
$e = new InstanceProfileCredentialsException('Unexpected response code: ' . $result['Code']); |
||||
$e->setStatusCode($result['Code']); |
||||
throw $e; |
||||
} |
||||
|
||||
return new Credentials( |
||||
$result['AccessKeyId'], |
||||
$result['SecretAccessKey'], |
||||
$result['Token'], |
||||
strtotime($result['Expiration']) |
||||
); |
||||
} |
||||
} |
||||
@ -0,0 +1,50 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\InstanceMetadata\Waiter; |
||||
|
||||
use Aws\Common\Waiter\AbstractResourceWaiter; |
||||
use Guzzle\Http\Exception\CurlException; |
||||
|
||||
/** |
||||
* Waits until the instance metadata service is responding. Will send up to |
||||
* 4 requests with a 5 second delay between each try. Each try can last up to |
||||
* 11 seconds to complete if the service is not responding. |
||||
* |
||||
* @codeCoverageIgnore |
||||
*/ |
||||
class ServiceAvailable extends AbstractResourceWaiter |
||||
{ |
||||
protected $interval = 5; |
||||
protected $maxAttempts = 4; |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function doWait() |
||||
{ |
||||
$request = $this->client->get(); |
||||
try { |
||||
$request->getCurlOptions()->set(CURLOPT_CONNECTTIMEOUT, 10) |
||||
->set(CURLOPT_TIMEOUT, 10); |
||||
$request->send(); |
||||
|
||||
return true; |
||||
} catch (CurlException $e) { |
||||
return false; |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,149 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Iterator; |
||||
|
||||
use Aws\Common\Enum\UaString as Ua; |
||||
use Aws\Common\Exception\RuntimeException; |
||||
Use Guzzle\Service\Resource\Model; |
||||
use Guzzle\Service\Resource\ResourceIterator; |
||||
|
||||
/** |
||||
* Iterate over a client command |
||||
*/ |
||||
class AwsResourceIterator extends ResourceIterator |
||||
{ |
||||
/** |
||||
* @var Model Result of a command |
||||
*/ |
||||
protected $lastResult = null; |
||||
|
||||
/** |
||||
* Provides access to the most recent result obtained by the iterator. |
||||
* |
||||
* @return Model|null |
||||
*/ |
||||
public function getLastResult() |
||||
{ |
||||
return $this->lastResult; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
* This AWS specific version of the resource iterator provides a default implementation of the typical AWS iterator |
||||
* process. It relies on configuration and extension to implement the operation-specific logic of handling results |
||||
* and nextTokens. This method will loop until resources are acquired or there are no more iterations available. |
||||
*/ |
||||
protected function sendRequest() |
||||
{ |
||||
do { |
||||
// Prepare the request including setting the next token |
||||
$this->prepareRequest(); |
||||
if ($this->nextToken) { |
||||
$this->applyNextToken(); |
||||
} |
||||
|
||||
// Execute the request and handle the results |
||||
$this->command->add(Ua::OPTION, Ua::ITERATOR); |
||||
$this->lastResult = $this->command->getResult(); |
||||
$resources = $this->handleResults($this->lastResult); |
||||
$this->determineNextToken($this->lastResult); |
||||
|
||||
// If no resources collected, prepare to reiterate before yielding |
||||
if ($reiterate = empty($resources) && $this->nextToken) { |
||||
$this->command = clone $this->originalCommand; |
||||
} |
||||
} while ($reiterate); |
||||
|
||||
return $resources; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
protected function prepareRequest() |
||||
{ |
||||
// Get the limit parameter key to set |
||||
$param = $this->get('limit_param'); |
||||
if ($param && ($limit = $this->command->get($param))) { |
||||
$pageSize = $this->calculatePageSize(); |
||||
|
||||
// If the limit of the command is different than the pageSize of the iterator, use the smaller value |
||||
if ($limit && $pageSize) { |
||||
$this->command->set('limit', min($limit, $pageSize)); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
protected function handleResults(Model $result) |
||||
{ |
||||
$results = array(); |
||||
|
||||
// Get the result key that contains the results |
||||
if ($resultKey = $this->get('result_key')) { |
||||
$results = $result->getPath($resultKey) ?: array(); |
||||
} |
||||
|
||||
return $results; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
protected function applyNextToken() |
||||
{ |
||||
// Get the token parameter key to set |
||||
if ($tokenParam = $this->get('token_param')) { |
||||
// Set the next token. Works with multi-value tokens |
||||
if (is_array($tokenParam)) { |
||||
if (is_array($this->nextToken) && count($tokenParam) === count($this->nextToken)) { |
||||
foreach (array_combine($tokenParam, $this->nextToken) as $param => $token) { |
||||
$this->command->set($param, $token); |
||||
} |
||||
} else { |
||||
throw new RuntimeException('The definition of the iterator\'s token parameter and the actual token ' |
||||
. 'value are not compatible.'); |
||||
} |
||||
} else { |
||||
$this->command->set($tokenParam, $this->nextToken); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
protected function determineNextToken(Model $result) |
||||
{ |
||||
$this->nextToken = null; |
||||
|
||||
// If the value of "more key" is true or there is no "more key" to check, then try to get the next token |
||||
$moreKey = $this->get('more_key'); |
||||
if ($moreKey === null || $result->getPath($moreKey)) { |
||||
// Get the token key to check |
||||
if ($tokenKey = $this->get('token_key')) { |
||||
// Get the next token's value. Works with multi-value tokens |
||||
$getToken = function ($key) use ($result) { |
||||
return $result->getPath((string) $key); |
||||
}; |
||||
$this->nextToken = is_array($tokenKey) ? array_map($getToken, $tokenKey) : $getToken($tokenKey); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,101 @@ |
||||
<?php |
||||
|
||||
namespace Aws\Common\Iterator; |
||||
|
||||
use Aws\Common\Exception\InvalidArgumentException; |
||||
use Guzzle\Common\Collection; |
||||
use Guzzle\Service\Command\CommandInterface; |
||||
use Guzzle\Service\Resource\ResourceIteratorFactoryInterface; |
||||
|
||||
/** |
||||
* Resource iterator factory used to instantiate the default AWS resource iterator with the correct configuration or |
||||
* use a concrete iterator class if one exists |
||||
*/ |
||||
class AwsResourceIteratorFactory implements ResourceIteratorFactoryInterface |
||||
{ |
||||
/** |
||||
* @var array Default configuration values for iterators |
||||
*/ |
||||
protected static $defaultConfig = array( |
||||
'limit_key' => null, |
||||
'limit_param' => null, |
||||
'more_key' => null, |
||||
'token_key' => null, |
||||
'token_param' => null, |
||||
'operations' => array(), |
||||
); |
||||
|
||||
/** |
||||
* @var Collection The configuration for the iterators |
||||
*/ |
||||
protected $config; |
||||
|
||||
/** |
||||
* @var Collection Additional configurations for specific iterators |
||||
*/ |
||||
protected $operations; |
||||
|
||||
/** |
||||
* @var ResourceIteratorFactoryInterface Another factory that will be used first to instantiate the iterator |
||||
*/ |
||||
protected $primaryIteratorFactory; |
||||
|
||||
/** |
||||
* @param array $config An array of configuration values for the factory |
||||
* @param ResourceIteratorFactoryInterface $primaryIteratorFactory Another factory to use for chain of command |
||||
* |
||||
* @throws InvalidArgumentException |
||||
*/ |
||||
public function __construct(array $config, ResourceIteratorFactoryInterface $primaryIteratorFactory = null) |
||||
{ |
||||
$this->primaryIteratorFactory = $primaryIteratorFactory; |
||||
// Set up the config with default values |
||||
$this->config = Collection::fromConfig($config, self::$defaultConfig); |
||||
|
||||
// Pull out the operation-specific configurations |
||||
$this->operations = new Collection(); |
||||
$potentialOperations = $this->config->get('operations') ?: array(); |
||||
$this->config->remove('operations'); |
||||
foreach ($potentialOperations as $key => $value) { |
||||
if (is_int($key) && is_string($value)) { |
||||
$this->operations->set($value, array()); |
||||
} elseif (is_string($key) && is_array($value)) { |
||||
$this->operations->set($key, $value); |
||||
} else { |
||||
throw new InvalidArgumentException('The iterator factory configuration was invalid.'); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function build(CommandInterface $command, array $options = array()) |
||||
{ |
||||
// Get the configuration data for the command |
||||
$commandName = $command->getName(); |
||||
$iteratorConfig = $this->operations->get($commandName) ?: array(); |
||||
$options = array_replace($this->config->getAll(), $iteratorConfig, $options); |
||||
|
||||
// Instantiate the iterator using the primary factory (if there is one) |
||||
if ($this->primaryIteratorFactory && $this->primaryIteratorFactory->canBuild($command)) { |
||||
$iterator = $this->primaryIteratorFactory->build($command, $options); |
||||
} elseif (!$this->operations->hasKey($commandName)) { |
||||
throw new InvalidArgumentException("Iterator was not found for {$commandName}."); |
||||
} else { |
||||
// Fallback to this factory for creating the iterator if the primary factory did not work |
||||
$iterator = new AwsResourceIterator($command, $options); |
||||
} |
||||
|
||||
return $iterator; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function canBuild(CommandInterface $command) |
||||
{ |
||||
return ($this->primaryIteratorFactory && $this->primaryIteratorFactory->canBuild($command)) |
||||
|| $this->operations->hasKey($command->getName()); |
||||
} |
||||
} |
||||
@ -0,0 +1,270 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Model\MultipartUpload; |
||||
|
||||
use Aws\Common\Client\AwsClientInterface; |
||||
use Aws\Common\Exception\MultipartUploadException; |
||||
use Aws\Common\Exception\RuntimeException; |
||||
use Guzzle\Common\AbstractHasDispatcher; |
||||
use Guzzle\Http\EntityBody; |
||||
use Guzzle\Http\EntityBodyInterface; |
||||
use Guzzle\Service\Command\OperationCommand; |
||||
use Guzzle\Service\Resource\Model; |
||||
|
||||
/** |
||||
* Abstract class for transfer commonalities |
||||
*/ |
||||
abstract class AbstractTransfer extends AbstractHasDispatcher implements TransferInterface |
||||
{ |
||||
const BEFORE_UPLOAD = 'multipart_upload.before_upload'; |
||||
const AFTER_UPLOAD = 'multipart_upload.after_upload'; |
||||
const BEFORE_PART_UPLOAD = 'multipart_upload.before_part_upload'; |
||||
const AFTER_PART_UPLOAD = 'multipart_upload.after_part_upload'; |
||||
const AFTER_ABORT = 'multipart_upload.after_abort'; |
||||
const AFTER_COMPLETE = 'multipart_upload.after_complete'; |
||||
|
||||
/** |
||||
* @var AwsClientInterface Client used for the transfers |
||||
*/ |
||||
protected $client; |
||||
|
||||
/** |
||||
* @var TransferStateInterface State of the transfer |
||||
*/ |
||||
protected $state; |
||||
|
||||
/** |
||||
* @var EntityBody Data source of the transfer |
||||
*/ |
||||
protected $source; |
||||
|
||||
/** |
||||
* @var array Associative array of options |
||||
*/ |
||||
protected $options; |
||||
|
||||
/** |
||||
* @var int Size of each part to upload |
||||
*/ |
||||
protected $partSize; |
||||
|
||||
/** |
||||
* @var bool Whether or not the transfer has been stopped |
||||
*/ |
||||
protected $stopped = false; |
||||
|
||||
/** |
||||
* Construct a new transfer object |
||||
* |
||||
* @param AwsClientInterface $client Client used for the transfers |
||||
* @param TransferStateInterface $state State used to track transfer |
||||
* @param EntityBody $source Data source of the transfer |
||||
* @param array $options Array of options to apply |
||||
*/ |
||||
public function __construct( |
||||
AwsClientInterface $client, |
||||
TransferStateInterface $state, |
||||
EntityBody $source, |
||||
array $options = array() |
||||
) { |
||||
$this->client = $client; |
||||
$this->state = $state; |
||||
$this->source = $source; |
||||
$this->options = $options; |
||||
|
||||
$this->init(); |
||||
|
||||
$this->partSize = $this->calculatePartSize(); |
||||
} |
||||
|
||||
public function __invoke() |
||||
{ |
||||
return $this->upload(); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public static function getAllEvents() |
||||
{ |
||||
return array( |
||||
self::BEFORE_PART_UPLOAD, |
||||
self::AFTER_UPLOAD, |
||||
self::BEFORE_PART_UPLOAD, |
||||
self::AFTER_PART_UPLOAD, |
||||
self::AFTER_ABORT, |
||||
self::AFTER_COMPLETE |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function abort() |
||||
{ |
||||
$command = $this->getAbortCommand(); |
||||
$result = $command->getResult(); |
||||
|
||||
$this->state->setAborted(true); |
||||
$this->stop(); |
||||
$this->dispatch(self::AFTER_ABORT, $this->getEventData($command)); |
||||
|
||||
return $result; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function stop() |
||||
{ |
||||
$this->stopped = true; |
||||
|
||||
return $this->state; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getState() |
||||
{ |
||||
return $this->state; |
||||
} |
||||
|
||||
/** |
||||
* Get the array of options associated with the transfer |
||||
* |
||||
* @return array |
||||
*/ |
||||
public function getOptions() |
||||
{ |
||||
return $this->options; |
||||
} |
||||
|
||||
/** |
||||
* Set an option on the transfer |
||||
* |
||||
* @param string $option Name of the option |
||||
* @param mixed $value Value to set |
||||
* |
||||
* @return self |
||||
*/ |
||||
public function setOption($option, $value) |
||||
{ |
||||
$this->options[$option] = $value; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* Get the source body of the upload |
||||
* |
||||
* @return EntityBodyInterface |
||||
*/ |
||||
public function getSource() |
||||
{ |
||||
return $this->source; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
* @throws MultipartUploadException when an error is encountered. Use getLastException() to get more information. |
||||
* @throws RuntimeException when attempting to upload an aborted transfer |
||||
*/ |
||||
public function upload() |
||||
{ |
||||
if ($this->state->isAborted()) { |
||||
throw new RuntimeException('The transfer has been aborted and cannot be uploaded'); |
||||
} |
||||
|
||||
$this->stopped = false; |
||||
$eventData = $this->getEventData(); |
||||
$this->dispatch(self::BEFORE_UPLOAD, $eventData); |
||||
|
||||
try { |
||||
$this->transfer(); |
||||
$this->dispatch(self::AFTER_UPLOAD, $eventData); |
||||
|
||||
if ($this->stopped) { |
||||
return null; |
||||
} else { |
||||
$result = $this->complete(); |
||||
$this->dispatch(self::AFTER_COMPLETE, $eventData); |
||||
} |
||||
} catch (\Exception $e) { |
||||
throw new MultipartUploadException($this->state, $e); |
||||
} |
||||
|
||||
return $result; |
||||
} |
||||
|
||||
/** |
||||
* Get an array used for event notifications |
||||
* |
||||
* @param OperationCommand $command Command to include in event data |
||||
* |
||||
* @return array |
||||
*/ |
||||
protected function getEventData(OperationCommand $command = null) |
||||
{ |
||||
$data = array( |
||||
'transfer' => $this, |
||||
'source' => $this->source, |
||||
'options' => $this->options, |
||||
'client' => $this->client, |
||||
'part_size' => $this->partSize, |
||||
'state' => $this->state |
||||
); |
||||
|
||||
if ($command) { |
||||
$data['command'] = $command; |
||||
} |
||||
|
||||
return $data; |
||||
} |
||||
|
||||
/** |
||||
* Hook to initialize the transfer |
||||
*/ |
||||
protected function init() {} |
||||
|
||||
/** |
||||
* Determine the upload part size based on the size of the source data and |
||||
* taking into account the acceptable minimum and maximum part sizes. |
||||
* |
||||
* @return int The part size |
||||
*/ |
||||
abstract protected function calculatePartSize(); |
||||
|
||||
/** |
||||
* Complete the multipart upload |
||||
* |
||||
* @return Model Returns the result of the complete multipart upload command |
||||
*/ |
||||
abstract protected function complete(); |
||||
|
||||
/** |
||||
* Hook to implement in subclasses to perform the actual transfer |
||||
*/ |
||||
abstract protected function transfer(); |
||||
|
||||
/** |
||||
* Fetches the abort command fom the concrete implementation |
||||
* |
||||
* @return OperationCommand |
||||
*/ |
||||
abstract protected function getAbortCommand(); |
||||
} |
||||
@ -0,0 +1,164 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Model\MultipartUpload; |
||||
|
||||
use Aws\Common\Exception\RuntimeException; |
||||
|
||||
/** |
||||
* State of a multipart upload |
||||
*/ |
||||
abstract class AbstractTransferState implements TransferStateInterface |
||||
{ |
||||
/** |
||||
* @var UploadIdInterface Object holding params used to identity the upload part |
||||
*/ |
||||
protected $uploadId; |
||||
|
||||
/** |
||||
* @var array Array of parts where the part number is the index |
||||
*/ |
||||
protected $parts = array(); |
||||
|
||||
/** |
||||
* @var bool Whether or not the transfer was aborted |
||||
*/ |
||||
protected $aborted = false; |
||||
|
||||
/** |
||||
* Construct a new transfer state object |
||||
* |
||||
* @param UploadIdInterface $uploadId Upload identifier object |
||||
*/ |
||||
public function __construct(UploadIdInterface $uploadId) |
||||
{ |
||||
$this->uploadId = $uploadId; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getUploadId() |
||||
{ |
||||
return $this->uploadId; |
||||
} |
||||
|
||||
/** |
||||
* Get a data value from the transfer state's uploadId |
||||
* |
||||
* @param string $key Key to retrieve (e.g. Bucket, Key, UploadId, etc) |
||||
* |
||||
* @return string|null |
||||
*/ |
||||
public function getFromId($key) |
||||
{ |
||||
$params = $this->uploadId->toParams(); |
||||
|
||||
return isset($params[$key]) ? $params[$key] : null; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getPart($partNumber) |
||||
{ |
||||
return isset($this->parts[$partNumber]) ? $this->parts[$partNumber] : null; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function addPart(UploadPartInterface $part) |
||||
{ |
||||
$partNumber = $part->getPartNumber(); |
||||
$this->parts[$partNumber] = $part; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function hasPart($partNumber) |
||||
{ |
||||
return isset($this->parts[$partNumber]); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getPartNumbers() |
||||
{ |
||||
return array_keys($this->parts); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function setAborted($aborted) |
||||
{ |
||||
$this->aborted = (bool) $aborted; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function isAborted() |
||||
{ |
||||
return $this->aborted; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function count() |
||||
{ |
||||
return count($this->parts); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getIterator() |
||||
{ |
||||
return new \ArrayIterator($this->parts); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function serialize() |
||||
{ |
||||
return serialize(get_object_vars($this)); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function unserialize($serialized) |
||||
{ |
||||
$data = unserialize($serialized); |
||||
foreach (get_object_vars($this) as $property => $oldValue) { |
||||
if (array_key_exists($property, $data)) { |
||||
$this->{$property} = $data[$property]; |
||||
} else { |
||||
throw new RuntimeException("The {$property} property could be restored during unserialization."); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,148 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Model\MultipartUpload; |
||||
|
||||
use Aws\Common\Client\AwsClientInterface; |
||||
use Aws\Common\Exception\InvalidArgumentException; |
||||
use Guzzle\Http\EntityBody; |
||||
|
||||
/** |
||||
* Easily create a multipart uploader used to quickly and reliably upload a |
||||
* large file or data stream to Amazon S3 using multipart uploads |
||||
*/ |
||||
abstract class AbstractUploadBuilder |
||||
{ |
||||
/** |
||||
* @var AwsClientInterface Client used to transfer requests |
||||
*/ |
||||
protected $client; |
||||
|
||||
/** |
||||
* @var TransferStateInterface State of the transfer |
||||
*/ |
||||
protected $state; |
||||
|
||||
/** |
||||
* @var EntityBody Source of the data |
||||
*/ |
||||
protected $source; |
||||
|
||||
/** |
||||
* @var array Array of headers to set on the object |
||||
*/ |
||||
protected $headers = array(); |
||||
|
||||
/** |
||||
* Return a new instance of the UploadBuilder |
||||
* |
||||
* @return self |
||||
*/ |
||||
public static function newInstance() |
||||
{ |
||||
return new static; |
||||
} |
||||
|
||||
/** |
||||
* Set the client used to connect to the AWS service |
||||
* |
||||
* @param AwsClientInterface $client Client to use |
||||
* |
||||
* @return self |
||||
*/ |
||||
public function setClient(AwsClientInterface $client) |
||||
{ |
||||
$this->client = $client; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* Set the state of the upload. This is useful for resuming from a previously started multipart upload. |
||||
* You must use a local file stream as the data source if you wish to resume from a previous upload. |
||||
* |
||||
* @param TransferStateInterface|string $state Pass a TransferStateInterface object or the ID of the initiated |
||||
* multipart upload. When an ID is passed, the builder will create a |
||||
* state object using the data from a ListParts API response. |
||||
* |
||||
* @return self |
||||
*/ |
||||
public function resumeFrom($state) |
||||
{ |
||||
$this->state = $state; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* Set the data source of the transfer |
||||
* |
||||
* @param resource|string|EntityBody $source Source of the transfer. Pass a string to transfer from a file on disk. |
||||
* You can also stream from a resource returned from fopen or a Guzzle |
||||
* {@see EntityBody} object. |
||||
* |
||||
* @return self |
||||
* @throws InvalidArgumentException when the source cannot be found or opened |
||||
*/ |
||||
public function setSource($source) |
||||
{ |
||||
// Use the contents of a file as the data source |
||||
if (is_string($source)) { |
||||
if (!file_exists($source)) { |
||||
throw new InvalidArgumentException("File does not exist: {$source}"); |
||||
} |
||||
// Clear the cache so that we send accurate file sizes |
||||
clearstatcache(true, $source); |
||||
$source = fopen($source, 'r'); |
||||
} |
||||
|
||||
$this->source = EntityBody::factory($source); |
||||
|
||||
if ($this->source->isSeekable() && $this->source->getSize() == 0) { |
||||
throw new InvalidArgumentException('Empty body provided to upload builder'); |
||||
} |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* Specify the headers to set on the upload |
||||
* |
||||
* @param array $headers Headers to add to the uploaded object |
||||
* |
||||
* @return self |
||||
*/ |
||||
public function setHeaders(array $headers) |
||||
{ |
||||
$this->headers = $headers; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* Build the appropriate uploader based on the builder options |
||||
* |
||||
* @return TransferInterface |
||||
*/ |
||||
abstract public function build(); |
||||
|
||||
/** |
||||
* Initiate the multipart upload |
||||
* |
||||
* @return TransferStateInterface |
||||
*/ |
||||
abstract protected function initiateMultipartUpload(); |
||||
} |
||||
@ -0,0 +1,89 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Model\MultipartUpload; |
||||
|
||||
use Aws\Common\Exception\InvalidArgumentException; |
||||
|
||||
/** |
||||
* An object that encapsulates the data identifying an upload |
||||
*/ |
||||
abstract class AbstractUploadId implements UploadIdInterface |
||||
{ |
||||
/** |
||||
* @var array Expected values (with defaults) |
||||
*/ |
||||
protected static $expectedValues = array(); |
||||
|
||||
/** |
||||
* @var array Params representing the identifying information |
||||
*/ |
||||
protected $data = array(); |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public static function fromParams($data) |
||||
{ |
||||
$uploadId = new static(); |
||||
$uploadId->loadData($data); |
||||
|
||||
return $uploadId; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function toParams() |
||||
{ |
||||
return $this->data; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function serialize() |
||||
{ |
||||
return serialize($this->data); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function unserialize($serialized) |
||||
{ |
||||
$this->loadData(unserialize($serialized)); |
||||
} |
||||
|
||||
/** |
||||
* Loads an array of data into the UploadId by extracting only the needed keys |
||||
* |
||||
* @param array $data Data to load |
||||
* |
||||
* @throws InvalidArgumentException if a required key is missing |
||||
*/ |
||||
protected function loadData($data) |
||||
{ |
||||
$data = array_replace(static::$expectedValues, array_intersect_key($data, static::$expectedValues)); |
||||
foreach ($data as $key => $value) { |
||||
if (isset($data[$key])) { |
||||
$this->data[$key] = $data[$key]; |
||||
} else { |
||||
throw new InvalidArgumentException("A required key [$key] was missing from the UploadId."); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,101 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Model\MultipartUpload; |
||||
|
||||
use Aws\Common\Exception\InvalidArgumentException; |
||||
|
||||
/** |
||||
* An object that encapsulates the data for an upload part |
||||
*/ |
||||
abstract class AbstractUploadPart implements UploadPartInterface |
||||
{ |
||||
/** |
||||
* @var array A map of external array keys to internal property names |
||||
*/ |
||||
protected static $keyMap = array(); |
||||
|
||||
/** |
||||
* @var int The number of the upload part representing its order in the overall upload |
||||
*/ |
||||
protected $partNumber; |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public static function fromArray($data) |
||||
{ |
||||
$part = new static(); |
||||
$part->loadData($data); |
||||
|
||||
return $part; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function getPartNumber() |
||||
{ |
||||
return $this->partNumber; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function toArray() |
||||
{ |
||||
$array = array(); |
||||
foreach (static::$keyMap as $key => $property) { |
||||
$array[$key] = $this->{$property}; |
||||
} |
||||
|
||||
return $array; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function serialize() |
||||
{ |
||||
return serialize($this->toArray()); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function unserialize($serialized) |
||||
{ |
||||
$this->loadData(unserialize($serialized)); |
||||
} |
||||
|
||||
/** |
||||
* Loads an array of data into the upload part by extracting only the needed keys |
||||
* |
||||
* @param array|\Traversable $data Data to load into the upload part value object |
||||
* |
||||
* @throws InvalidArgumentException if a required key is missing |
||||
*/ |
||||
protected function loadData($data) |
||||
{ |
||||
foreach (static::$keyMap as $key => $property) { |
||||
if (isset($data[$key])) { |
||||
$this->{$property} = $data[$key]; |
||||
} else { |
||||
throw new InvalidArgumentException("A required key [$key] was missing from the upload part."); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,66 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Model\MultipartUpload; |
||||
|
||||
use Guzzle\Common\HasDispatcherInterface; |
||||
use Guzzle\Service\Resource\Model; |
||||
|
||||
/** |
||||
* Interface for transferring the contents of a data source to an AWS service via a multipart upload interface |
||||
*/ |
||||
interface TransferInterface extends HasDispatcherInterface |
||||
{ |
||||
/** |
||||
* Upload the source to using a multipart upload |
||||
* |
||||
* @return Model|null Result of the complete multipart upload command or null if uploading was stopped |
||||
*/ |
||||
public function upload(); |
||||
|
||||
/** |
||||
* Abort the upload |
||||
* |
||||
* @return Model Returns the result of the abort multipart upload command |
||||
*/ |
||||
public function abort(); |
||||
|
||||
/** |
||||
* Get the current state of the upload |
||||
* |
||||
* @return TransferStateInterface |
||||
*/ |
||||
public function getState(); |
||||
|
||||
/** |
||||
* Stop the transfer and retrieve the current state. |
||||
* |
||||
* This allows you to stop and later resume a long running transfer if needed. |
||||
* |
||||
* @return TransferStateInterface |
||||
*/ |
||||
public function stop(); |
||||
|
||||
/** |
||||
* Set an option on the transfer object |
||||
* |
||||
* @param string $option Option to set |
||||
* @param mixed $value The value to set |
||||
* |
||||
* @return self |
||||
*/ |
||||
public function setOption($option, $value); |
||||
} |
||||
@ -0,0 +1,92 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Model\MultipartUpload; |
||||
|
||||
use Aws\Common\Client\AwsClientInterface; |
||||
|
||||
/** |
||||
* State of a multipart upload |
||||
*/ |
||||
interface TransferStateInterface extends \Countable, \IteratorAggregate, \Serializable |
||||
{ |
||||
/** |
||||
* Create the transfer state from the results of list parts request |
||||
* |
||||
* @param AwsClientInterface $client Client used to send the request |
||||
* @param UploadIdInterface $uploadId Params needed to identify the upload and form the request |
||||
* |
||||
* @return self |
||||
*/ |
||||
public static function fromUploadId(AwsClientInterface $client, UploadIdInterface $uploadId); |
||||
|
||||
/** |
||||
* Get the params used to identify an upload part |
||||
* |
||||
* @return UploadIdInterface |
||||
*/ |
||||
public function getUploadId(); |
||||
|
||||
/** |
||||
* Get the part information of a specific part |
||||
* |
||||
* @param int $partNumber Part to retrieve |
||||
* |
||||
* @return UploadPartInterface |
||||
*/ |
||||
public function getPart($partNumber); |
||||
|
||||
/** |
||||
* Add a part to the transfer state |
||||
* |
||||
* @param UploadPartInterface $part The part to add |
||||
* |
||||
* @return self |
||||
*/ |
||||
public function addPart(UploadPartInterface $part); |
||||
|
||||
/** |
||||
* Check if a specific part has been uploaded |
||||
* |
||||
* @param int $partNumber Part to check |
||||
* |
||||
* @return bool |
||||
*/ |
||||
public function hasPart($partNumber); |
||||
|
||||
/** |
||||
* Get a list of all of the uploaded part numbers |
||||
* |
||||
* @return array |
||||
*/ |
||||
public function getPartNumbers(); |
||||
|
||||
/** |
||||
* Set whether or not the transfer has been aborted |
||||
* |
||||
* @param bool $aborted Set to true to mark the transfer as aborted |
||||
* |
||||
* @return self |
||||
*/ |
||||
public function setAborted($aborted); |
||||
|
||||
/** |
||||
* Check if the transfer has been marked as aborted |
||||
* |
||||
* @return bool |
||||
*/ |
||||
public function isAborted(); |
||||
} |
||||
@ -0,0 +1,39 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Model\MultipartUpload; |
||||
|
||||
/** |
||||
* An object that encapsulates the data identifying an upload |
||||
*/ |
||||
interface UploadIdInterface extends \Serializable |
||||
{ |
||||
/** |
||||
* Create an UploadId from an array |
||||
* |
||||
* @param array $data Data representing the upload identification |
||||
* |
||||
* @return self |
||||
*/ |
||||
public static function fromParams($data); |
||||
|
||||
/** |
||||
* Returns the array form of the upload identification for use as command params |
||||
* |
||||
* @return array |
||||
*/ |
||||
public function toParams(); |
||||
} |
||||
@ -0,0 +1,46 @@ |
||||
<?php |
||||
/** |
||||
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"). |
||||
* You may not use this file except in compliance with the License. |
||||
* A copy of the License is located at |
||||
* |
||||
* http://aws.amazon.com/apache2.0 |
||||
* |
||||
* or in the "license" file accompanying this file. This file is distributed |
||||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
||||
* express or implied. See the License for the specific language governing |
||||
* permissions and limitations under the License. |
||||
*/ |
||||
|
||||
namespace Aws\Common\Model\MultipartUpload; |
||||
|
||||
/** |
||||
* An object that encapsulates the data for an upload part |
||||
*/ |
||||
interface UploadPartInterface extends \Serializable |
||||
{ |
||||
/** |
||||
* Create an upload part from an array |
||||
* |
||||
* @param array|\Traversable $data Data representing the upload part |
||||
* |
||||
* @return self |
||||
*/ |
||||
public static function fromArray($data); |
||||
|
||||
/** |
||||
* Returns the part number of the upload part which is used as an identifier |
||||
* |
||||
* @return int |
||||
*/ |
||||
public function getPartNumber(); |
||||
|
||||
/** |
||||
* Returns the array form of the upload part |
||||
* |
||||
* @return array |
||||
*/ |
||||
public function toArray(); |
||||
} |
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue