• Модуль: xdimport
  • Путь к файлу: ~/bitrix/modules/xdimport/classes/general/lf_scheme_rss.php
  • Класс: CXDILFSchemeRSS
  • Вызов: CXDILFSchemeRSS::Request
static function Request($server, $page, $port, $params, $uri = false)
{
	global $APPLICATION;

	if ($uri && $uri <> '')
	{
		$strURI = $uri;
	}
	else
	{
		$strURI = "http://".
			$server.
			($port <> '' && intval($port) > 0 ? ":".intval($port) : "").
			($page <> ''? $page : "/").
			($params <> '' ? "?".$params : "");
	}

	$http = new BitrixMainWebHttpClient(array(
		"version" => "1.0",
		"socketTimeout" => 30,
		"streamTimeout" => 30,
		"redirect" => true,
		"redirectMax" => 5,
	));

	$strData = $http->get($strURI);
	$errors = $http->getError();

	$arRSSResult = array();

	if (
		!$strData 
		&& !empty($errors)
	)
	{
		$strError = "";

		foreach($errors as $errorCode => $errMes)
		{
			$strError .= $errorCode.": ".$errMes;
		}

		CEventLog::Add(array(
			"SEVERITY" => "ERROR",
			"AUDIT_TYPE_ID" => "XDIMPORT_HTTP",
			"MODULE_ID" => "xdimport",
			"ITEM_ID" => "RSS_REQUEST",
			"DESCRIPTION" => $strError,
		));
	}
	
	if ($strData)
	{
		$rss_charset = "windows-1251";
		if (preg_match("/<"."?XML[^>]{1,}encoding=["']([^>"']{1,})["'][^>]{0,}?".">/i", $strData, $matches))
		{
			$rss_charset = Trim($matches[1]);
		}

		$strData = preg_replace("/<"."\?XML.*?\?".">/i", "", $strData);
		$strData = $APPLICATION->ConvertCharset($strData, $rss_charset, SITE_CHARSET);
	}

	if ($strData <> '')
	{
		require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/xml.php");
		$objXML = new CDataXML();
		$res = $objXML->LoadString($strData);
		if($res !== false)
		{
			$ar = $objXML->GetArray();
			if (
				is_array($ar) && isset($ar["rss"])
				&& is_array($ar["rss"]) && isset($ar["rss"]["#"])
				&& is_array($ar["rss"]["#"]) && isset($ar["rss"]["#"]["channel"])
				&& is_array($ar["rss"]["#"]["channel"]) && isset($ar["rss"]["#"]["channel"][0])
				&& is_array($ar["rss"]["#"]["channel"][0]) && isset($ar["rss"]["#"]["channel"][0]["#"])
			) // RSS 2.0
			{
				$arRSSResult = $ar["rss"]["#"]["channel"][0]["#"];
			}
			elseif (
				is_array($ar) && isset($ar["feed"])
				&& is_array($ar["feed"]) && isset($ar["feed"]["#"])
			) // Atom
			{
				return CXDILFSchemeRSSAtom::GetFeed($ar, $objXML);
			}

			$arRSSResult["rss_charset"] = mb_strtolower(SITE_CHARSET);
		}
	}

	if (
		is_array($arRSSResult) 
		&& !empty($arRSSResult)
	)
	{
		$arRSSResult = self::FormatArray($arRSSResult);

		if (
			!empty($arRSSResult)
			&& array_key_exists("item", $arRSSResult)
			&& is_array($arRSSResult["item"])
			&& !empty($arRSSResult["item"])
		)
		{
			$arRSSResult["item"] = array_reverse($arRSSResult["item"]);
		}
	}

	return $arRSSResult;
}