Example #1
0
 /**
  * {@inheritdoc}
  */
 public function fetch(FeedInterface $feed)
 {
     $request = $this->httpClient->createRequest('GET', $feed->getUrl());
     $feed->source_string = FALSE;
     // Generate conditional GET headers.
     if ($feed->getEtag()) {
         $request->addHeader('If-None-Match', $feed->getEtag());
     }
     if ($feed->getLastModified()) {
         $request->addHeader('If-Modified-Since', gmdate(DateTimePlus::RFC7231, $feed->getLastModified()));
     }
     try {
         $response = $this->httpClient->send($request);
         // In case of a 304 Not Modified, there is no new content, so return
         // FALSE.
         if ($response->getStatusCode() == 304) {
             return FALSE;
         }
         $feed->source_string = $response->getBody(TRUE);
         $feed->setEtag($response->getHeader('ETag'));
         $feed->setLastModified(strtotime($response->getHeader('Last-Modified')));
         $feed->http_headers = $response->getHeaders();
         // Update the feed URL in case of a 301 redirect.
         if ($response->getEffectiveUrl() != $feed->getUrl()) {
             $feed->setUrl($response->getEffectiveUrl());
         }
         return TRUE;
     } catch (RequestException $e) {
         watchdog('aggregator', 'The feed from %site seems to be broken because of error "%error".', array('%site' => $feed->label(), '%error' => $e->getMessage()), WATCHDOG_WARNING);
         drupal_set_message(t('The feed from %site seems to be broken because of error "%error".', array('%site' => $feed->label(), '%error' => $e->getMessage())), 'warning');
         return FALSE;
     }
 }
Example #2
0
 /**
  * {@inheritdoc}
  */
 public function fetch(FeedInterface $feed)
 {
     if ($feed->label() == 'Do not fetch') {
         return FALSE;
     }
     return parent::fetch($feed);
 }
 /**
  * {@inheritdoc}
  */
 public function getFeedDuplicates(FeedInterface $feed)
 {
     $query = \Drupal::entityQuery('aggregator_feed');
     $or_condition = $query->orConditionGroup()->condition('title', $feed->label())->condition('url', $feed->getUrl());
     $query->condition($or_condition);
     if ($feed->id()) {
         $query->condition('fid', $feed->id(), '<>');
     }
     return $this->loadMultiple($query->execute());
 }
Example #4
0
 /**
  * {@inheritdoc}
  */
 public function parse(FeedInterface $feed)
 {
     // Set our bridge extension manager to Zend Feed.
     Reader::setExtensionManager(\Drupal::service('feed.bridge.reader'));
     try {
         $channel = Reader::importString($feed->source_string);
     } catch (ExceptionInterface $e) {
         watchdog_exception('aggregator', $e);
         drupal_set_message(t('The feed from %site seems to be broken because of error "%error".', array('%site' => $feed->label(), '%error' => $e->getMessage())), 'error');
         return FALSE;
     }
     $feed->setWebsiteUrl($channel->getLink());
     $feed->setDescription($channel->getDescription());
     if ($image = $channel->getImage()) {
         $feed->setImage($image['uri']);
     }
     // Initialize items array.
     $feed->items = array();
     foreach ($channel as $item) {
         // Reset the parsed item.
         $parsed_item = array();
         // Move the values to an array as expected by processors.
         $parsed_item['title'] = $item->getTitle();
         $parsed_item['guid'] = $item->getId();
         $parsed_item['link'] = $item->getLink();
         $parsed_item['description'] = $item->getDescription();
         $parsed_item['author'] = '';
         if ($author = $item->getAuthor()) {
             $parsed_item['author'] = $author['name'];
         }
         $parsed_item['timestamp'] = '';
         if ($date = $item->getDateModified()) {
             $parsed_item['timestamp'] = $date->getTimestamp();
         }
         // Store on $feed object. This is where processors will look for parsed items.
         $feed->items[] = $parsed_item;
     }
     return TRUE;
 }
 /**
  * {@inheritdoc}
  */
 public function delete(FeedInterface $feed)
 {
     if ($items = $this->itemStorage->loadByFeed($feed->id())) {
         $this->itemStorage->delete($items);
     }
     // @todo This should be moved out to caller with a different message maybe.
     drupal_set_message(t('The news items from %site have been deleted.', array('%site' => $feed->label())));
 }
 /**
  * Confirms an item removal from a feed.
  *
  * @param \Drupal\aggregator\FeedInterface $feed
  *   Feed object representing the feed.
  */
 public function deleteFeedItems(FeedInterface $feed)
 {
     $this->drupalPostForm('admin/config/services/aggregator/delete/' . $feed->id(), array(), t('Delete items'));
     $this->assertRaw(t('The news items from %title have been deleted.', array('%title' => $feed->label())), 'Feed items deleted.');
 }
