You are here

public function DefaultFetcher::fetch in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/aggregator/src/Plugin/aggregator/fetcher/DefaultFetcher.php \Drupal\aggregator\Plugin\aggregator\fetcher\DefaultFetcher::fetch()

Downloads feed data.

Parameters

\Drupal\aggregator\FeedInterface $feed: A feed object representing the resource to be downloaded. $feed->getUrl() contains the link to the feed. Download the data at the URL and expose it to other modules by attaching it to $feed->source_string.

Return value

bool TRUE if fetching was successful, FALSE otherwise.

Overrides FetcherInterface::fetch

1 call to DefaultFetcher::fetch()
TestFetcher::fetch in core/modules/aggregator/tests/modules/aggregator_test/src/Plugin/aggregator/fetcher/TestFetcher.php
Downloads feed data.
1 method overrides DefaultFetcher::fetch()
TestFetcher::fetch in core/modules/aggregator/tests/modules/aggregator_test/src/Plugin/aggregator/fetcher/TestFetcher.php
Downloads feed data.

File

core/modules/aggregator/src/Plugin/aggregator/fetcher/DefaultFetcher.php, line 83

Class

DefaultFetcher
Defines a default fetcher implementation.

Namespace

Drupal\aggregator\Plugin\aggregator\fetcher

Code

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 (TransferException $e) {
    $this->logger
      ->warning('The feed from %site seems to be broken because of error "%error".', [
      '%site' => $feed
        ->label(),
      '%error' => $e
        ->getMessage(),
    ]);
    $this->messenger
      ->addWarning(t('The feed from %site seems to be broken because of error "%error".', [
      '%site' => $feed
        ->label(),
      '%error' => $e
        ->getMessage(),
    ]));
    return FALSE;
  }
}