• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/classes/general/update_client_partner.php
  • Класс: CUpdateClientPartner
  • Вызов: CUpdateClientPartner::loadFileBx
static function loadFileBx($requestedUrl, $realSize, $outputFilename, $timeout, $requestQueryString, &$errorMessage)
{
	$timeout = intval($timeout);
	$startTime = 0;
	if ($timeout > 0)
		$startTime = getmicrotime();

	$addrParams = static::getAddr();

	$socketHandler = fsockopen($addrParams["SOCKET_IP"], $addrParams["SOCKET_PORT"], $errorNum, $errorMsg, 30);
	if (!$socketHandler)
	{
		$errorMessage .= static::getSocketError($errorMsg, $errorNum, $addrParams);
		return "E";
	}

	$request = "";
	if ($addrParams["USE_PROXY"])
	{
		$request .= "POST http://".$addrParams["IP"]."/bitrix/updates/smp_updater_modules.php HTTP/1.0rn";
		if ($addrParams["PROXY_USERNAME"])
			$request .= "Proxy-Authorization: Basic ".base64_encode(
					$addrParams["PROXY_USERNAME"].":".$addrParams["PROXY_PASSWORD"]
				)."rn";
	}
	else
	{
		$request .= "POST /bitrix/updates/smp_updater_modules.php HTTP/1.0rn";
	}

	$requestQueryString .= "&UFILE=".$requestedUrl;
	$startSize = (file_exists($outputFilename.".tmp") ? filesize($outputFilename.".tmp") : 0);
	$requestQueryString .= "&USTART=".$startSize."&verfix=2";

	$request .= "User-Agent: BitrixSMUpdaterrn";
	$request .= "Accept: */*rn";
	$request .= "Host: ".$addrParams["IP"]."rn";
	$request .= "Accept-Language: enrn";
	$request .= "Content-type: application/x-www-form-urlencodedrn";
	$request .= "Content-length: ".mb_strlen($requestQueryString)."rnrn";
	$request .= $requestQueryString;
	$request .= "rn";

	fputs($socketHandler, $request);

	$replyHeader = "";
	while (($result = fgets($socketHandler, 4096)) && $result != "rn")
		$replyHeader .= $result;

	$replyHeaderArray = preg_split("#rn#", $replyHeader);

	$contentLength = 0;
	for ($i = 0, $cnt = count($replyHeaderArray); $i < $cnt; $i++)
	{
		if (strpos($replyHeaderArray[$i], "Content-Length") !== false)
		{
			$pos = mb_strpos($replyHeaderArray[$i], ":");
			$contentLength = intval(trim(mb_substr($replyHeaderArray[$i], $pos + 1, mb_strlen($replyHeaderArray[$i]) - $pos + 1)));
		}
	}

	if (($contentLength + $startSize) != $realSize)
	{
		$errorMessage .= "[ELVL001] ".GetMessage("ELVL001_SIZE_ERROR").". ";
		return "E";
	}

	@unlink($outputFilename.".tmp1");

	if (file_exists($outputFilename.".tmp"))
	{
		if (@rename($outputFilename.".tmp", $outputFilename.".tmp1"))
		{
			$fileHandler = fopen($outputFilename.".tmp", "wb");
			if ($fileHandler)
			{
				$fh1 = fopen($outputFilename.".tmp1", "rb");
				do
				{
					$data = fread($fh1, 8192);
					if ($data == '')
						break;
					fwrite($fileHandler, $data);
				}
				while (true);

				fclose($fh1);
				@unlink($outputFilename.".tmp1");
			}
			else
			{
				$errorMessage .= "[JUHYT002] ".GetMessage("JUHYT002_ERROR_FILE").". ";
				return "E";
			}
		}
		else
		{
			$errorMessage .= "[JUHYT003] ".GetMessage("JUHYT003_ERROR_FILE").". ";
			return "E";
		}
	}
	else
	{
		$fileHandler = fopen($outputFilename.".tmp", "wb");
		if (!$fileHandler)
		{
			$errorMessage .= "[JUHYT004] ".GetMessage("JUHYT004_ERROR_FILE").". ";
			return "E";
		}
	}

	$isFinished = true;
	while (true)
	{
		if ($timeout > 0 && (microtime(true) - $startTime) > $timeout)
		{
			$isFinished = false;
			break;
		}

		$result = fread($socketHandler, 40960);
		if ($result == "")
			break;

		fwrite($fileHandler, $result);
	}

	fclose($fileHandler);
	fclose($socketHandler);

	CUpdateClientPartner::AddMessage2Log("Time - ".(microtime(true) - $startTime)." sec", "DOWNLOAD");

	$sizeTmp = (file_exists($outputFilename.".tmp") ? filesize($outputFilename.".tmp") : 0);
	if ($sizeTmp == $realSize)
	{
		$isFinished = true;
	}

	if ($isFinished)
	{
		@unlink($outputFilename);
		if (!@rename($outputFilename.".tmp", $outputFilename))
		{
			$errorMessage .= "[JUHYT005] ".GetMessage("JUHYT005_ERROR_FILE").". ";
			return "E";
		}
		@unlink($outputFilename.".tmp");
	}
	else
	{
		return "S";
	}

	return "U";
}