diff options
Diffstat (limited to 'modules/aggregator/aggregator.fetcher.inc')
-rw-r--r-- | modules/aggregator/aggregator.fetcher.inc | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/modules/aggregator/aggregator.fetcher.inc b/modules/aggregator/aggregator.fetcher.inc new file mode 100644 index 000000000..13baadba1 --- /dev/null +++ b/modules/aggregator/aggregator.fetcher.inc @@ -0,0 +1,80 @@ +<?php +// $Id$ + +/** + * @file + * Fetcher functions for the aggregator module. + */ + +/** + * Implementation of hook_aggregator_fetch_info(). + */ +function aggregator_aggregator_fetch_info() { + return array( + 'title' => t('Default fetcher'), + 'description' => t('Downloads data from a URL using Drupal\'s HTTP request handler.'), + ); +} + +/** + * Implementation of hook_aggregator_fetch(). + */ +function aggregator_aggregator_fetch($feed) { + $feed->source_string = FALSE; + + // Generate conditional GET headers. + $headers = array(); + if ($feed->etag) { + $headers['If-None-Match'] = $feed->etag; + } + if ($feed->modified) { + $headers['If-Modified-Since'] = gmdate('D, d M Y H:i:s', $feed->modified) . ' GMT'; + } + + // Request feed. + $result = drupal_http_request($feed->url, $headers); + + // Process HTTP response code. + switch ($result->code) { + case 304: + db_update('aggregator_feed') + ->fields(array('checked' => REQUEST_TIME)) + ->condition('fid', $feed->fid) + ->execute(); + drupal_set_message(t('There is no new syndicated content from %site.', array('%site' => $feed->title))); + break; + case 301: + $feed->url = $result->redirect_url; + $feed->redirected = TRUE; + // Do not break here. + case 200: + case 302: + case 307: + // We store the md5 hash of feed data in the database. When refreshing a + // feed we compare stored hash and new hash calculated from downloaded + // data. If both are equal we say that feed is not updated. + if (!isset($result->data)) { + $result->data = ''; + } + if (!isset($result->headers)) { + $result->headers = array(); + } + $md5 = md5($result->data); + if ($feed->hash == $md5) { + db_update('aggregator_feed') + ->condition('fid', $feed->fid) + ->fields(array('checked' => REQUEST_TIME)) + ->execute(); + drupal_set_message(t('There is no new syndicated content from %site.', array('%site' => $feed->title))); + break; + } + + $feed->source_string = $result->data; + $feed->http_headers = $result->headers; + break; + default: + watchdog('aggregator', 'The feed from %site seems to be broken, due to "%error".', array('%site' => $feed->title, '%error' => $result->code . ' ' . $result->error), WATCHDOG_WARNING); + drupal_set_message(t('The feed from %site seems to be broken, because of error "%error".', array('%site' => $feed->title, '%error' => $result->code . ' ' . $result->error))); + module_invoke('system', 'check_http_request'); + } +} |