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