• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/urlpreview/urlpreview.php
  • Класс: BitrixMainUrlPreviewUrlPreview
  • Вызов: UrlPreview::getRemoteUrlMetadata
static function getRemoteUrlMetadata(Uri $uri)
{
	$httpClient = new HttpClient();
	//prevents proxy to LAN
	$httpClient->setPrivateIp(false);
	$httpClient->setTimeout(5);
	$httpClient->setStreamTimeout(5);
	$httpClient->setHeader('User-Agent', self::USER_AGENT);

	$httpClient->shouldFetchBody(function (Response $response) {
		return ($response->getHeadersCollection()->getContentType() === 'text/html');
	});

	try
	{
		if (!$httpClient->query('GET', $uri->getUri()))
		{
			return false;
		}
	}
	catch (ErrorException $exception)
	{
		return false;
	}

	if ($httpClient->getStatus() !== 200)
	{
		return false;
	}

	$peerIpAddress = $httpClient->getPeerAddress();

	if ($httpClient->getHeaders()->getContentType() !== 'text/html')
	{
		$metadata = static::getFileMetadata($httpClient->getEffectiveUrl(), $httpClient->getHeaders());
		$metadata['EXTRA']['PEER_IP_ADDRESS'] = $peerIpAddress;
		$metadata['EXTRA']['PEER_IP_PRIVATE'] = (new IpAddress($peerIpAddress))->isPrivate();
		return $metadata;
	}

	$html = $httpClient->getResult();

	$htmlDocument = new HtmlDocument($html, $uri);
	$htmlDocument->setEncoding($httpClient->getCharset());
	ParserChain::extractMetadata($htmlDocument);
	$metadata = $htmlDocument->getMetadata();

	if (is_array($metadata) && static::validateRemoteMetadata($metadata))
	{
		if (isset($metadata['IMAGE']) && static::getOptionSaveImages())
		{
			$metadata['IMAGE_ID'] = static::saveImage($metadata['IMAGE']);
			unset($metadata['IMAGE']);
		}

		if (isset($metadata['DESCRIPTION']) && mb_strlen($metadata['DESCRIPTION']) > static::MAX_DESCRIPTION)
		{
			$metadata['DESCRIPTION'] = mb_substr($metadata['DESCRIPTION'], 0, static::MAX_DESCRIPTION);
		}

		if (!is_array($metadata['EXTRA']))
		{
			$metadata['EXTRA'] = array();
		}

		$metadata['EXTRA'] = array_merge($metadata['EXTRA'], array(
			'PEER_IP_ADDRESS' => $peerIpAddress,
			'PEER_IP_PRIVATE' => (new IpAddress($peerIpAddress))->isPrivate(),
			'X_FRAME_OPTIONS' => $httpClient->getHeaders()->get('X-Frame-Options', true),
			'EFFECTIVE_URL' => $httpClient->getEffectiveUrl(),
		));

		return $metadata;
	}

	return false;
}