From 3b81708c1aa7dc0be9fbd017a85a57855094b57d Mon Sep 17 00:00:00 2001 From: Alexandre Alapetite Date: Mon, 5 Sep 2022 13:13:07 +0200 Subject: API protection limit content size (#4583) * API protection limit content size We had no limit to the length of an article sent through our GReader API to clients, which was a problem: The article https://devblogs.microsoft.com/dotnet/performance_improvements_in_net_7/ from the feed https://devblogs.microsoft.com/dotnet/feed/ is about 700KB long, which makes some clients (tested with News+) fail. We should try other clients to verify that 500KB is a safe enough limit. * Light optimisation * Use class constant --- app/Models/Entry.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/Models/Entry.php b/app/Models/Entry.php index feb094347..12cef68a5 100644 --- a/app/Models/Entry.php +++ b/app/Models/Entry.php @@ -651,6 +651,12 @@ class FreshRSS_Entry extends Minz_Model { str_pad(dechex($dec), 16, '0', STR_PAD_LEFT); } + /** + * Some clients (tested with News+) would fail if sending too long item content + * @var int + */ + const API_MAX_COMPAT_CONTENT_LENGTH = 500000; + /** * N.B.: To avoid expensive lookups, ensure to set `$entry->_feed($feed)` before calling this function. * N.B.: You might have to populate `$entry->_tags()` prior to calling this function. @@ -690,6 +696,9 @@ class FreshRSS_Entry extends Minz_Model { if ($mode === 'compat') { $item['title'] = escapeToUnicodeAlternative($this->title(), false); unset($item['alternate'][0]['type']); + if (mb_strlen($this->content(), 'UTF-8') > self::API_MAX_COMPAT_CONTENT_LENGTH) { + $item['summary']['content'] = mb_strcut($this->content(), 0, self::API_MAX_COMPAT_CONTENT_LENGTH, 'UTF-8'); + } } elseif ($mode === 'freshrss') { $item['guid'] = $this->guid(); unset($item['summary']); -- cgit v1.2.3