Skip to content

Commit

Permalink
Normalize ssgCacheKey for /index with minimalMode de-duping (#35536)
Browse files Browse the repository at this point in the history
* Normalize ssgCacheKey for /index

* apply test changes to i18n suite as well
  • Loading branch information
ijjk committed Mar 23, 2022
1 parent 72478c5 commit 9fef0d5
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 20 deletions.
4 changes: 4 additions & 0 deletions packages/next/server/base-server.ts
Expand Up @@ -1323,6 +1323,10 @@ export default abstract class Server {
return seg
})
.join('/')

// ensure /index and / is normalized to one key
ssgCacheKey =
ssgCacheKey === '/index' && pathname === '/' ? '/' : ssgCacheKey
}

const doRender: () => Promise<ResponseCacheEntry | null> = async () => {
Expand Down
20 changes: 11 additions & 9 deletions test/production/required-server-files-i18n.test.ts
Expand Up @@ -162,25 +162,27 @@ describe('should set-up next', () => {
const res2 = await fetchViaHTTP(appPort, '/gssp', undefined, {
redirect: 'manual ',
})
await next.patchFile('standalone/data.txt', 'show')

expect(res2.status).toBe(404)
expect(res2.headers.get('cache-control')).toBe(
's-maxage=1, stale-while-revalidate'
)
})

it('should render SSR page correctly', async () => {
const html = await renderViaHTTP(appPort, '/')
const html = await renderViaHTTP(appPort, '/gssp')
const $ = cheerio.load(html)
const data = JSON.parse($('#props').text())

expect($('#index').text()).toBe('index page')
expect($('#gssp').text()).toBe('getServerSideProps page')
expect(data.hello).toBe('world')

const html2 = await renderViaHTTP(appPort, '/')
const html2 = await renderViaHTTP(appPort, '/gssp')
const $2 = cheerio.load(html2)
const data2 = JSON.parse($2('#props').text())

expect($2('#index').text()).toBe('index page')
expect($2('#gssp').text()).toBe('getServerSideProps page')
expect(isNaN(data2.random)).toBe(false)
expect(data2.random).not.toBe(data.random)
})
Expand Down Expand Up @@ -244,24 +246,24 @@ describe('should set-up next', () => {
it('should render SSR page correctly with x-matched-path', async () => {
const html = await renderViaHTTP(appPort, '/some-other-path', undefined, {
headers: {
'x-matched-path': '/',
'x-matched-path': '/gssp',
},
})
const $ = cheerio.load(html)
const data = JSON.parse($('#props').text())

expect($('#index').text()).toBe('index page')
expect($('#gssp').text()).toBe('getServerSideProps page')
expect(data.hello).toBe('world')

const html2 = await renderViaHTTP(appPort, '/some-other-path', undefined, {
headers: {
'x-matched-path': '/',
'x-matched-path': '/gssp',
},
})
const $2 = cheerio.load(html2)
const data2 = JSON.parse($2('#props').text())

expect($2('#index').text()).toBe('index page')
expect($2('#gssp').text()).toBe('getServerSideProps page')
expect(isNaN(data2.random)).toBe(false)
expect(data2.random).not.toBe(data.random)
})
Expand Down Expand Up @@ -508,7 +510,7 @@ describe('should set-up next', () => {
},
{
headers: {
'x-matched-path': '/',
'x-matched-path': '/gssp',
},
}
)
Expand Down
43 changes: 34 additions & 9 deletions test/production/required-server-files.test.ts
Expand Up @@ -176,6 +176,29 @@ describe('should set-up next', () => {
expect(res2.status).toBe(200)
const { pageProps: props2 } = await res2.json()
expect(props2.gspCalls).toBe(props.gspCalls)

const res3 = await fetchViaHTTP(appPort, '/index', undefined, {
redirect: 'manual',
headers: {
'x-matched-path': '/index',
},
})
expect(res3.status).toBe(200)
const $2 = cheerio.load(await res3.text())
const props3 = JSON.parse($2('#props').text())
expect(props3.gspCalls).toBeDefined()

const res4 = await fetchViaHTTP(
appPort,
`/_next/data/${next.buildId}/index.json`,
undefined,
{
redirect: 'manual',
}
)
expect(res4.status).toBe(200)
const { pageProps: props4 } = await res4.json()
expect(props4.gspCalls).toBe(props3.gspCalls)
})

it('should set correct SWR headers with notFound gsp', async () => {
Expand Down Expand Up @@ -218,25 +241,27 @@ describe('should set-up next', () => {
const res2 = await fetchViaHTTP(appPort, '/gssp', undefined, {
redirect: 'manual ',
})
await next.patchFile('standalone/data.txt', 'show')

expect(res2.status).toBe(404)
expect(res2.headers.get('cache-control')).toBe(
's-maxage=1, stale-while-revalidate'
)
})

it('should render SSR page correctly', async () => {
const html = await renderViaHTTP(appPort, '/')
const html = await renderViaHTTP(appPort, '/gssp')
const $ = cheerio.load(html)
const data = JSON.parse($('#props').text())

expect($('#index').text()).toBe('index page')
expect($('#gssp').text()).toBe('getServerSideProps page')
expect(data.hello).toBe('world')

const html2 = await renderViaHTTP(appPort, '/')
const html2 = await renderViaHTTP(appPort, '/gssp')
const $2 = cheerio.load(html2)
const data2 = JSON.parse($2('#props').text())

expect($2('#index').text()).toBe('index page')
expect($2('#gssp').text()).toBe('getServerSideProps page')
expect(isNaN(data2.random)).toBe(false)
expect(data2.random).not.toBe(data.random)
})
Expand Down Expand Up @@ -300,24 +325,24 @@ describe('should set-up next', () => {
it('should render SSR page correctly with x-matched-path', async () => {
const html = await renderViaHTTP(appPort, '/some-other-path', undefined, {
headers: {
'x-matched-path': '/',
'x-matched-path': '/gssp',
},
})
const $ = cheerio.load(html)
const data = JSON.parse($('#props').text())

expect($('#index').text()).toBe('index page')
expect($('#gssp').text()).toBe('getServerSideProps page')
expect(data.hello).toBe('world')

const html2 = await renderViaHTTP(appPort, '/some-other-path', undefined, {
headers: {
'x-matched-path': '/',
'x-matched-path': '/gssp',
},
})
const $2 = cheerio.load(html2)
const data2 = JSON.parse($2('#props').text())

expect($2('#index').text()).toBe('index page')
expect($2('#gssp').text()).toBe('getServerSideProps page')
expect(isNaN(data2.random)).toBe(false)
expect(data2.random).not.toBe(data.random)
})
Expand Down Expand Up @@ -564,7 +589,7 @@ describe('should set-up next', () => {
},
{
headers: {
'x-matched-path': '/',
'x-matched-path': '/gssp',
},
}
)
Expand Down
7 changes: 6 additions & 1 deletion test/production/required-server-files/pages/gssp.js
@@ -1,5 +1,6 @@
import fs from 'fs'
import path from 'path'
import { useRouter } from 'next/router'

export async function getServerSideProps({ res }) {
res.setHeader('cache-control', 's-maxage=1, stale-while-revalidate')
Expand All @@ -19,16 +20,20 @@ export async function getServerSideProps({ res }) {
props: {
hello: 'world',
data,
random: Math.random(),
// make sure fetch if polyfilled
example: await fetch('https://example.com').then((res) => res.text()),
},
}
}

export default function Page(props) {
const router = useRouter()

return (
<>
<p id="gsp">getStaticProps page</p>
<p id="gssp">getServerSideProps page</p>
<p id="router">{JSON.stringify(router)}</p>
<p id="props">{JSON.stringify(props)}</p>
</>
)
Expand Down
8 changes: 7 additions & 1 deletion test/production/required-server-files/pages/index.js
Expand Up @@ -8,12 +8,18 @@ if (localConfig.hello !== 'world') {
throw new Error('oof import order is wrong, _app comes first')
}

export const getServerSideProps = ({ req }) => {
let gspCalls = 0

export const getStaticProps = () => {
gspCalls += 1

return {
props: {
hello: 'world',
random: Math.random(),
gspCalls,
},
revalidate: 1,
}
}

Expand Down

0 comments on commit 9fef0d5

Please sign in to comment.