From 6a15ca88b6f4e1822068e8b4bc2ad69401421ee5 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 24 Mar 2026 10:10:35 -0500 Subject: [PATCH] Update redirect service (#10116) --- bskylink/src/metrics.ts | 5 +++++ bskylink/src/routes/redirect.ts | 5 +++++ bskylink/tests/index.ts | 17 +++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/bskylink/src/metrics.ts b/bskylink/src/metrics.ts index ec68747268..d720a4c582 100644 --- a/bskylink/src/metrics.ts +++ b/bskylink/src/metrics.ts @@ -11,6 +11,11 @@ type Events = { whitelisted: 'unknown' | 'yes' blocked: boolean warned: boolean + utm_source?: string + utm_medium?: string + utm_campaign?: string + utm_content?: string + utm_term?: string } invalid_redirect: { link: string diff --git a/bskylink/src/routes/redirect.ts b/bskylink/src/routes/redirect.ts index c04e653930..a49f9c401e 100644 --- a/bskylink/src/routes/redirect.ts +++ b/bskylink/src/routes/redirect.ts @@ -101,6 +101,11 @@ export default function (ctx: AppContext, app: Express) { whitelisted, blocked, warned, + utm_source: req.query.utm_source?.toString(), + utm_medium: req.query.utm_medium?.toString(), + utm_campaign: req.query.utm_campaign?.toString(), + utm_content: req.query.utm_content?.toString(), + utm_term: req.query.utm_term?.toString(), }) return res.end(html) diff --git a/bskylink/tests/index.ts b/bskylink/tests/index.ts index aee213af7a..7635cf3c57 100644 --- a/bskylink/tests/index.ts +++ b/bskylink/tests/index.ts @@ -360,4 +360,21 @@ describe('link service no safelink', async () => { // No blocked-site div, always safe assert.doesNotMatch(html, /"blocked-site"/) }) + + it('normal redirect with query params', async () => { + const urlToRedirect = 'https://bsky.app/settings' + const url = new URL(`${baseUrl}/redirect`) + url.searchParams.set('u', urlToRedirect) + url.searchParams.set('utm_source', 'test') + const res = await fetch(url, {redirect: 'manual'}) + assert.strictEqual(res.status, 200) + const html = await res.text() + assert.match(html, /meta http-equiv="refresh"/) + assert.match( + html, + new RegExp(urlToRedirect.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')), + ) + // No blocked-site div, always safe + assert.doesNotMatch(html, /"blocked-site"/) + }) })