limit the number of favicon retries

This commit is contained in:
Athou
2026-05-23 11:16:55 +02:00
parent 055d503862
commit 03eb09c68c
2 changed files with 12 additions and 4 deletions

View File

@@ -10,11 +10,18 @@ export interface FeedFaviconProps {
export function FeedFavicon({ url, size = 18 }: Readonly<FeedFaviconProps>) { export function FeedFavicon({ url, size = 18 }: Readonly<FeedFaviconProps>) {
// the backend always returns a favicon except when the feed has never been fetched // the backend always returns a favicon except when the feed has never been fetched
// this can happen when the user subscribes to a feed, the feed is added to the tree but the feed has not been fetched yet // this can happen when the user subscribes to a feed, the feed is added to the tree but the feed has not been fetched yet
// in this case we just retry every second until the feed is fetched and the favicon is available // in this case we retry every second up to 3 times until the feed is fetched and the favicon is available
const [timestamp, setTimestamp] = useState(0) const [timestamp, setTimestamp] = useState(0)
const [retryCount, setRetryCount] = useState(0)
const { start: retry } = useTimeout(() => setTimestamp(Date.now()), 1000) const { start: retry } = useTimeout(() => setTimestamp(Date.now()), 1000)
const urlWithTimestamp = url + (timestamp === 0 ? "" : `?t=${timestamp}`) const urlWithTimestamp = url + (timestamp === 0 ? "" : `?t=${timestamp}`)
const handleError = () => {
if (retryCount < 3) {
setRetryCount(c => c + 1)
retry()
}
}
return ( return (
<ImageWithPlaceholderWhileLoading <ImageWithPlaceholderWhileLoading
src={urlWithTimestamp} src={urlWithTimestamp}
@@ -25,7 +32,7 @@ export function FeedFavicon({ url, size = 18 }: Readonly<FeedFaviconProps>) {
placeholderHeight={size} placeholderHeight={size}
placeholderBackgroundColor="inherit" placeholderBackgroundColor="inherit"
placeholderIconSize={size} placeholderIconSize={size}
onError={retry} onError={handleError}
/> />
) )
} }

View File

@@ -30,9 +30,10 @@ public class RootFaviconFetcher implements FaviconFetcher {
url = feed.getUrl(); url = feed.getUrl();
} }
URI uri = URI.create(url);
String faviconUrl = "%s://%s/favicon.ico".formatted(uri.getScheme(), uri.getHost());
try { try {
URI uri = URI.create(url.trim());
String faviconUrl = "%s://%s/favicon.ico".formatted(uri.getScheme(), uri.getHost());
log.debug("getting root icon at {}", faviconUrl); log.debug("getting root icon at {}", faviconUrl);
HttpResult result = getter.get(faviconUrl); HttpResult result = getter.get(faviconUrl);
return new Favicon(result.content(), result.contentType()); return new Favicon(result.content(), result.contentType());