function DefaultFetcher::fetch
Same name in other branches
- 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\fetcherCode
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.