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