From fd3386fe20247ababa9de0b3fcf3e5bfa4bf2f0f Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 28 May 2024 05:20:53 +0000 Subject: [PATCH] Improved hostname handling with feeds --- src/Protocol/Feed.php | 47 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/src/Protocol/Feed.php b/src/Protocol/Feed.php index 4115c6f56e..a053ecc40d 100644 --- a/src/Protocol/Feed.php +++ b/src/Protocol/Feed.php @@ -373,19 +373,24 @@ class Feed } $guid = XML::getFirstNodeValue($xpath, 'guid/text()', $entry); + $host = self::getHostname($item, $guid, $basepath); if (!empty($guid)) { if (empty($item['uri'])) { $item['uri'] = $guid; } // Don't use the GUID value directly but instead use it as a basis for the GUID - $item['guid'] = Item::guidFromUri($guid, parse_url($item['plink'], PHP_URL_HOST)); + $item['guid'] = Item::guidFromUri($guid, $host); } if (empty($item['uri'])) { $item['uri'] = $item['plink']; } + if (!parse_url($item['uri'], PHP_URL_HOST)) { + $item['uri'] = 'feed::' . $host . ':' . $item['uri']; + } + $orig_plink = $item['plink']; if (!$dryRun) { @@ -565,8 +570,12 @@ class Feed Logger::info('Feed is too old', ['created' => $item['created'], 'uid' => $item['uid'], 'uri' => $item['uri']]); continue; } - - $fetch_further_information = $contact['fetch_further_information'] ?? LocalRelationship::FFI_NONE; + + if (!empty($item['plink'])) { + $fetch_further_information = $contact['fetch_further_information'] ?? LocalRelationship::FFI_NONE; + } else { + $fetch_further_information = LocalRelationship::FFI_NONE; + } $preview = ''; if (in_array($fetch_further_information, [LocalRelationship::FFI_INFORMATION, LocalRelationship::FFI_BOTH])) { @@ -753,6 +762,38 @@ class Feed return ['header' => $author, 'items' => $items]; } + /** + * Return the hostname out of a variety of provided URL + * + * @param array $item + * @param string|null $guid + * @param string|null $basepath + * @return string + */ + private static function getHostname(array $item, string $guid = null, string $basepath = null): string + { + $host = parse_url($item['plink'], PHP_URL_HOST); + if (!empty($host)) { + return $host; + } + + $host = parse_url($item['uri'], PHP_URL_HOST); + if (!empty($host)) { + return $host; + } + + $host = parse_url($guid, PHP_URL_HOST); + if (!empty($host)) { + return $host; + } + + $host = parse_url($item['author-link'], PHP_URL_HOST); + if (!empty($host)) { + return $host; + } + + return parse_url($basepath, PHP_URL_HOST); + } /** * Automatically adjust the poll frequency according to the post frequency *