%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/clouds/classes/general/ |
| Current File : /home/bitrix/www/bitrix/modules/clouds/classes/general/storage_service_rackspace.php |
<?
class CCloudStorageService_RackSpaceCloudFiles extends CCloudStorageService_OpenStackStorage
{
function GetObject()
{
return new CCloudStorageService_RackSpaceCloudFiles();
}
function GetID()
{
return "rackspace_storage";
}
function GetName()
{
return "Rackspace Cloud Files";
}
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
{
$obRequest = new CHTTP;
$obRequest->additional_headers["X-Auth-User"] = $user;
$obRequest->additional_headers["X-Auth-Key"] = $key;
$obRequest->Query("GET", $host, 80, "/v1.0");
if($obRequest->status == 301 && strlen($obRequest->headers["Location"]) > 0)
{
if(preg_match("#^https://(.*?)(/.*)\$#", $obRequest->headers["Location"], $arNewLocation))
{
$obRequest = new CHTTP;
$obRequest->additional_headers["X-Auth-User"] = $user;
$obRequest->additional_headers["X-Auth-Key"] = $key;
@$obRequest->Query("GET", $arNewLocation[1], 443, "/v1.0", false, "ssl://");
if($obRequest->status == 204)
{
if(preg_match("#^https://(.*?)(/.*)\$#", $obRequest->headers["X-Storage-Url"], $arStorage))
{
$result = $obRequest->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;
}
function SendCDNRequest($settings, $verb, $bucket, $file_name='', $params='', $content=false, $additional_headers=array())
{
$arToken = $this->_GetToken($settings["HOST"], $settings["USER"], $settings["KEY"]);
if(!$arToken)
return false;
if(isset($arToken["X-CDN-Management-Url"]))
{
if(preg_match("#^http://(.*?)(|:\d+)(/.*)\$#", $arToken["X-CDN-Management-Url"], $arCDN))
{
$Host = $arCDN[1];
$Port = $arCDN[2]? substr($arCDN[2], 1): 80;
$Urn = $arCDN[3];
$Proto = "";
}
elseif(preg_match("#^https://(.*?)(|:\d+)(/.*)\$#", $arToken["X-CDN-Management-Url"], $arCDN))
{
$Host = $arCDN[1];
$Port = $arCDN[2]? substr($arCDN[2], 1): 443;
$Urn = $arCDN[3];
$Proto = "ssl://";
}
else
{
return false;
}
}
else
{
return false;
}
$obRequest = new CHTTP;
$obRequest->additional_headers["X-Auth-Token"] = $arToken["X-Auth-Token"];
foreach($additional_headers as $key => $value)
$obRequest->additional_headers[$key] = $value;
$obRequest->Query(
$verb,
$Host,
$Port,
$Urn.CCloudUtil::URLEncode("/".$bucket.$file_name.$params, "UTF-8"),
$content,
$Proto
);
return $obRequest;
}
function CreateBucket($arBucket)
{
global $APPLICATION;
$obRequest = $this->SendRequest(
$arBucket["SETTINGS"],
"PUT",
$arBucket["BUCKET"]
);
//CDN Enable
if($this->status == 201)
{
$obCDNRequest = $this->SendCDNRequest(
$arBucket["SETTINGS"],
"PUT",
$arBucket["BUCKET"],
'', //filename
'', //params
false, //content
array(
"X-CDN-Enabled" => "True",
)
);
}
return ($this->status == 201)/*Created*/ || ($this->status == 202) /*Accepted*/;
}
function GetFileSRC($arBucket, $arFile)
{
global $APPLICATION;
if ($arBucket["SETTINGS"]["FORCE_HTTP"] === "Y")
$proto = "http";
else
$proto = ($APPLICATION->IsHTTPS()? "https": "http");
if($arBucket["CNAME"])
{
$host = $proto."://".$arBucket["CNAME"];
}
else
{
$result = false;
$cache_id = md5(serialize($arBucket));
$obCache = new CPHPCache;
if($obCache->InitCache(3600, $cache_id, "/"))
{
$result = $obCache->GetVars();
}
else
{
$obCDNRequest = $this->SendCDNRequest(
$arBucket["SETTINGS"],
"HEAD",
$arBucket["BUCKET"]
);
if(is_object($obCDNRequest))
{
if($obCDNRequest->status == 204)
{
$result = array();
foreach($obCDNRequest->headers as $key => $value)
$result[strtolower($key)] = $value;
}
}
}
if($obCache->StartDataCache())
$obCache->EndDataCache($result);
if(is_array($result))
$host = $result["x-cdn-uri"];
else
return "/404.php";
}
if(is_array($arFile))
$URI = ltrim($arFile["SUBDIR"]."/".$arFile["FILE_NAME"], "/");
else
$URI = ltrim($arFile, "/");
if($arBucket["PREFIX"])
{
if(substr($URI, 0, strlen($arBucket["PREFIX"])+1) !== $arBucket["PREFIX"]."/")
$URI = $arBucket["PREFIX"]."/".$URI;
}
return $host."/".CCloudUtil::URLEncode($URI, "UTF-8");
}
}
?>