true, 's3control' => true, 's3-object-lambda' => true, ]; /** * Resolves and signature provider and ensures a non-null return value. * * @param callable $provider Provider function to invoke. * @param string $version Signature version. * @param string $service Service name. * @param string $region Region name. * * @return SignatureInterface * @throws UnresolvedSignatureException */ public static function resolve(callable $provider, $version, $service, $region) { $result = $provider($version, $service, $region); if ($result instanceof SignatureInterface || $result instanceof BearerTokenAuthorization ) { return $result; } throw new UnresolvedSignatureException( "Unable to resolve a signature for $version/$service/$region.\n" . "Valid signature versions include v4 and anonymous." ); } /** * Default SDK signature provider. * * @return callable */ public static function defaultProvider() { return self::memoize(self::version()); } /** * Creates a signature provider that caches previously created signature * objects. The computed cache key is the concatenation of the version, * service, and region. * * @param callable $provider Signature provider to wrap. * * @return callable */ public static function memoize(callable $provider) { $cache = []; return function ($version, $service, $region) use (&$cache, $provider) { $key = "($version)($service)($region)"; if (!isset($cache[$key])) { $cache[$key] = $provider($version, $service, $region); } return $cache[$key]; }; } /** * Creates signature objects from known signature versions. * * This provider currently recognizes the following signature versions: * * - v4: Signature version 4. * - anonymous: Does not sign requests. * * @return callable */ public static function version() { return function ($version, $service, $region) { switch ($version) { case 's3v4': case 'v4': return !empty(self::$s3v4SignedServices[$service]) ? new S3SignatureV4($service, $region) : new SignatureV4($service, $region); case 'v4a': return new SignatureV4($service, $region, ['use_v4a' => true]); case 'v4-unsigned-body': return !empty(self::$s3v4SignedServices[$service]) ? new S3SignatureV4($service, $region, ['unsigned-body' => 'true']) : new SignatureV4($service, $region, ['unsigned-body' => 'true']); case 'bearer': return new BearerTokenAuthorization(); case 'anonymous': return new AnonymousSignature(); default: return null; } }; } }