• Модуль: clouds
  • Путь к файлу: ~/bitrix/modules/clouds/classes/general/security_service_s3.php
  • Класс: CCloudSecurityService_AmazonS3
  • Вызов: CCloudSecurityService_AmazonS3::SendRequest
function SendRequest($access_key, $secret_key, $verb, $bucket, $file_name='/', $params='')
{
	global $APPLICATION;
	$this->status = 0;

	$params['SignatureVersion'] = 2;
	$params['SignatureMethod'] = 'HmacSHA1';
	$params['AWSAccessKeyId'] = $access_key;
	$params['Version'] = '2011-06-15';

	$retry_count = COption::GetOptionInt("clouds", "aws_security_service_retry_count");
	$retry_timeout = COption::GetOptionInt("clouds", "aws_security_service_retry_timeout");
	while (true)
	{
		$time = time();
		$params['Timestamp'] = gmdate('Y-m-d', $time).'T'.gmdate('H:i:s', $time);

		$RequestMethod = $verb;
		$RequestHost = "sts.amazonaws.com";
		$RequestURI = "/";
		$RequestParams = "";

		ksort($params);
		foreach($params as $name => $value)
		{
			if($RequestParams != '')
				$RequestParams .= '&';
			$RequestParams .= urlencode($name)."=".urlencode($value);
		}

		$StringToSign =  "$RequestMethodn"
				."$RequestHostn"
				."$RequestURIn"
				."$RequestParams"
		;
		$Signature = urlencode(base64_encode($this->hmacsha1($StringToSign, $secret_key)));

		$request = new BitrixMainWebHttpClient();
		$is_ok = $request->query($RequestMethod, "https://$RequestHost$RequestURI?$RequestParams&Signature=$Signature");
		if (!$is_ok && $retry_count > 0)
		{
			$retry_count--;
			sleep($retry_timeout);
			continue;
		}
		break;
	}

	$this->result = $request->getResult();
	$this->status = $request->getStatus();
	$this->headers = $request->getHeaders();
	$this->error = $request->getError();

	if($this->status == 200)
	{
		if($this->result)
		{
			$obXML = new CDataXML;
			$text = preg_replace("/<"."\?XML.*?\?".">/i", "", $this->result);
			if($obXML->LoadString($text))
			{
				$arXML = $obXML->GetArray();
				if(is_array($arXML))
				{
					return $arXML;
				}
			}
			//XML parse error
			$APPLICATION->ThrowException(GetMessage('CLO_SECSERV_S3_XML_PARSE_ERROR', array('#errno#'=>1)));
			return false;
		}
		else
		{
			//Empty success result
			return array();
		}
	}
	elseif($this->status > 0)
	{
		if($this->result)
		{
			$APPLICATION->ThrowException(GetMessage('CLO_SECSERV_S3_XML_ERROR', array('#errmsg#'=>$this->result)));
			return false;
		}
		$APPLICATION->ThrowException(GetMessage('CLO_SECSERV_S3_XML_PARSE_ERROR', array('#errno#'=>2)));
		return false;
	}
	else
	{
		$APPLICATION->ThrowException(GetMessage('CLO_SECSERV_S3_XML_PARSE_ERROR', array('#errno#'=>3)));
		return false;
	}
}