- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/classes/general/update_client_partner.php
- Класс: CUpdateClientPartner
- Вызов: CUpdateClientPartner::loadFile
static function loadFile($requestedUrl, $realSize, $outputFilename, $timeout, &$errorMessage)
{
$timeout = intval($timeout);
$startTime = 0;
if ($timeout > 0)
$startTime = getmicrotime();
$startSize = file_exists($outputFilename.".tmp") ? filesize($outputFilename.".tmp") : 0;
//$realRequestedUrlParsed = parse_url($requestedUrl);
$addrParams = static::getAddr(/*$realRequestedUrlParsed["host"], $realRequestedUrlParsed["port"]*/);
$socketHandler = fsockopen($addrParams["SOCKET_IP"], $addrParams["SOCKET_PORT"], $errorNum, $errorMsg, 30);
if (!$socketHandler)
{
$errorMessage .= static::getSocketError($errorMsg, $errorNum, $addrParams);
return "E";
}
if (!$requestedUrl)
$requestedUrl = "/";
$request = "";
if (!$addrParams["USE_PROXY"])
{
$request .= "GET ".$requestedUrl." HTTP/1.0rn";
$request .= "Host: ".$addrParams["IP"]."rn";
}
else
{
$request .= "GET http://".$addrParams["IP"].$requestedUrl." HTTP/1.0rn";
$request .= "Host: ".$addrParams["IP"]."rn";
if ($addrParams["PROXY_USERNAME"])
$request .= "Proxy-Authorization: Basic ".base64_encode($addrParams["PROXY_USERNAME"].":".$addrParams["PROXY_PASSWORD"])."rn";
}
$request .= "User-Agent: BitrixSMUpdaterrn";
if ($startSize > 0)
$request .= "Range: bytes=".$startSize."-rn";
$request .= "rn";
fwrite($socketHandler, $request);
$replyHeader = "";
while (($result = fgets($socketHandler, 4096)) && $result!="rn")
$replyHeader .= $result;
$replyHeaderArray = preg_split("#rn#", $replyHeader);
$replycode = 0;
$replymsg = "";
if (preg_match("#([A-Z]{4})/([0-9.]{3}) ([0-9]{3})#", $replyHeaderArray[0], $regs))
{
$replycode = intval($regs[3]);
$replymsg = mb_substr($replyHeaderArray[0], mb_strpos($replyHeaderArray[0], $replycode) + mb_strlen($replycode) + 1, mb_strlen($replyHeaderArray[0]) - mb_strpos($replyHeaderArray[0], $replycode) + 1);
}
if ($replycode != 200 && $replycode != 204 && $replycode != 302 && $replycode != 206)
{
$errorMessage .= GetMessage("SUPP_PSD_BAD_RESPONSE")." (".$replycode." - ".$replymsg.")";
return "E";
}
$replyContentRange = "";
$replyContentLength = 0;
for ($i = 1; $i < count($replyHeaderArray); $i++)
{
if (strpos($replyHeaderArray[$i], "Content-Range") !== false)
$replyContentRange = trim(mb_substr($replyHeaderArray[$i], mb_strpos($replyHeaderArray[$i], ":") + 1, mb_strlen($replyHeaderArray[$i]) - mb_strpos($replyHeaderArray[$i], ":") + 1));
elseif (strpos($replyHeaderArray[$i], "Content-Length") !== false)
$replyContentLength = doubleval(trim(mb_substr($replyHeaderArray[$i], mb_strpos($replyHeaderArray[$i], ":") + 1, mb_strlen($replyHeaderArray[$i]) - mb_strpos($replyHeaderArray[$i], ":") + 1)));
}
$shouldReloadFile = true;
if ($replyContentRange <> '')
{
if (preg_match("# *bytes +([0-9]*) *- *([0-9]*) */ *([0-9]*)#i", $replyContentRange, $regs))
{
$startBytesTmp = doubleval($regs[1]);
$endBytesTmp = doubleval($regs[2]);
$sizeBytesTmp = doubleval($regs[3]);
if (($startBytesTmp == $startSize) && ($endBytesTmp == ($realSize - 1)) && ($sizeBytesTmp == $realSize))
{
$shouldReloadFile = false;
}
}
}
if ($shouldReloadFile)
{
@unlink($outputFilename.".tmp");
$startSize = 0;
}
if (($replyContentLength + $startSize) != $realSize)
{
$errorMessage .= "[ELVL010] ".GetMessage("ELVL001_SIZE_ERROR").". ";
return "E";
}
$fileHandler = fopen($outputFilename.".tmp", "ab");
if (!$fileHandler)
{
$errorMessage .= "[JUHYT010] ".GetMessage("JUHYT002_ERROR_FILE").". ";
return "E";
}
$isFinished = true;
$downloadSize = (double) $startSize;
while (true)
{
if ($timeout > 0 && (getmicrotime() - $startTime) > $timeout)
{
$isFinished = false;
break;
}
$result = fread($socketHandler, 256 * 1024);
$downloadSize += mb_strlen($result);
if ($result == "")
break;
fwrite($fileHandler, $result);
}
fclose($fileHandler);
fclose($socketHandler);
$sizeTmp = (file_exists($outputFilename.".tmp") ? filesize($outputFilename.".tmp") : 0);
if ($sizeTmp == $realSize)
{
$isFinished = true;
}
if ($isFinished)
{
@unlink($outputFilename);
if (!@rename($outputFilename.".tmp", $outputFilename))
{
$errorMessage .= "[JUHYT010] ".GetMessage("JUHYT005_ERROR_FILE").". ";
return "E";
}
@unlink($outputFilename.".tmp");
}
else
{
return "S";
}
return "U";
}