diff options
author | 2023-06-06 23:09:00 +0800 | |
---|---|---|
committer | 2023-06-06 10:09:00 -0500 | |
commit | 409c60028aaab09b8f2383ef5730531cd23db4ba (patch) | |
tree | 68bc3be1341d7a82f90edb51bb219387115556eb /packages/integrations/node | |
parent | 144813f7308dcb9de64ebe3f0f2c6cba9ad81eb1 (diff) | |
download | astro-409c60028aaab09b8f2383ef5730531cd23db4ba.tar.gz astro-409c60028aaab09b8f2383ef5730531cd23db4ba.tar.zst astro-409c60028aaab09b8f2383ef5730531cd23db4ba.zip |
fix:query not considered in directory redirection (#7243)
* fix:query not considered in directory redirection
* feat: req.url may be empty
* test(node): add redirect + query param tests
* refactor(node): cleanup query param logic
* chore: remove log
* chore: add changeset
---------
Co-authored-by: Riki <947968273@qq.com>
Co-authored-by: Nate Moore <nate@astro.build>
Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com>
Diffstat (limited to 'packages/integrations/node')
-rw-r--r-- | packages/integrations/node/src/http-server.ts | 9 | ||||
-rw-r--r-- | packages/integrations/node/test/prerender.test.js | 36 |
2 files changed, 44 insertions, 1 deletions
diff --git a/packages/integrations/node/src/http-server.ts b/packages/integrations/node/src/http-server.ts index 177c71ed9..9f8b3e891 100644 --- a/packages/integrations/node/src/http-server.ts +++ b/packages/integrations/node/src/http-server.ts @@ -57,7 +57,14 @@ export function createServer( }); stream.on('directory', () => { // On directory find, redirect to the trailing slash - const location = req.url + '/'; + let location: string; + if (req.url!.includes('?')) { + const [url = '', search] = req.url!.split('?'); + location = `${url}/?${search}` + } else { + location = req.url + '/' + } + res.statusCode = 301; res.setHeader('Location', location); res.end(location); diff --git a/packages/integrations/node/test/prerender.test.js b/packages/integrations/node/test/prerender.test.js index 4b5522a31..a018f0649 100644 --- a/packages/integrations/node/test/prerender.test.js +++ b/packages/integrations/node/test/prerender.test.js @@ -58,6 +58,15 @@ describe('Prerendering', () => { expect($('h1').text()).to.equal('Two'); }); + it('Can render prerendered route with redirect and query params', async () => { + const res = await fetch(`http://${server.host}:${server.port}/some-base/two?foo=bar`); + const html = await res.text(); + const $ = cheerio.load(html); + + expect(res.status).to.equal(200); + expect($('h1').text()).to.equal('Two'); + }); + it('Can render prerendered route with query params', async () => { const res = await fetch(`http://${server.host}:${server.port}/some-base/two/?foo=bar`); const html = await res.text(); @@ -116,6 +125,15 @@ describe('Prerendering', () => { expect($('h1').text()).to.equal('Two'); }); + it('Can render prerendered route with redirect and query params', async () => { + const res = await fetch(`http://${server.host}:${server.port}/two?foo=bar`); + const html = await res.text(); + const $ = cheerio.load(html); + + expect(res.status).to.equal(200); + expect($('h1').text()).to.equal('Two'); + }); + it('Can render prerendered route with query params', async () => { const res = await fetch(`http://${server.host}:${server.port}/two/?foo=bar`); const html = await res.text(); @@ -171,6 +189,15 @@ describe('Hybrid rendering', () => { expect($('h1').text()).to.equal('One'); }); + it('Can render prerendered route with redirect and query params', async () => { + const res = await fetch(`http://${server.host}:${server.port}/some-base/one?foo=bar`); + const html = await res.text(); + const $ = cheerio.load(html); + + expect(res.status).to.equal(200); + expect($('h1').text()).to.equal('One'); + }); + it('Can render prerendered route with query params', async () => { const res = await fetch(`http://${server.host}:${server.port}/some-base/one/?foo=bar`); const html = await res.text(); @@ -228,6 +255,15 @@ describe('Hybrid rendering', () => { expect($('h1').text()).to.equal('One'); }); + it('Can render prerendered route with redirect and query params', async () => { + const res = await fetch(`http://${server.host}:${server.port}/one?foo=bar`); + const html = await res.text(); + const $ = cheerio.load(html); + + expect(res.status).to.equal(200); + expect($('h1').text()).to.equal('One'); + }); + it('Can render prerendered route with query params', async () => { const res = await fetch(`http://${server.host}:${server.port}/one/?foo=bar`); const html = await res.text(); |