Updated to Drupal 8.6.4, which is PHP 7.3 friendly. Also updated HTMLaw library....
[yaffs-website] / web / core / modules / media / src / OEmbed / ProviderRepository.php
1 <?php
2
3 namespace Drupal\media\OEmbed;
4
5 use Drupal\Component\Datetime\TimeInterface;
6 use Drupal\Component\Serialization\Json;
7 use Drupal\Core\Cache\CacheBackendInterface;
8 use Drupal\Core\Cache\UseCacheBackendTrait;
9 use Drupal\Core\Config\ConfigFactoryInterface;
10 use GuzzleHttp\ClientInterface;
11 use GuzzleHttp\Exception\RequestException;
12
13 /**
14  * Retrieves and caches information about oEmbed providers.
15  */
16 class ProviderRepository implements ProviderRepositoryInterface {
17
18   use UseCacheBackendTrait;
19
20   /**
21    * How long the provider data should be cached, in seconds.
22    *
23    * @var int
24    */
25   protected $maxAge;
26
27   /**
28    * The HTTP client.
29    *
30    * @var \GuzzleHttp\Client
31    */
32   protected $httpClient;
33
34   /**
35    * URL of a JSON document which contains a database of oEmbed providers.
36    *
37    * @var string
38    */
39   protected $providersUrl;
40
41   /**
42    * The time service.
43    *
44    * @var \Drupal\Component\Datetime\TimeInterface
45    */
46   protected $time;
47
48   /**
49    * Constructs a ProviderRepository instance.
50    *
51    * @param \GuzzleHttp\ClientInterface $http_client
52    *   The HTTP client.
53    * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
54    *   The config factory service.
55    * @param \Drupal\Component\Datetime\TimeInterface $time
56    *   The time service.
57    * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
58    *   (optional) The cache backend.
59    * @param int $max_age
60    *   (optional) How long the cache data should be kept. Defaults to a week.
61    */
62   public function __construct(ClientInterface $http_client, ConfigFactoryInterface $config_factory, TimeInterface $time, CacheBackendInterface $cache_backend = NULL, $max_age = 604800) {
63     $this->httpClient = $http_client;
64     $this->providersUrl = $config_factory->get('media.settings')->get('oembed_providers_url');
65     $this->time = $time;
66     $this->cacheBackend = $cache_backend;
67     $this->maxAge = (int) $max_age;
68   }
69
70   /**
71    * {@inheritdoc}
72    */
73   public function getAll() {
74     $cache_id = 'media:oembed_providers';
75
76     $cached = $this->cacheGet($cache_id);
77     if ($cached) {
78       return $cached->data;
79     }
80
81     try {
82       $response = $this->httpClient->request('GET', $this->providersUrl);
83     }
84     catch (RequestException $e) {
85       throw new ProviderException("Could not retrieve the oEmbed provider database from $this->providersUrl", NULL, $e);
86     }
87
88     $providers = Json::decode((string) $response->getBody());
89
90     if (!is_array($providers) || empty($providers)) {
91       throw new ProviderException('Remote oEmbed providers database returned invalid or empty list.');
92     }
93
94     $keyed_providers = [];
95     foreach ($providers as $provider) {
96       try {
97         $name = (string) $provider['provider_name'];
98         $keyed_providers[$name] = new Provider($provider['provider_name'], $provider['provider_url'], $provider['endpoints']);
99       }
100       catch (ProviderException $e) {
101         // Just skip all the invalid providers.
102         // @todo Log the exception message to help with debugging.
103       }
104     }
105
106     $this->cacheSet($cache_id, $keyed_providers, $this->time->getCurrentTime() + $this->maxAge);
107     return $keyed_providers;
108   }
109
110   /**
111    * {@inheritdoc}
112    */
113   public function get($provider_name) {
114     $providers = $this->getAll();
115
116     if (!isset($providers[$provider_name])) {
117       throw new \InvalidArgumentException("Unknown provider '$provider_name'");
118     }
119     return $providers[$provider_name];
120   }
121
122 }