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