From a155464d46cc8dce0887e810c676a6dd92c72fde Mon Sep 17 00:00:00 2001 From: Daniel Salazar Date: Wed, 10 Jun 2026 23:27:13 -0700 Subject: [PATCH] fix: more data for puter site serve event (#3251) --- .../core/http/middleware/puterSite.test.ts | 45 +++++++++++++++++++ src/backend/core/http/middleware/puterSite.ts | 9 +++- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/backend/core/http/middleware/puterSite.test.ts b/src/backend/core/http/middleware/puterSite.test.ts index c50718b8d..304857ad6 100644 --- a/src/backend/core/http/middleware/puterSite.test.ts +++ b/src/backend/core/http/middleware/puterSite.test.ts @@ -534,6 +534,51 @@ describe('createPuterSiteMiddleware — file serving', () => { expect(piped!.equals(body)).toBe(true); }); + it('emits site.htmlServed with the original URL target including query string', async () => { + const owner = await makeUserWithHome(); + const homePath = `/${owner.username}`; + const homeEntry = await server.stores.fsEntry.getEntryByPath(homePath); + const sub = `serveq-${Math.random().toString(36).slice(2, 8)}`; + await server.stores.subdomain.create({ + userId: owner.id, + subdomain: sub, + rootDirId: homeEntry!.id, + }); + await writeFile( + owner.id, + `${homePath}/index.html`, + Buffer.from('hi'), + 'text/html', + ); + + const emitSpy = vi.spyOn(server.clients.event, 'emit'); + try { + const mw = buildMiddleware(); + const { res } = makeRes(); + await mw( + makeReq({ + hostname: `${sub}.site.puter.localhost`, + path: '/index.html', + originalUrl: '/index.html?brand=paypal', + }), + res, + vi.fn(), + ); + + const htmlServedCall = emitSpy.mock.calls.find( + (call) => call[0] === 'site.htmlServed', + ); + expect(htmlServedCall?.[1]).toMatchObject({ + subdomain: sub, + requestPath: '/index.html', + requestUrl: '/index.html?brand=paypal', + mime: 'text/html', + }); + } finally { + emitSpy.mockRestore(); + } + }); + it('returns 206 status when a Range header is supplied', async () => { const owner = await makeUserWithHome(); const homePath = `/${owner.username}`; diff --git a/src/backend/core/http/middleware/puterSite.ts b/src/backend/core/http/middleware/puterSite.ts index 3dcbc00d8..f61404dbf 100644 --- a/src/backend/core/http/middleware/puterSite.ts +++ b/src/backend/core/http/middleware/puterSite.ts @@ -555,8 +555,12 @@ export const createPuterSiteMiddleware = ( res.setHeader('Content-Type', mime); // Fire-and-forget signal for downstream extensions - if (mime === 'text/html' || mime === 'application/xhtml+xml') { + const mimeBase = mime.split(';', 1)[0].trim().toLowerCase(); + if (mimeBase === 'text/html' || mimeBase === 'application/xhtml+xml') { try { + const requestUrl = (req.originalUrl || '/').startsWith('/') + ? req.originalUrl || '/' + : `/${req.originalUrl}`; layers.clients.event.emit( 'site.htmlServed', { @@ -564,7 +568,8 @@ export const createPuterSiteMiddleware = ( entry, host, requestPath: req.path, - mime, + requestUrl, + mime: mimeBase, }, {}, );