Example #7
0
 /**
  * Route title callback.
  *
  * @param \Drupal\aggregator\FeedInterface $aggregator_feed
  *   The aggregator feed.
  *
  * @return string
  *   The feed label.
  */
 public function feedTitle(FeedInterface $aggregator_feed)
 {
     return Xss::filter($aggregator_feed->label());
 }
Example #8
0
 /**
  * {@inheritdoc}
  */
 public function fetch(FeedInterface $feed)
 {
     $request = new Request('GET', $feed->getUrl());
     $feed->source_string = FALSE;
     // Generate conditional GET headers.
     if ($feed->getEtag()) {
         $request = $request->withAddedHeader('If-None-Match', $feed->getEtag());
     }
     if ($feed->getLastModified()) {
         $request = $request->withAddedHeader('If-Modified-Since', gmdate(DateTimePlus::RFC7231, $feed->getLastModified()));
     }
     try {
         /** @var \Psr\Http\Message\UriInterface $actual_uri */
         $actual_uri = NULL;
         $response = $this->httpClientFactory->fromOptions(['allow_redirects' => ['on_redirect' => function (RequestInterface $request, ResponseInterface $response, UriInterface $uri) use(&$actual_uri) {
             $actual_uri = (string) $uri;
         }]])->send($request);
         // In case of a 304 Not Modified, there is no new content, so return
         // FALSE.
         if ($response->getStatusCode() == 304) {
             return FALSE;
         }
         $feed->source_string = (string) $response->getBody();
         if ($response->hasHeader('ETag')) {
             $feed->setEtag($response->getHeaderLine('ETag'));
         }
         if ($response->hasHeader('Last-Modified')) {
             $feed->setLastModified(strtotime($response->getHeaderLine('Last-Modified')));
         }
         $feed->http_headers = $response->getHeaders();
         // Update the feed URL in case of a 301 redirect.
         if ($actual_uri && $actual_uri !== $feed->getUrl()) {
             $feed->setUrl($actual_uri);
         }
         return TRUE;
     } catch (RequestException $e) {
         $this->logger->warning('The feed from %site seems to be broken because of error "%error".', array('%site' => $feed->label(), '%error' => $e->getMessage()));
         drupal_set_message(t('The feed from %site seems to be broken because of error "%error".', array('%site' => $feed->label(), '%error' => $e->getMessage())), 'warning');
         return FALSE;
     }
 }
 /**
  * Route title callback.
  *
  * @param \Drupal\aggregator\FeedInterface $aggregator_feed
  *   The aggregator feed.
  *
  * @return array
  *   The feed label as a render array.
  */
 public function feedTitle(FeedInterface $aggregator_feed)
 {
     return ['#markup' => $aggregator_feed->label(), '#allowed_tags' => Xss::getHtmlTagList()];
 }
Example #10
0
 /**
  * Route title callback.
  *
  * @param \Drupal\aggregator\FeedInterface $aggregator_feed
  *   The aggregator feed.
  *
  * @return string
  *   The feed label.
  */
 public function feedTitle(FeedInterface $aggregator_feed)
 {
     return SafeMarkup::xssFilter($aggregator_feed->label());
 }