• Модуль: clouds
  • Путь к файлу: ~/bitrix/modules/clouds/classes/general/storage_service_rackspace.php
  • Класс: CCloudStorageService_RackSpaceCloudFiles
  • Вызов: CCloudStorageService_RackSpaceCloudFiles::_GetToken
function _GetToken($host, $user, $key)
{
	$result = false;
	$cache_id = "v0|".$host."|".$user."|".$key;
	$obCache = new CPHPCache;

	if($obCache->InitCache(3600, $cache_id, "/"))
	{
		$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 == 301
			&& $this->headers["Location"] <> ''
			&& preg_match("#^https://(.*?)(/.*)$#", $this->headers["Location"], $arNewLocation)
		)
		{
			$APPLICATION->ResetException();

			$this->status = 0;
			$this->host = $arNewLocation[1];
			$this->verb = "GET";
			$this->url =  "https://".$arNewLocation[1]."/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)
			{
				if(preg_match("#^https://(.*?)(/.*)$#", $this->headers["X-Storage-Url"], $arStorage))
				{
					$result = $this->headers;
					$result["X-Storage-Host"] = $arStorage[1];
					$result["X-Storage-Port"] = 443;
					$result["X-Storage-Urn"] = $arStorage[2];
					$result["X-Storage-Proto"] = "ssl://";
				}
			}
		}
	}

	if(is_array($result))
	{
		if($obCache->StartDataCache())
			$obCache->EndDataCache($result);
	}

	return $result;
}