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()
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;
}