v2: Updates

* Simplifies & beautifies everything
* Introduces a new Class system.
* Errors are defaulted to AWS's handler.
* New function names & more efficient handling.
* Should fix a majority of the errors.

Please read the README for more!
This commit is contained in:
Devang Srivastava 2020-09-28 15:32:51 +05:30
commit e6d7753dc8
1095 changed files with 45088 additions and 2911 deletions

View file

@ -4,6 +4,10 @@ namespace Aws;
use Aws\Api\ApiProvider;
use Aws\Api\DocModel;
use Aws\Api\Service;
use Aws\ClientSideMonitoring\ApiCallAttemptMonitoringMiddleware;
use Aws\ClientSideMonitoring\ApiCallMonitoringMiddleware;
use Aws\ClientSideMonitoring\ConfigurationProvider;
use Aws\EndpointDiscovery\EndpointDiscoveryMiddleware;
use Aws\Signature\SignatureProvider;
use GuzzleHttp\Psr7\Uri;
@ -14,6 +18,9 @@ class AwsClient implements AwsClientInterface
{
use AwsClientTrait;
/** @var array */
private $aliases;
/** @var array */
private $config;
@ -64,6 +71,16 @@ class AwsClient implements AwsClientInterface
* credentials or return null. See Aws\Credentials\CredentialProvider for
* a list of built-in credentials providers. If no credentials are
* provided, the SDK will attempt to load them from the environment.
* - csm:
* (Aws\ClientSideMonitoring\ConfigurationInterface|array|callable) Specifies
* the credentials used to sign requests. Provide an
* Aws\ClientSideMonitoring\ConfigurationInterface object, a callable
* configuration provider used to create client-side monitoring configuration,
* `false` to disable csm, or an associative array with the following keys:
* enabled: (bool) Set to true to enable client-side monitoring, defaults
* to false; host: (string) the host location to send monitoring events to,
* defaults to 127.0.0.1; port: (int) The port used for the host connection,
* defaults to 31000; client_id: (string) An identifier for this project
* - debug: (bool|array) Set to true to display debug information when
* sending requests. Alternatively, you can provide an associative array
* with the following keys: logfn: (callable) Function that is invoked
@ -82,9 +99,22 @@ class AwsClient implements AwsClientInterface
* `http_stats_receiver` option for this to have an effect; timer: (bool)
* Set to true to enable a command timer that reports the total wall clock
* time spent on an operation in seconds.
* - disable_host_prefix_injection: (bool) Set to true to disable host prefix
* injection logic for services that use it. This disables the entire
* prefix injection, including the portions supplied by user-defined
* parameters. Setting this flag will have no effect on services that do
* not use host prefix injection.
* - endpoint: (string) The full URI of the webservice. This is only
* required when connecting to a custom endpoint (e.g., a local version
* of S3).
* - endpoint_discovery: (Aws\EndpointDiscovery\ConfigurationInterface,
* Aws\CacheInterface, array, callable) Settings for endpoint discovery.
* Provide an instance of Aws\EndpointDiscovery\ConfigurationInterface,
* an instance Aws\CacheInterface, a callable that provides a promise for
* a Configuration object, or an associative array with the following
* keys: enabled: (bool) Set to true to enable endpoint discovery, false
* to explicitly disable it, defaults to false; cache_limit: (int) The
* maximum number of keys in the endpoints cache, defaults to 1000.
* - endpoint_provider: (callable) An optional PHP callable that
* accepts a hash of options including a "service" and "region" key and
* returns NULL or a hash of endpoint data, of which the "endpoint" key
@ -117,8 +147,16 @@ class AwsClient implements AwsClientInterface
* - region: (string, required) Region to connect to. See
* http://docs.aws.amazon.com/general/latest/gr/rande.html for a list of
* available regions.
* - retries: (int, default=int(3)) Configures the maximum number of
* allowed retries for a client (pass 0 to disable retries).
* - retries: (int, Aws\Retry\ConfigurationInterface, Aws\CacheInterface,
* array, callable) Configures the retry mode and maximum number of
* allowed retries for a client (pass 0 to disable retries). Provide an
* integer for 'legacy' mode with the specified number of retries.
* Otherwise provide an instance of Aws\Retry\ConfigurationInterface, an
* instance of Aws\CacheInterface, a callable function, or an array with
* the following keys: mode: (string) Set to 'legacy', 'standard' (uses
* retry quota management), or 'adapative' (an experimental mode that adds
* client-side rate limiting to standard mode); max_attempts (int) The
* maximum number of attempts for a given request.
* - scheme: (string, default=string(5) "https") URI scheme to use when
* connecting connect. The SDK will utilize "https" endpoints (i.e.,
* utilize SSL/TLS connections) by default. You can attempt to connect to
@ -133,6 +171,10 @@ class AwsClient implements AwsClientInterface
* signature version to use with a service (e.g., v4). Note that
* per/operation signature version MAY override this requested signature
* version.
* - use_aws_shared_config_files: (bool, default=bool(true)) Set to false to
* disable checking for shared config file in '~/.aws/config' and
* '~/.aws/credentials'. This will override the AWS_CONFIG_FILE
* environment variable.
* - validate: (bool, default=bool(true)) Set to false to disable
* client-side parameter validation.
* - version: (string, required) The version of the webservice to
@ -152,7 +194,6 @@ class AwsClient implements AwsClientInterface
if (!isset($args['exception_class'])) {
$args['exception_class'] = $exceptionClass;
}
$this->handlerList = new HandlerList();
$resolver = new ClientResolver(static::getArguments());
$config = $resolver->resolve($args, $this->handlerList);
@ -165,6 +206,10 @@ class AwsClient implements AwsClientInterface
$this->defaultRequestOptions = $config['http'];
$this->addSignatureMiddleware();
$this->addInvocationId();
$this->addEndpointParameterMiddleware($args);
$this->addEndpointDiscoveryMiddleware($config, $args);
$this->loadAliases();
$this->addStreamRequestPayload();
if (isset($args['with_resolved'])) {
$args['with_resolved']($config);
@ -236,7 +281,7 @@ class AwsClient implements AwsClientInterface
*
* @return callable
*/
final protected function getSignatureProvider()
final public function getSignatureProvider()
{
return $this->signatureProvider;
}
@ -263,6 +308,35 @@ class AwsClient implements AwsClientInterface
];
}
private function addEndpointParameterMiddleware($args)
{
if (empty($args['disable_host_prefix_injection'])) {
$list = $this->getHandlerList();
$list->appendBuild(
EndpointParameterMiddleware::wrap(
$this->api
),
'endpoint_parameter'
);
}
}
private function addEndpointDiscoveryMiddleware($config, $args)
{
$list = $this->getHandlerList();
if (!isset($args['endpoint'])) {
$list->appendBuild(
EndpointDiscoveryMiddleware::wrap(
$this,
$args,
$config['endpoint_discovery']
),
'EndpointDiscoveryMiddleware'
);
}
}
private function addSignatureMiddleware()
{
$api = $this->getApi();
@ -274,6 +348,9 @@ class AwsClient implements AwsClientInterface
$resolver = static function (
CommandInterface $c
) use ($api, $provider, $name, $region, $version) {
if (!empty($c['@context']['signing_region'])) {
$region = $c['@context']['signing_region'];
}
$authType = $api->getOperation($c->getName())['authtype'];
switch ($authType){
case 'none':
@ -297,6 +374,33 @@ class AwsClient implements AwsClientInterface
$this->handlerList->prependSign(Middleware::invocationId(), 'invocation-id');
}
private function loadAliases($file = null)
{
if (!isset($this->aliases)) {
if (is_null($file)) {
$file = __DIR__ . '/data/aliases.json';
}
$aliases = \Aws\load_compiled_json($file);
$serviceId = $this->api->getServiceId();
$version = $this->getApi()->getApiVersion();
if (!empty($aliases['operations'][$serviceId][$version])) {
$this->aliases = array_flip($aliases['operations'][$serviceId][$version]);
}
}
}
private function addStreamRequestPayload()
{
$streamRequestPayloadMiddleware = StreamRequestPayloadMiddleware::wrap(
$this->api
);
$this->handlerList->prependSign(
$streamRequestPayloadMiddleware,
'StreamRequestPayloadMiddleware'
);
}
/**
* Returns a service model and doc model with any necessary changes
* applied.
@ -311,6 +415,20 @@ class AwsClient implements AwsClientInterface
*/
public static function applyDocFilters(array $api, array $docs)
{
$aliases = \Aws\load_compiled_json(__DIR__ . '/data/aliases.json');
$serviceId = $api['metadata']['serviceId'];
$version = $api['metadata']['apiVersion'];
// Replace names for any operations with SDK aliases
if (!empty($aliases['operations'][$serviceId][$version])) {
foreach ($aliases['operations'][$serviceId][$version] as $op => $alias) {
$api['operations'][$alias] = $api['operations'][$op];
$docs['operations'][$alias] = $docs['operations'][$op];
unset($api['operations'][$op], $docs['operations'][$op]);
}
}
ksort($api['operations']);
return [
new Service($api, ApiProvider::defaultProvider()),
new DocModel($docs)