You are here

function oembed_default_callback in oEmbed 7.0

Same name and namespace in other branches
  1. 8 plugins/providers/default.inc \oembed_default_callback()
  2. 7 plugins/providers/default.inc \oembed_default_callback()

Default provider callback makes HTTP requests using drupal_http_request().

1 string reference to 'oembed_default_callback'
default.inc in plugins/providers/default.inc

File

plugins/providers/default.inc, line 56

Code

function oembed_default_callback($plugin, $url, $matches, $parameters) {
  $embed = FALSE;

  // Remote oEmbed endpoint request.
  $parameters['url'] = $url;
  $query = http_build_query($parameters, NULL, '&');
  $fetch_url = $plugin['endpoint'] . '?' . $query;

  //TODO: Add alternative ways of fetching the content - like http client?
  $response = drupal_http_request($fetch_url);
  if (!isset($response->error)) {

    // JSON or XML data might be returned, so be agnostic about decoding it.
    $embed = json_decode($response->data, TRUE);
    if (!is_array($embed)) {
      try {
        $xml = @new SimpleXMLElement($response->data);
        $embed = array();
        foreach ($xml as $key => $value) {
          $embed[$key] = (string) $value;
        }
      } catch (Exception $e) {
        watchdog('oembed', 'Could not parse response from %url.', array(
          '%url' => $fetch_url,
        ), WATCHDOG_ERROR);
      }
    }
    if (empty($embed['version']) || empty($embed['type']) || intval($embed['version']) != 1) {
      $embed = FALSE;
    }
    if ($embed && !isset($embed['title'])) {
      $embed['title'] = '';
    }
    if (!$embed) {
      watchdog('oembed', 'Response from %url not a valid oEmbed response.', array(
        '%url' => $fetch_url,
      ), WATCHDOG_ERROR);
    }
  }
  else {
    watchdog('oembed', 'Error fetching data from %url.', array(
      '%url' => $fetch_url,
    ), WATCHDOG_ERROR);
  }
  return $embed;
}