UrlResolver.php in Drupal 8
File
core/modules/media/src/OEmbed/UrlResolver.php
View source
<?php
namespace Drupal\media\OEmbed;
use Drupal\Component\Utility\Html;
use Drupal\Component\Utility\UrlHelper;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Cache\UseCacheBackendTrait;
use Drupal\Core\Extension\ModuleHandlerInterface;
use GuzzleHttp\ClientInterface;
use GuzzleHttp\Exception\RequestException;
class UrlResolver implements UrlResolverInterface {
use UseCacheBackendTrait;
protected $httpClient;
protected $providers;
protected $resourceFetcher;
protected $moduleHandler;
protected $urlCache = [];
public function __construct(ProviderRepositoryInterface $providers, ResourceFetcherInterface $resource_fetcher, ClientInterface $http_client, ModuleHandlerInterface $module_handler, CacheBackendInterface $cache_backend = NULL) {
$this->providers = $providers;
$this->resourceFetcher = $resource_fetcher;
$this->httpClient = $http_client;
$this->moduleHandler = $module_handler;
$this->cacheBackend = $cache_backend;
$this->useCaches = isset($cache_backend);
}
protected function discoverResourceUrl($url) {
try {
$response = $this->httpClient
->get($url);
} catch (RequestException $e) {
return FALSE;
}
$document = Html::load((string) $response
->getBody());
$xpath = new \DOMXpath($document);
return $this
->findUrl($xpath, 'json') ?: $this
->findUrl($xpath, 'xml');
}
protected function findUrl(\DOMXPath $xpath, $format) {
$result = $xpath
->query("//link[@type='application/{$format}+oembed']");
return $result->length ? $result
->item(0)
->getAttribute('href') : FALSE;
}
public function getProviderByUrl($url) {
foreach ($this->providers
->getAll() as $provider_name => $provider_info) {
foreach ($provider_info
->getEndpoints() as $endpoint) {
if ($endpoint
->matchUrl($url)) {
return $provider_info;
}
}
}
$resource_url = $this
->discoverResourceUrl($url);
if ($resource_url) {
return $this->resourceFetcher
->fetchResource($resource_url)
->getProvider();
}
throw new ResourceException('No matching provider found.', $url);
}
public function getResourceUrl($url, $max_width = NULL, $max_height = NULL) {
if (isset($this->urlCache[$url])) {
return $this->urlCache[$url];
}
$cache_id = "media:oembed_resource_url:{$url}:{$max_width}:{$max_height}";
$cached = $this
->cacheGet($cache_id);
if ($cached) {
$this->urlCache[$url] = $cached->data;
return $this->urlCache[$url];
}
$provider = $this
->getProviderByUrl($url);
$endpoints = $provider
->getEndpoints();
$endpoint = reset($endpoints);
$resource_url = $endpoint
->buildResourceUrl($url);
$parsed_url = UrlHelper::parse($resource_url);
if ($max_width) {
$parsed_url['query']['maxwidth'] = $max_width;
}
if ($max_height) {
$parsed_url['query']['maxheight'] = $max_height;
}
$this->moduleHandler
->alter('oembed_resource_url', $parsed_url, $provider);
$resource_url = $parsed_url['path'] . '?' . rawurldecode(UrlHelper::buildQuery($parsed_url['query']));
$this->urlCache[$url] = $resource_url;
$this
->cacheSet($cache_id, $resource_url);
return $resource_url;
}
}
Classes
Name |
Description |
UrlResolver |
Converts oEmbed media URLs into endpoint-specific resource URLs. |