summaryrefslogtreecommitdiffstats
path: root/lib/Fetcher/FeedFetcher.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Fetcher/FeedFetcher.php')
-rw-r--r--lib/Fetcher/FeedFetcher.php190
1 files changed, 104 insertions, 86 deletions
diff --git a/lib/Fetcher/FeedFetcher.php b/lib/Fetcher/FeedFetcher.php
index 9a2e67445..65a4b5526 100644
--- a/lib/Fetcher/FeedFetcher.php
+++ b/lib/Fetcher/FeedFetcher.php
@@ -47,7 +47,8 @@ class FeedFetcher implements IFeedFetcher
private $time;
private $clientService;
- public function __construct(Reader $reader,
+ public function __construct(
+ Reader $reader,
PicoFeedFaviconFactory $faviconFactory,
IL10N $l10n,
Time $time,
@@ -64,7 +65,7 @@ class FeedFetcher implements IFeedFetcher
/**
* This fetcher handles all the remaining urls therefore always returns true
*/
- public function canHandle($url)
+ public function canHandle($url)
{
return true;
}
@@ -73,35 +74,35 @@ class FeedFetcher implements IFeedFetcher
/**
* Fetch a feed from remote
*
- * @param string $url remote url of the feed
- * @param boolean $getFavicon if the favicon should also be fetched,
- * defaults to true
- * @param string $lastModified a last modified value from an http header
- * defaults to false. If lastModified
- * matches the http header from the feed no
- * results are fetched
- * @param string $etag an etag from an http header.
- * If lastModified matches the
- * http header from the feed no
- * results are fetched
- * @param bool fullTextEnabled if true tells the fetcher to enhance the
- * articles by fetching custom enhanced content
- * @param string $basicAuthUser if given, basic auth is set for this feed
- * @param string $basicAuthPassword if given, basic auth is set for this
- * feed. Ignored if user is null or an
- * empty string
+ * @param string $url remote url of the feed
+ * @param boolean $getFavicon if the favicon should also be fetched, defaults to true
+ * @param string $lastModified a last modified value from an http header defaults to false.
+ * If lastModified matches the http header from the feed no results are fetched
+ * @param string $etag an etag from an http header.
+ * If lastModified matches the http header from the feed no results are fetched
+ * @param bool $fullTextEnabled if true tells the fetcher to enhance the articles by fetching more content
+ * @param string $basicAuthUser if given, basic auth is set for this feed
+ * @param string $basicAuthPassword if given, basic auth is set for this feed. Ignored if user is empty
+ *
* @throws FetcherException if it fails
* @return array an array containing the new feed and its items, first
* element being the Feed and second element being an array of Items
*/
- public function fetch($url, $getFavicon = true, $lastModified = null,
- $etag = null, $fullTextEnabled = false,
- $basicAuthUser = null, $basicAuthPassword = null
+ public function fetch(
+ $url,
+ $getFavicon = true,
+ $lastModified = null,
+ $etag = null,
+ $fullTextEnabled = false,
+ $basicAuthUser = null,
+ $basicAuthPassword = null
) {
try {
if ($basicAuthUser !== null && trim($basicAuthUser) !== '') {
$resource = $this->reader->discover(
- $url, $lastModified, $etag,
+ $url,
+ $lastModified,
+ $etag,
$basicAuthUser,
$basicAuthPassword
);
@@ -123,13 +124,24 @@ class FeedFetcher implements IFeedFetcher
if ($fullTextEnabled) {
$parser->enableContentGrabber();
- $parser->getItemPostProcessor()->register(new LWNProcessor($basicAuthUser, $basicAuthPassword, $this->clientService));
+ $parser->getItemPostProcessor()->register(
+ new LWNProcessor(
+ $basicAuthUser,
+ $basicAuthPassword,
+ $this->clientService
+ )
+ );
}
$parsedFeed = $parser->execute();
$feed = $this->buildFeed(
- $parsedFeed, $url, $getFavicon, $lastModified, $etag, $location
+ $parsedFeed,
+ $url,
+ $getFavicon,
+ $lastModified,
+ $etag,
+ $location
);
$items = [];
@@ -138,114 +150,115 @@ class FeedFetcher implements IFeedFetcher
}
return [$feed, $items];
-
} catch (Exception $ex) {
$this->handleError($ex, $url);
}
-
}
- private function handleError(Exception $ex, $url)
+ private function handleError(Exception $ex, $url)
{
$msg = $ex->getMessage();
if ($ex instanceof MalFormedXmlException) {
$msg = $this->l10n->t('Feed contains invalid XML');
- } else if ($ex instanceof SubscriptionNotFoundException) {
+ } elseif ($ex instanceof SubscriptionNotFoundException) {
$msg = $this->l10n->t(
'Feed not found: Either the website ' .
'does not provide a feed or blocks access. To rule out ' .
'blocking, try to download the feed on your server\'s ' .
'command line using curl: curl ' . $url
);
- } else if ($ex instanceof UnsupportedFeedFormatException) {
+ } elseif ($ex instanceof UnsupportedFeedFormatException) {
$msg = $this->l10n->t('Detected feed format is not supported');
- } else if ($ex instanceof InvalidCertificateException) {
+ } elseif ($ex instanceof InvalidCertificateException) {
$msg = $this->buildCurlSslErrorMessage($ex->getCode());
- } else if ($ex instanceof InvalidUrlException) {
+ } elseif ($ex instanceof InvalidUrlException) {
$msg = $this->l10n->t('Website not found');
- } else if ($ex instanceof MaxRedirectException) {
+ } elseif ($ex instanceof MaxRedirectException) {
$msg = $this->l10n->t('More redirects than allowed, aborting');
- } else if ($ex instanceof MaxSizeException) {
+ } elseif ($ex instanceof MaxSizeException) {
$msg = $this->l10n->t('Bigger than maximum allowed size');
- } else if ($ex instanceof TimeoutException) {
+ } elseif ($ex instanceof TimeoutException) {
$msg = $this->l10n->t('Request timed out');
- } else if ($ex instanceof UnauthorizedException) {
+ } elseif ($ex instanceof UnauthorizedException) {
$msg = $this->l10n->t(
'Required credentials for feed were ' .
'either missing or incorrect'
);
- } else if ($ex instanceof ForbiddenException) {
+ } elseif ($ex instanceof ForbiddenException) {
$msg = $this->l10n->t('Forbidden to access feed');
}
throw new FetcherException($msg);
}
- private function buildCurlSslErrorMessage($errorCode)
+ private function buildCurlSslErrorMessage($errorCode)
{
switch ($errorCode) {
- case 35: // CURLE_SSL_CONNECT_ERROR
- return $this->l10n->t(
- 'Certificate error: A problem occurred ' .
+ case 35: // CURLE_SSL_CONNECT_ERROR
+ return $this->l10n->t(
+ 'Certificate error: A problem occurred ' .
'somewhere in the SSL/TLS handshake. Could be ' .
'certificates (file formats, paths, permissions), ' .
'passwords, and others.'
- );
- case 51: // CURLE_PEER_FAILED_VERIFICATION
- return $this->l10n->t(
- 'Certificate error: The remote server\'s SSL ' .
+ );
+ case 51: // CURLE_PEER_FAILED_VERIFICATION
+ return $this->l10n->t(
+ 'Certificate error: The remote server\'s SSL ' .
'certificate or SSH md5 fingerprint was deemed not OK.'
- );
- case 58: // CURLE_SSL_CERTPROBLEM
- return $this->l10n->t(
- 'Certificate error: Problem with the local client ' .
+ );
+ case 58: // CURLE_SSL_CERTPROBLEM
+ return $this->l10n->t(
+ 'Certificate error: Problem with the local client ' .
'certificate.'
- );
- case 59: // CURLE_SSL_CIPHER
- return $this->l10n->t(
- 'Certificate error: Couldn\'t use specified cipher.'
- );
- case 60: // CURLE_SSL_CACERT
- return $this->l10n->t(
- 'Certificate error: Peer certificate cannot be ' .
+ );
+ case 59: // CURLE_SSL_CIPHER
+ return $this->l10n->t(
+ 'Certificate error: Couldn\'t use specified cipher.'
+ );
+ case 60: // CURLE_SSL_CACERT
+ return $this->l10n->t(
+ 'Certificate error: Peer certificate cannot be ' .
'authenticated with known CA certificates.'
- );
- case 64: // CURLE_USE_SSL_FAILED
- return $this->l10n->t(
- 'Certificate error: Requested FTP SSL level failed.'
- );
- case 66: // CURLE_SSL_ENGINE_INITFAILED
- return $this->l10n->t(
- 'Certificate error: Initiating the SSL engine failed.'
- );
- case 77: // CURLE_SSL_CACERT_BADFILE
- return $this->l10n->t(
- 'Certificate error: Problem with reading the SSL CA ' .
+ );
+ case 64: // CURLE_USE_SSL_FAILED
+ return $this->l10n->t(
+ 'Certificate error: Requested FTP SSL level failed.'
+ );
+ case 66: // CURLE_SSL_ENGINE_INITFAILED
+ return $this->l10n->t(
+ 'Certificate error: Initiating the SSL engine failed.'
+ );
+ case 77: // CURLE_SSL_CACERT_BADFILE
+ return $this->l10n->t(
+ 'Certificate error: Problem with reading the SSL CA ' .
'cert (path? access rights?)'
- );
- case 83: // CURLE_SSL_ISSUER_ERROR
- return $this->l10n->t(
- 'Certificate error: Issuer check failed'
- );
- default:
- return $this->l10n->t('Unknown SSL certificate error!');
+ );
+ case 83: // CURLE_SSL_ISSUER_ERROR
+ return $this->l10n->t(
+ 'Certificate error: Issuer check failed'
+ );
+ default:
+ return $this->l10n->t('Unknown SSL certificate error!');
}
}
- private function decodeTwice($string)
+ private function decodeTwice($string)
{
return html_entity_decode(
html_entity_decode(
- $string, ENT_QUOTES | ENT_HTML5, 'UTF-8'
+ $string,
+ ENT_QUOTES | ENT_HTML5,
+ 'UTF-8'
),
- ENT_QUOTES | ENT_HTML5, 'UTF-8'
+ ENT_QUOTES | ENT_HTML5,
+ 'UTF-8'
);
}
- protected function determineRtl($parsedItem, $parsedFeed)
+ protected function determineRtl($parsedItem, $parsedFeed)
{
$itemLang = $parsedItem->getLanguage();
$feedLang = $parsedFeed->getLanguage();
@@ -258,7 +271,7 @@ class FeedFetcher implements IFeedFetcher
}
- protected function buildItem($parsedItem, $parsedFeed)
+ protected function buildItem($parsedItem, $parsedFeed)
{
$item = new Item();
$item->setUnread(true);
@@ -276,7 +289,8 @@ class FeedFetcher implements IFeedFetcher
// purification is done in the service layer
$body = $parsedItem->getContent();
$body = mb_convert_encoding(
- $body, 'HTML-ENTITIES',
+ $body,
+ 'HTML-ENTITIES',
mb_detect_encoding($body)
);
$item->setBody($body);
@@ -284,7 +298,7 @@ class FeedFetcher implements IFeedFetcher
$enclosureUrl = $parsedItem->getEnclosureUrl();
if ($enclosureUrl) {
$enclosureType = $parsedItem->getEnclosureType();
- if (stripos($enclosureType, 'audio/') !== false
+ if (stripos($enclosureType, 'audio/') !== false
|| stripos($enclosureType, 'video/') !== false
) {
$item->setEnclosureMime($enclosureType);
@@ -298,8 +312,13 @@ class FeedFetcher implements IFeedFetcher
}
- protected function buildFeed($parsedFeed, $url, $getFavicon, $modified,
- $etag, $location
+ protected function buildFeed(
+ $parsedFeed,
+ $url,
+ $getFavicon,
+ $modified,
+ $etag,
+ $location
) {
$feed = new Feed();
@@ -327,5 +346,4 @@ class FeedFetcher implements IFeedFetcher
return $feed;
}
-
}