"Fossies" - the Fresh Open Source Software Archive

Member "drupal-8.9.10/core/modules/media/src/OEmbed/Endpoint.php" (26 Nov 2020, 4564 Bytes) of package /linux/www/drupal-8.9.10.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) PHP source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "Endpoint.php" see the Fossies "Dox" file reference documentation and the last Fossies "Diffs" side-by-side code changes report: 9.0.6_vs_9.0.7.

    1 <?php
    2 
    3 namespace Drupal\media\OEmbed;
    4 
    5 use Drupal\Component\Utility\UrlHelper;
    6 
    7 /**
    8  * Value object for oEmbed provider endpoints.
    9  *
   10  * @internal
   11  *   This class is an internal part of the oEmbed system and should only be
   12  *   instantiated by instances of Drupal\media\OEmbed\Provider.
   13  */
   14 class Endpoint {
   15 
   16   /**
   17    * The endpoint's URL.
   18    *
   19    * @var string
   20    */
   21   protected $url;
   22 
   23   /**
   24    * The provider this endpoint belongs to.
   25    *
   26    * @var \Drupal\media\OEmbed\Provider
   27    */
   28   protected $provider;
   29 
   30   /**
   31    * List of URL schemes supported by the provider.
   32    *
   33    * @var string[]
   34    */
   35   protected $schemes;
   36 
   37   /**
   38    * List of supported formats. Only 'json' and 'xml' are allowed.
   39    *
   40    * @var string[]
   41    *
   42    * @see https://oembed.com/#section2
   43    */
   44   protected $formats;
   45 
   46   /**
   47    * Whether the provider supports oEmbed discovery.
   48    *
   49    * @var bool
   50    */
   51   protected $supportsDiscovery;
   52 
   53   /**
   54    * Endpoint constructor.
   55    *
   56    * @param string $url
   57    *   The endpoint URL. May contain a @code '{format}' @endcode placeholder.
   58    * @param \Drupal\media\OEmbed\Provider $provider
   59    *   The provider this endpoint belongs to.
   60    * @param string[] $schemes
   61    *   List of URL schemes supported by the provider.
   62    * @param string[] $formats
   63    *   List of supported formats. Can be "json", "xml" or both.
   64    * @param bool $supports_discovery
   65    *   Whether the provider supports oEmbed discovery.
   66    *
   67    * @throws \InvalidArgumentException
   68    *   If the endpoint URL is empty.
   69    */
   70   public function __construct($url, Provider $provider, array $schemes = [], array $formats = [], $supports_discovery = FALSE) {
   71     $this->provider = $provider;
   72     $this->schemes = array_map('mb_strtolower', $schemes);
   73 
   74     $this->formats = $formats = array_map('mb_strtolower', $formats);
   75     // Assert that only the supported formats are present.
   76     assert(array_diff($formats, ['json', 'xml']) == []);
   77 
   78     // Use the first provided format to build the endpoint URL. If no formats
   79     // are provided, default to JSON.
   80     $this->url = str_replace('{format}', reset($this->formats) ?: 'json', $url);
   81 
   82     if (!UrlHelper::isValid($this->url, TRUE) || !UrlHelper::isExternal($this->url)) {
   83       throw new \InvalidArgumentException('oEmbed endpoint must have a valid external URL');
   84     }
   85 
   86     $this->supportsDiscovery = (bool) $supports_discovery;
   87   }
   88 
   89   /**
   90    * Returns the endpoint URL.
   91    *
   92    * The URL will be built with the first available format. If the endpoint
   93    * does not provide any formats, JSON will be used.
   94    *
   95    * @return string
   96    *   The endpoint URL.
   97    */
   98   public function getUrl() {
   99     return $this->url;
  100   }
  101 
  102   /**
  103    * Returns the provider this endpoint belongs to.
  104    *
  105    * @return \Drupal\media\OEmbed\Provider
  106    *   The provider object.
  107    */
  108   public function getProvider() {
  109     return $this->provider;
  110   }
  111 
  112   /**
  113    * Returns list of URL schemes supported by the provider.
  114    *
  115    * @return string[]
  116    *   List of schemes.
  117    */
  118   public function getSchemes() {
  119     return $this->schemes;
  120   }
  121 
  122   /**
  123    * Returns list of supported formats.
  124    *
  125    * @return string[]
  126    *   List of formats.
  127    */
  128   public function getFormats() {
  129     return $this->formats;
  130   }
  131 
  132   /**
  133    * Returns whether the provider supports oEmbed discovery.
  134    *
  135    * @return bool
  136    *   Returns TRUE if the provides discovery, otherwise FALSE.
  137    */
  138   public function supportsDiscovery() {
  139     return $this->supportsDiscovery;
  140   }
  141 
  142   /**
  143    * Tries to match a URL against the endpoint schemes.
  144    *
  145    * @param string $url
  146    *   Media item URL.
  147    *
  148    * @return bool
  149    *   TRUE if the URL matches against the endpoint schemes, otherwise FALSE.
  150    */
  151   public function matchUrl($url) {
  152     foreach ($this->getSchemes() as $scheme) {
  153       // Convert scheme into a valid regular expression.
  154       $regexp = str_replace(['.', '*'], ['\.', '.*'], $scheme);
  155       if (preg_match("|^$regexp$|", $url)) {
  156         return TRUE;
  157       }
  158     }
  159     return FALSE;
  160   }
  161 
  162   /**
  163    * Builds and returns the endpoint URL.
  164    *
  165    * In most situations this function should not be used. Your are probably
  166    * looking for \Drupal\media\OEmbed\UrlResolver::getResourceUrl(), because it
  167    * is alterable and also cached.
  168    *
  169    * @param string $url
  170    *   The canonical media URL.
  171    *
  172    * @return string
  173    *   URL of the oEmbed endpoint.
  174    *
  175    * @see \Drupal\media\OEmbed\UrlResolver::getResourceUrl()
  176    */
  177   public function buildResourceUrl($url) {
  178     $query = ['url' => $url];
  179     return $this->getUrl() . '?' . UrlHelper::buildQuery($query);
  180   }
  181 
  182 }