function DefaultFetcher::fetch

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

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 (RequestException $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;
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.