From cb356ff689ecaf9e5409fe7e4bcd35fc314001f4 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Wed, 6 Apr 2022 19:28:01 -0500 Subject: [PATCH] Ensure minimalMode previousCache expire time is capped --- packages/next/server/response-cache.ts | 5 +-- test/production/required-server-files.test.ts | 24 ++++++++++++ .../pages/gsp-long-revalidate.js | 37 +++++++++++++++++++ 3 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 test/production/required-server-files/pages/gsp-long-revalidate.js diff --git a/packages/next/server/response-cache.ts b/packages/next/server/response-cache.ts index d7d4937125e1d57..5754b135f8fa2f8 100644 --- a/packages/next/server/response-cache.ts +++ b/packages/next/server/response-cache.ts @@ -187,10 +187,7 @@ export default class ResponseCache { this.previousCacheItem = { key, entry: cacheEntry, - expiresAt: - typeof cacheEntry.revalidate !== 'number' - ? Date.now() + 1000 - : Date.now() + cacheEntry?.revalidate * 1000, + expiresAt: Date.now() + 1000, } } else { await this.incrementalCache.set( diff --git a/test/production/required-server-files.test.ts b/test/production/required-server-files.test.ts index b9fe52eab61774d..4f04c70cd7e8374 100644 --- a/test/production/required-server-files.test.ts +++ b/test/production/required-server-files.test.ts @@ -211,6 +211,30 @@ describe('should set-up next', () => { expect(props4.gspCalls).toBe(props3.gspCalls) }) + it('should cap de-dupe previousCacheItem expires time', async () => { + const res = await fetchViaHTTP(appPort, '/gsp-long-revalidate', undefined, { + redirect: 'manual', + }) + expect(res.status).toBe(200) + const $ = cheerio.load(await res.text()) + const props = JSON.parse($('#props').text()) + expect(props.gspCalls).toBeDefined() + + await waitFor(1000) + + const res2 = await fetchViaHTTP( + appPort, + `/_next/data/${next.buildId}/gsp-long-revalidate.json`, + undefined, + { + redirect: 'manual', + } + ) + expect(res2.status).toBe(200) + const { pageProps: props2 } = await res2.json() + expect(props2.gspCalls).not.toBe(props.gspCalls) + }) + it('should set correct SWR headers with notFound gsp', async () => { await waitFor(2000) await next.patchFile('standalone/data.txt', 'show') diff --git a/test/production/required-server-files/pages/gsp-long-revalidate.js b/test/production/required-server-files/pages/gsp-long-revalidate.js new file mode 100644 index 000000000000000..f70b6c8f6b93a58 --- /dev/null +++ b/test/production/required-server-files/pages/gsp-long-revalidate.js @@ -0,0 +1,37 @@ +import fs from 'fs' +import path from 'path' + +let gspCalls = 0 + +export async function getStaticProps() { + const data = await fs.promises.readFile( + path.join(process.cwd(), 'data.txt'), + 'utf8' + ) + gspCalls += 1 + + if (data.trim() === 'hide') { + return { + notFound: true, + revalidate: 1, + } + } + + return { + props: { + hello: 'world', + data, + gspCalls, + }, + revalidate: 100, + } +} + +export default function Page(props) { + return ( + <> +

getStaticProps page

+

{JSON.stringify(props)}

+ + ) +}