%PDF- %PDF-
| Direktori : /home/bitrix/www/local/php_interface/lib/vendor/kreait/gcp-metadata/src/ |
| Current File : /home/bitrix/www/local/php_interface/lib/vendor/kreait/gcp-metadata/src/GcpMetadata.php |
<?php
declare(strict_types=1);
namespace Kreait;
use function GuzzleHttp\choose_handler;
use GuzzleHttp\Client;
use GuzzleHttp\ClientInterface;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Middleware;
use Kreait\GcpMetadata\Error;
use Psr\Http\Message\ResponseInterface;
class GcpMetadata
{
const baseUrl = 'http://metadata.google.internal/computeMetadata/v1/';
const flavorHeaderName = 'Metadata-Flavor';
const flavorHeaderValue = 'Google';
/**
* @var ClientInterface|null
*/
private $client;
public function __construct(ClientInterface $client = null)
{
$this->client = $client;
}
public function isAvailable(): bool
{
try {
$this->instance();
return true;
} catch (\Throwable $e) {
return false;
}
}
public function instance(string $property = '', array $params = [])
{
return $this->request('instance', $property, $params);
}
public function project(string $property = '', array $params = [])
{
return $this->request('project', $property, $params);
}
private function request(string $type, string $property = '', array $params = [])
{
$property = ltrim($property, '/');
$url = self::baseUrl.$type.'/'.$property;
$options = [
'headers' => [self::flavorHeaderName => self::flavorHeaderValue],
'query' => $params,
];
try {
$response = $this->client()->request('GET', $url, $options);
$this->verifyHttpStatus($response);
$this->verifyHeaders($response);
return $this->parseResponse($response);
} catch (RequestException $e) {
$message = $e->getMessage();
if ($response = $e->getResponse()) {
$message .= ': '.$response->getBody();
}
throw new Error($message);
}
}
private function verifyHttpStatus(ResponseInterface $response)
{
if (($statusCode = $response->getStatusCode()) !== 200) {
throw new Error('Unsuccessful response status code: '.$statusCode);
}
}
private function verifyHeaders(ResponseInterface $response)
{
if ($response->getHeaderLine(self::flavorHeaderName) !== self::flavorHeaderValue) {
throw new Error('"'.self::flavorHeaderName.'" header is missing or incorrect.');
}
}
private function parseResponse(ResponseInterface $response)
{
$body = trim((string) $response->getBody());
$lines = explode("\n", $body);
if (\count($lines) === 1) {
return $body;
}
return $lines;
}
private function client(): ClientInterface
{
if (!$this->client) {
$decider = function ($retries) {
return $retries < 3;
};
$stack = new HandlerStack(choose_handler());
$stack->push(Middleware::redirect(), 'allow_redirects');
$stack->push(Middleware::retry($decider));
$this->client = new Client([
'handler' => $stack,
]);
}
return $this->client;
}
}