You are here

function views_json_query_plugin_query_json::fetch_file in Views JSON Query 7

Fetch file.

1 call to views_json_query_plugin_query_json::fetch_file()
views_json_query_plugin_query_json::execute in ./views_json_query_plugin_query_json.inc
Execute.

File

./views_json_query_plugin_query_json.inc, line 78
Query plugin for views_json_query.

Class

views_json_query_plugin_query_json
@file Query plugin for views_json_query.

Code

function fetch_file($uri) {
  $parsed = parse_url($uri);

  // Check for local file.
  if (empty($parsed['host'])) {
    if (!file_exists($uri)) {
      throw new Exception(t('Local file not found.'));
    }
    return file_get_contents($uri);
  }
  $destination = 'public://views_json_query';
  if (!file_prepare_directory($destination, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS)) {
    throw new Exception(t('Files directory either cannot be created or is not writable.'));
  }
  $headers = array();
  $cache_file = 'views_json_query_' . md5($uri);
  if ($cache = cache_get($cache_file)) {
    $last_headers = $cache->data;
    if (!empty($last_headers['etag'])) {
      $headers['If-None-Match'] = $last_headers['etag'];
    }
    if (!empty($last_headers['last-modified'])) {
      $headers['If-Modified-Since'] = $last_headers['last-modified'];
    }
  }

  // Rebuild the JSON file URL.
  $request_options = array(
    'headers' => $headers,
  );
  $request_context_options = array();
  if (parse_url($uri, PHP_URL_SCHEME) == 'https') {
    foreach ($this->options as $option => $value) {
      if (strpos($option, 'ssl_') === 0 && $value) {
        $request_context_options['ssl'][substr($option, 4)] = $value;
      }
    }
  }
  if ($request_context_options) {
    $request_options['context'] = stream_context_create($request_context_options);
  }
  $result = drupal_http_request($uri, $request_options);
  if (isset($result->error)) {
    $args = array(
      '%error' => $result->error,
      '%uri' => $uri,
    );
    $message = t('HTTP response: %error. URI: %uri', $args);
    throw new Exception($message);
  }
  $cache_file_uri = "{$destination}/{$cache_file}";
  if ($result->code == 304) {
    if (file_exists($cache_file_uri)) {
      return file_get_contents($cache_file_uri);
    }

    // We have the headers but no cache file. :(
    // Run it back.
    cache_clear_all($cache_file, 'cache');
    return $this
      ->fetch_file($uri);
  }

  // As learned from Feeds caching mechanism, save to file.
  file_unmanaged_save_data($result->data, $cache_file_uri, FILE_EXISTS_REPLACE);
  cache_set($cache_file, $result->headers);
  return $result->data;
}