DefaultFetcher.php in Zircon Profile 8
File
core/modules/aggregator/src/Plugin/aggregator/fetcher/DefaultFetcher.php
View source
<?php
namespace Drupal\aggregator\Plugin\aggregator\fetcher;
use Drupal\aggregator\Plugin\FetcherInterface;
use Drupal\aggregator\FeedInterface;
use Drupal\Component\Datetime\DateTimePlus;
use Drupal\Core\Http\ClientFactory;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Psr7\Request;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class DefaultFetcher implements FetcherInterface, ContainerFactoryPluginInterface {
protected $httpClientFactory;
protected $logger;
public function __construct(ClientFactory $http_client_factory, LoggerInterface $logger) {
$this->httpClientFactory = $http_client_factory;
$this->logger = $logger;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($container
->get('http_client_factory'), $container
->get('logger.factory')
->get('aggregator'));
}
public function fetch(FeedInterface $feed) {
$request = new Request('GET', $feed
->getUrl());
$feed->source_string = FALSE;
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 {
$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);
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();
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;
}
}
}