Ignore malformed feed probe candidates (#43)

Co-authored-by: Codex Microtask Operator <codex-microtask@example.com>
This commit is contained in:
Autowebassat-blip 2026-06-14 07:55:39 +02:00 committed by GitHub
parent fbf4d76372
commit ffefd364ce
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 19 additions and 1 deletions

View file

@ -3,6 +3,7 @@ import { dedupeFeeds } from "./dedupe.js";
import { discoverFeeds } from "./discovery.js"; import { discoverFeeds } from "./discovery.js";
import { parseFeedDocument } from "./feed-parsing.js"; import { parseFeedDocument } from "./feed-parsing.js";
import { renderDiscoveryOutput } from "./output/index.js"; import { renderDiscoveryOutput } from "./output/index.js";
import { WebCandidateFeedProbeProvider } from "./providers/web-feed-probe.js";
import { extractAlternateFeedLinks } from "./probe-site.js"; import { extractAlternateFeedLinks } from "./probe-site.js";
import { scoreFeed } from "./scoring.js"; import { scoreFeed } from "./scoring.js";
import type { DiscoveredFeed, FeedDiscoveryProvider } from "./types.js"; import type { DiscoveredFeed, FeedDiscoveryProvider } from "./types.js";
@ -64,6 +65,23 @@ describe("site probing helpers", () => {
await expect(assertSafeHttpUrl("http://[::ffff:192.168.1.10]/feed")).rejects.toThrow(/Blocked internal/); await expect(assertSafeHttpUrl("http://[::ffff:192.168.1.10]/feed")).rejects.toThrow(/Blocked internal/);
await expect(assertSafeHttpUrl("file:///etc/passwd")).rejects.toThrow(/Unsupported URL protocol/); await expect(assertSafeHttpUrl("file:///etc/passwd")).rejects.toThrow(/Unsupported URL protocol/);
}); });
it("ignores malformed configured candidate URLs", async () => {
const provider = new WebCandidateFeedProbeProvider({
cacheTtlSeconds: 60,
maxProviders: 1,
maxProbes: 1,
requestTimeoutMs: 10,
maxBodyBytes: 1024,
userAgent: "test",
opmlPaths: [],
candidateUrls: ["not-a-url|micro"],
podcastIndexApiKey: undefined,
podcastIndexApiSecret: undefined
});
await expect(provider.search({ q: "micro" })).resolves.toEqual([]);
});
}); });
describe("scoring, dedupe, and output", () => { describe("scoring, dedupe, and output", () => {

View file

@ -30,7 +30,7 @@ function candidateUrls(query: FeedDiscoveryQuery, configured: string[]) {
for (const entry of configured) { for (const entry of configured) {
const [url, ...keywords] = entry.split("|").map((part) => part.trim()); const [url, ...keywords] = entry.split("|").map((part) => part.trim());
if (!url) { if (!/^https?:\/\//i.test(url)) {
continue; continue;
} }
if (keywords.length === 0 || keywords.some((keyword) => query.q.toLowerCase().includes(keyword.toLowerCase()))) { if (keywords.length === 0 || keywords.some((keyword) => query.q.toLowerCase().includes(keyword.toLowerCase()))) {