true, 's3control' => 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) { return $result; } throw new \UglyRobot\Infinite_Uploads\Aws\Exception\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 \UglyRobot\Infinite_Uploads\Aws\Signature\S3SignatureV4($service, $region) : new \UglyRobot\Infinite_Uploads\Aws\Signature\SignatureV4($service, $region); case 'v4-unsigned-body': return new \UglyRobot\Infinite_Uploads\Aws\Signature\SignatureV4($service, $region, ['unsigned-body' => 'true']); case 'anonymous': return new \UglyRobot\Infinite_Uploads\Aws\Signature\AnonymousSignature(); default: return null; } }; } }