From 878187c68eecf38c324f11ce9a297c220c496260 Mon Sep 17 00:00:00 2001 From: Tanner Linsley Date: Mon, 10 Aug 2026 10:57:16 -0600 Subject: [PATCH 1/2] Fix RSS enclosure media types --- src/routes/rss[.]xml.ts | 14 +++++++++++++- tests/rss.test.ts | 16 ++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 tests/rss.test.ts diff --git a/src/routes/rss[.]xml.ts b/src/routes/rss[.]xml.ts index 732b7474c..51fea5838 100644 --- a/src/routes/rss[.]xml.ts +++ b/src/routes/rss[.]xml.ts @@ -12,6 +12,18 @@ function escapeXml(unsafe: string): string { .replace(/'/g, ''') } +export function getRssImageMediaType(src: string) { + const extension = src.match(/\.([^.?#]+)(?:[?#]|$)/)?.[1]?.toLowerCase() + + if (extension === 'jpg' || extension === 'jpeg') return 'image/jpeg' + if (extension === 'webp') return 'image/webp' + if (extension === 'svg') return 'image/svg+xml' + if (extension === 'gif') return 'image/gif' + if (extension === 'png') return 'image/png' + + return 'application/octet-stream' +} + function generateRSSFeed() { const posts = getPublishedPosts().slice(0, 50) // Most recent 50 posts const siteUrl = 'https://tanstack.com' @@ -42,7 +54,7 @@ function generateRSSFeed() { ${pubDate} ${escapeXml(author)} ${escapeXml(description)} - ${post.headerImage ? `` : ''} + ${post.headerImage ? `` : ''} ` }) .join('') diff --git a/tests/rss.test.ts b/tests/rss.test.ts new file mode 100644 index 000000000..77264ce6a --- /dev/null +++ b/tests/rss.test.ts @@ -0,0 +1,16 @@ +import assert from 'node:assert/strict' +import test from 'node:test' +import { getRssImageMediaType } from '../src/routes/rss[.]xml' + +test('uses the image media type matching an RSS enclosure URL', () => { + assert.equal(getRssImageMediaType('/header.png'), 'image/png') + assert.equal(getRssImageMediaType('/header.jpg'), 'image/jpeg') + assert.equal(getRssImageMediaType('/header.jpeg'), 'image/jpeg') + assert.equal(getRssImageMediaType('/header.webp'), 'image/webp') + assert.equal(getRssImageMediaType('/header.svg?v=1'), 'image/svg+xml') + assert.equal(getRssImageMediaType('/header.gif#image'), 'image/gif') + assert.equal( + getRssImageMediaType('/header.unknown'), + 'application/octet-stream', + ) +}) From 7a55af7df5c91c7174d4e36a324465220952e8ad Mon Sep 17 00:00:00 2001 From: Tanner Linsley Date: Mon, 10 Aug 2026 11:46:48 -0600 Subject: [PATCH 2/2] Limit RSS media detection to paths --- src/routes/rss[.]xml.ts | 3 ++- tests/rss.test.ts | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/routes/rss[.]xml.ts b/src/routes/rss[.]xml.ts index 51fea5838..172f38f16 100644 --- a/src/routes/rss[.]xml.ts +++ b/src/routes/rss[.]xml.ts @@ -13,7 +13,8 @@ function escapeXml(unsafe: string): string { } export function getRssImageMediaType(src: string) { - const extension = src.match(/\.([^.?#]+)(?:[?#]|$)/)?.[1]?.toLowerCase() + const path = src.split(/[?#]/, 1)[0] + const extension = path.match(/\.([^./]+)$/)?.[1]?.toLowerCase() if (extension === 'jpg' || extension === 'jpeg') return 'image/jpeg' if (extension === 'webp') return 'image/webp' diff --git a/tests/rss.test.ts b/tests/rss.test.ts index 77264ce6a..090b808a1 100644 --- a/tests/rss.test.ts +++ b/tests/rss.test.ts @@ -9,6 +9,14 @@ test('uses the image media type matching an RSS enclosure URL', () => { assert.equal(getRssImageMediaType('/header.webp'), 'image/webp') assert.equal(getRssImageMediaType('/header.svg?v=1'), 'image/svg+xml') assert.equal(getRssImageMediaType('/header.gif#image'), 'image/gif') + assert.equal( + getRssImageMediaType('/header?source=original.png'), + 'application/octet-stream', + ) + assert.equal( + getRssImageMediaType('/header#preview.jpg'), + 'application/octet-stream', + ) assert.equal( getRssImageMediaType('/header.unknown'), 'application/octet-stream',