Mercurial > hg > isophonics-drupal-site
diff core/modules/media/src/OEmbed/Endpoint.php @ 17:129ea1e6d783
Update, including to Drupal core 8.6.10
author | Chris Cannam |
---|---|
date | Thu, 28 Feb 2019 13:21:36 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/media/src/OEmbed/Endpoint.php Thu Feb 28 13:21:36 2019 +0000 @@ -0,0 +1,176 @@ +<?php + +namespace Drupal\media\OEmbed; + +use Drupal\Component\Utility\UrlHelper; + +/** + * Value object for oEmbed provider endpoints. + * + * @internal + * This class is an internal part of the oEmbed system and should only be + * instantiated by instances of Drupal\media\OEmbed\Provider. + */ +class Endpoint { + + /** + * The endpoint's URL. + * + * @var string + */ + protected $url; + + /** + * The provider this endpoint belongs to. + * + * @var \Drupal\media\OEmbed\Provider + */ + protected $provider; + + /** + * List of URL schemes supported by the provider. + * + * @var string[] + */ + protected $schemes; + + /** + * List of supported formats. Only 'json' and 'xml' are allowed. + * + * @var string[] + * + * @see https://oembed.com/#section2 + */ + protected $formats; + + /** + * Whether the provider supports oEmbed discovery. + * + * @var bool + */ + protected $supportsDiscovery; + + /** + * Endpoint constructor. + * + * @param string $url + * The endpoint URL. May contain a @code '{format}' @endcode placeholder. + * @param \Drupal\media\OEmbed\Provider $provider + * The provider this endpoint belongs to. + * @param string[] $schemes + * List of URL schemes supported by the provider. + * @param string[] $formats + * List of supported formats. Can be "json", "xml" or both. + * @param bool $supports_discovery + * Whether the provider supports oEmbed discovery. + * + * @throws \InvalidArgumentException + * If the endpoint URL is empty. + */ + public function __construct($url, Provider $provider, array $schemes = [], array $formats = [], $supports_discovery = FALSE) { + $this->provider = $provider; + $this->schemes = array_map('mb_strtolower', $schemes); + + $this->formats = $formats = array_map('mb_strtolower', $formats); + // Assert that only the supported formats are present. + assert(array_diff($formats, ['json', 'xml']) == []); + + // Use the first provided format to build the endpoint URL. If no formats + // are provided, default to JSON. + $this->url = str_replace('{format}', reset($this->formats) ?: 'json', $url); + + if (!UrlHelper::isValid($this->url, TRUE) || !UrlHelper::isExternal($this->url)) { + throw new \InvalidArgumentException('oEmbed endpoint must have a valid external URL'); + } + + $this->supportsDiscovery = (bool) $supports_discovery; + } + + /** + * Returns the endpoint URL. + * + * The URL will be built with the first available format. If the endpoint + * does not provide any formats, JSON will be used. + * + * @return string + * The endpoint URL. + */ + public function getUrl() { + return $this->url; + } + + /** + * Returns the provider this endpoint belongs to. + * + * @return \Drupal\media\OEmbed\Provider + * The provider object. + */ + public function getProvider() { + return $this->provider; + } + + /** + * Returns list of URL schemes supported by the provider. + * + * @return string[] + * List of schemes. + */ + public function getSchemes() { + return $this->schemes; + } + + /** + * Returns list of supported formats. + * + * @return string[] + * List of formats. + */ + public function getFormats() { + return $this->formats; + } + + /** + * Returns whether the provider supports oEmbed discovery. + * + * @return bool + * Returns TRUE if the provides discovery, otherwise FALSE. + */ + public function supportsDiscovery() { + return $this->supportsDiscovery; + } + + /** + * Tries to match a URL against the endpoint schemes. + * + * @param string $url + * Media item URL. + * + * @return bool + * TRUE if the URL matches against the endpoint schemes, otherwise FALSE. + */ + public function matchUrl($url) { + foreach ($this->getSchemes() as $scheme) { + // Convert scheme into a valid regular expression. + $regexp = str_replace(['.', '*'], ['\.', '.*'], $scheme); + if (preg_match("|^$regexp$|", $url)) { + return TRUE; + } + } + return FALSE; + } + + /** + * Builds and returns the endpoint URL. + * + * @param string $url + * The canonical media URL. + * + * @return string + * URL of the oEmbed endpoint. + */ + public function buildResourceUrl($url) { + $query = ['url' => $url]; + return $this->getUrl() . '?' . UrlHelper::buildQuery($query); + } + +}