• Модуль: 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;
}