timeout = isset($config['timeout']) ? $config['timeout'] : 1.0; $this->client = isset($config['client']) ? $config['client'] : \DeliciousBrains\WP_Offload_Media\Aws3\Aws\default_http_handler(); } /** * Load ECS credentials * * @return PromiseInterface */ public function __invoke() { $client = $this->client; $request = new \DeliciousBrains\WP_Offload_Media\Aws3\GuzzleHttp\Psr7\Request('GET', self::getEcsUri()); return $client($request, ['timeout' => $this->timeout, 'proxy' => ''])->then(function (\DeliciousBrains\WP_Offload_Media\Aws3\Psr\Http\Message\ResponseInterface $response) { $result = $this->decodeResult((string) $response->getBody()); return new \DeliciousBrains\WP_Offload_Media\Aws3\Aws\Credentials\Credentials($result['AccessKeyId'], $result['SecretAccessKey'], $result['Token'], strtotime($result['Expiration'])); })->otherwise(function ($reason) { $reason = is_array($reason) ? $reason['exception'] : $reason; $msg = $reason->getMessage(); throw new \DeliciousBrains\WP_Offload_Media\Aws3\Aws\Exception\CredentialsException("Error retrieving credential from ECS ({$msg})"); }); } /** * Fetch credential URI from ECS environment variable * * @return string Returns ECS URI */ private function getEcsUri() { $creds_uri = getenv(self::ENV_URI); return self::SERVER_URI . $creds_uri; } private function decodeResult($response) { $result = json_decode($response, true); if (!isset($result['AccessKeyId'])) { throw new \DeliciousBrains\WP_Offload_Media\Aws3\Aws\Exception\CredentialsException('Unexpected ECS credential value'); } return $result; } }