소스 검색

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
Alexandre Alapetite 3 년 전
부모
커밋
3b81708c1a
1개의 변경된 파일9개의 추가작업 그리고 0개의 파일을 삭제
  1. 9 0
      app/Models/Entry.php

+ 9 - 0
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']);