- Модуль: clouds
- Путь к файлу: ~/bitrix/modules/clouds/classes/general/storage_service_openstack.php
- Класс: CCloudStorageService_OpenStackStorage
- Вызов: CCloudStorageService_OpenStackStorage::_GetToken
function _GetToken($host, $user, $key)
{
global $APPLICATION;
static $results = array();
$cache_id = "v0|".$host."|".$user."|".$key;
if(array_key_exists($cache_id, $results))
{
$result = $results[$cache_id];
}
else
{
$result = false;
$obCache = new CPHPCache;
if($obCache->InitCache(600, $cache_id, "/")) /*TODO make setting*/
{
$result = $obCache->GetVars();
}
else
{
$this->status = 0;
$this->host = $host;
$this->verb = "GET";
$this->url = "http://".$host."/v1.0";
$this->headers = array();
$this->errno = 0;
$this->errstr = '';
$this->result = '';
$logRequest = false;
if (defined("BX_CLOUDS_TRACE") && $verb !== "GET" && $verb !== "HEAD")
{
$stime = microtime(1);
$logRequest = array(
"request_id" => md5((string)mt_rand()),
"portal" => $_SERVER["HTTP_HOST"],
"verb" => $this->verb,
"url" => $this->url,
);
AddMessage2Log(json_encode($logRequest), 'clouds', 20);
}
$request = new BitrixMainWebHttpClient(array(
"redirect" => false,
"streamTimeout" => $this->streamTimeout,
));
$request->setHeader("X-Auth-User", $user);
$request->setHeader("X-Auth-Key", $key);
$request->query($this->verb, $this->url);
$this->status = $request->getStatus();
foreach($request->getHeaders() as $key => $value)
{
$this->headers[$key] = is_array($value) ? $value[0] : $value;
}
$this->errstr = implode("n", $request->getError());
$this->errno = $this->errstr? 255: 0;
$this->result = $request->getResult();
if ($logRequest)
{
$logRequest["status"] = $this->status;
$logRequest["time"] = round(microtime(true) - $stime, 6);
$logRequest["headers"] = $this->headers;
AddMessage2Log(json_encode($logRequest), 'clouds', 0);
}
if($this->status == 412)
{
$APPLICATION->ResetException();
$this->status = 0;
$this->host = $host;
$this->verb = "GET";
$this->url = "http://".$host."/auth/v1.0";
$this->headers = array();
$this->errno = 0;
$this->errstr = '';
$this->result = '';
$logRequest = false;
if (defined("BX_CLOUDS_TRACE") && $verb !== "GET" && $verb !== "HEAD")
{
$stime = microtime(1);
$logRequest = array(
"request_id" => md5((string)mt_rand()),
"portal" => $_SERVER["HTTP_HOST"],
"verb" => $this->verb,
"url" => $this->url,
);
AddMessage2Log(json_encode($logRequest), 'clouds', 20);
}
$request = new BitrixMainWebHttpClient(array(
"redirect" => false,
"streamTimeout" => $this->streamTimeout,
));
$request->setHeader("X-Auth-User", $user);
$request->setHeader("X-Auth-Key", $key);
$request->query($this->verb, $this->url);
$this->status = $request->getStatus();
foreach($request->getHeaders() as $key => $value)
{
$this->headers[$key] = is_array($value) ? $value[0] : $value;
}
$this->errstr = implode("n", $request->getError());
$this->errno = $this->errstr? 255: 0;
$this->result = $request->getResult();
if ($logRequest)
{
$logRequest["status"] = $this->status;
$logRequest["time"] = round(microtime(true) - $stime, 6);
$logRequest["headers"] = $this->headers;
AddMessage2Log(json_encode($logRequest), 'clouds', 0);
}
}
if($this->status == 204 || $this->status == 200)
{
$arStorage = array();
if(preg_match("#^http://(.*?)(|:d+)(/.*)$#", $this->headers["X-Storage-Url"], $arStorage))
{
$result = $this->headers;
$result["X-Storage-NoProtoUrl"] = $arStorage[1].($arStorage[2] == ':80'? '': $arStorage[2]).$arStorage[3];
$result["X-Storage-Host"] = $arStorage[1];
$result["X-Storage-Port"] = $arStorage[2]? mb_substr($arStorage[2], 1) : 80;
$result["X-Storage-Urn"] = $arStorage[3];
$result["X-Storage-Proto"] = "";
}
}
}
if(is_array($result))
{
if($obCache->StartDataCache())
$obCache->EndDataCache($result);
}
$results[$cache_id] = $result;
}
return $result;
}