From ebf365dfc96ce77b3a655a3f18df568bed7e7a14 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Sat, 20 Jun 2026 11:56:28 +1000 Subject: [PATCH] fix: prevent caching private shortlink responses --- tests/private-redirect.test.ts | 17 +++++++++++ worker/lib/responses.ts | 51 +++++++++++++++++++++++++++---- worker/routes/private-redirect.ts | 12 +++++--- 3 files changed, 69 insertions(+), 11 deletions(-) diff --git a/tests/private-redirect.test.ts b/tests/private-redirect.test.ts index 2681f1f..6ff8ba7 100644 --- a/tests/private-redirect.test.ts +++ b/tests/private-redirect.test.ts @@ -187,6 +187,16 @@ async function userSession(token: string, userId: string): Promise { }; } +function expectPrivateNoStoreHeaders(response: Response): void { + expect(response.headers.get('cache-control')).toBe('no-store'); + expect( + response.headers + .get('vary') + ?.split(',') + .map((value) => value.trim().toLowerCase()), + ).toContain('cookie'); +} + describe('my.heygo.cc private shortlinks', () => { it('returns 404 with a login link when unauthenticated', async () => { const { response, db } = await fetchWorker('https://my.heygo.cc/foo', { @@ -207,6 +217,7 @@ describe('my.heygo.cc private shortlinks', () => { expect(response.status).toBe(404); expect(response.headers.get('content-type')).toContain('text/html'); + expectPrivateNoStoreHeaders(response); const body = await response.text(); expect(body).toContain('Login to use your private links'); expect(body).toContain('https://heygo.cc/app/login'); @@ -237,6 +248,7 @@ describe('my.heygo.cc private shortlinks', () => { expect(response.status).toBe(302); expect(response.headers.get('location')).toBe('https://example.com/foo-a'); + expectPrivateNoStoreHeaders(response); expect(ctx.promises).toHaveLength(1); await Promise.all(ctx.promises); expect(db.runCalls).toHaveLength(1); @@ -324,6 +336,7 @@ describe('my.heygo.cc private shortlinks', () => { }); expect(response.status).toBe(404); + expectPrivateNoStoreHeaders(response); const body = await response.text(); expect(body).toContain('Create this private link'); // Must never query the public scope on my.heygo.cc. @@ -353,6 +366,7 @@ describe('my.heygo.cc private shortlinks', () => { expect(response.status).toBe(200); expect(response.headers.get('content-type')).toContain('text/html'); + expectPrivateNoStoreHeaders(response); const html = await response.text(); expect(html).toContain('Private Note'); expect(html).not.toContain('