This commit is contained in:
shamoon
2026-09-22 23:32:37 -07:00
parent 802201d2a9
commit e031209d68
2 changed files with 61 additions and 16 deletions
+26 -16
View File
@@ -1,3 +1,5 @@
import cache from "memory-cache";
import { parseFeed } from "./utils";
import getServiceWidget from "utils/config/service-helpers";
@@ -6,6 +8,7 @@ import { sanitizeErrorURL } from "utils/proxy/api-helpers";
import { httpProxy } from "utils/proxy/http";
const logger = createLogger("feedProxyHandler");
const CACHE_MS = 10 * 60 * 1000;
export default async function feedProxyHandler(req, res) {
const { group, service, index } = req.query;
@@ -22,24 +25,31 @@ export default async function feedProxyHandler(req, res) {
return res.status(400).json({ error: "Invalid feed URL" });
}
const [status, , data] = await httpProxy(url, {
headers: {
"User-Agent": `gethomepage/${process.env.NEXT_PUBLIC_VERSION || "dev"}`,
Accept: "application/rss+xml, application/atom+xml, application/xml;q=0.9, text/xml;q=0.9, */*;q=0.8",
},
});
const cacheKey = `feed:${url.href}`;
let items = cache.get(cacheKey);
if (status !== 200) {
logger.debug("HTTP %d retrieving feed %s//%s%s", status, url.protocol, url.host, url.pathname);
return res.status(status).json({ error: { message: "HTTP Error", url: sanitizeErrorURL(url) } });
}
if (!items) {
const [status, , data] = await httpProxy(url, {
headers: {
"User-Agent": `gethomepage/${process.env.NEXT_PUBLIC_VERSION || "dev"}`,
Accept: "application/rss+xml, application/atom+xml, application/xml;q=0.9, text/xml;q=0.9, */*;q=0.8",
},
});
let items;
try {
items = parseFeed(Buffer.from(data).toString(), url.href);
} catch (e) {
logger.debug("Error parsing feed %s//%s%s: %s", url.protocol, url.host, url.pathname, e.message);
return res.status(500).json({ error: { message: "Invalid feed", url: sanitizeErrorURL(url) } });
if (status !== 200) {
logger.debug("HTTP %d retrieving feed %s//%s%s", status, url.protocol, url.host, url.pathname);
return res.status(status).json({ error: { message: "HTTP Error", url: sanitizeErrorURL(url) } });
}
try {
items = parseFeed(Buffer.from(data).toString(), url.href);
} catch (e) {
logger.debug("Error parsing feed %s//%s%s: %s", url.protocol, url.host, url.pathname, e.message);
return res.status(500).json({ error: { message: "Invalid feed", url: sanitizeErrorURL(url) } });
}
// only successful fetches are cached
cache.put(cacheKey, items, CACHE_MS);
}
const maxItems = parseInt(widget.maxItems, 10) || 5;