Skip to content

Commit f88cee9

Browse files
ijjklllomh
andauthored
Backport: Fix(pages-router): restore Content-Length and ETag for /_next/data/ JSON responses (#90304) (#91615)
Backports #90304 Co-authored-by: Henry <lllomh@qq.com>
1 parent cfd5f53 commit f88cee9

2 files changed

Lines changed: 27 additions & 21 deletions

File tree

packages/next/src/server/route-modules/pages/pages-handler.ts

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -502,16 +502,13 @@ export const getHandler = ({
502502
return {
503503
value: {
504504
kind: CachedRouteKind.PAGES,
505-
html: new RenderResult(
506-
Buffer.from(previousCacheEntry.value.html),
507-
{
508-
contentType: HTML_CONTENT_TYPE_HEADER,
509-
metadata: {
510-
statusCode: previousCacheEntry.value.status,
511-
headers: previousCacheEntry.value.headers,
512-
},
513-
}
514-
),
505+
html: new RenderResult(previousCacheEntry.value.html, {
506+
contentType: HTML_CONTENT_TYPE_HEADER,
507+
metadata: {
508+
statusCode: previousCacheEntry.value.status,
509+
headers: previousCacheEntry.value.headers,
510+
},
511+
}),
515512
pageData: {},
516513
status: previousCacheEntry.value.status,
517514
headers: previousCacheEntry.value.headers,
@@ -710,13 +707,10 @@ export const getHandler = ({
710707
// anymore
711708
result:
712709
isNextDataRequest && !isErrorPage && !is500Page
713-
? new RenderResult(
714-
Buffer.from(JSON.stringify(result.value.pageData)),
715-
{
716-
contentType: JSON_CONTENT_TYPE_HEADER,
717-
metadata: result.value.html.metadata,
718-
}
719-
)
710+
? new RenderResult(JSON.stringify(result.value.pageData), {
711+
contentType: JSON_CONTENT_TYPE_HEADER,
712+
metadata: result.value.html.metadata,
713+
})
720714
: result.value.html,
721715
generateEtags: nextConfig.generateEtags,
722716
poweredByHeader: nextConfig.poweredByHeader,

test/e2e/prerender.test.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2071,7 +2071,10 @@ describe('Prerender', () => {
20712071

20722072
it('should handle revalidating JSON correctly', async () => {
20732073
const route = `/_next/data/${next.buildId}/blog/post-2/comment-3.json`
2074-
const initialJson = await renderViaHTTP(next.url, route)
2074+
const initialRes = await fetchViaHTTP(next.url, route)
2075+
const initialJson = await initialRes.text()
2076+
expect(initialRes.headers.get('Content-Length')).toBeDefined()
2077+
expect(initialRes.headers.get('ETag')).toBeDefined()
20752078
expect(initialJson).toMatch(/post-2/)
20762079
expect(initialJson).toMatch(/comment-3/)
20772080

@@ -2086,7 +2089,10 @@ describe('Prerender', () => {
20862089
await renderViaHTTP(next.url, route)
20872090

20882091
await check(async () => {
2089-
newJson = await renderViaHTTP(next.url, route)
2092+
const newRes = await fetchViaHTTP(next.url, route)
2093+
expect(newRes.headers.get('Content-Length')).toBeDefined()
2094+
expect(newRes.headers.get('ETag')).toBeDefined()
2095+
newJson = await newRes.text()
20902096
return newJson !== initialJson ? 'success' : newJson
20912097
}, 'success')
20922098

@@ -2143,7 +2149,10 @@ describe('Prerender', () => {
21432149

21442150
it('should handle revalidating HTML correctly with blocking and seed', async () => {
21452151
const route = '/blocking-fallback/a'
2146-
const initialHtml = await renderViaHTTP(next.url, route)
2152+
const initialRes = await fetchViaHTTP(next.url, route)
2153+
const initialHtml = await initialRes.text()
2154+
expect(initialRes.headers.get('Content-Length')).toBeDefined()
2155+
expect(initialRes.headers.get('ETag')).toBeDefined()
21472156
const $initial = cheerio.load(initialHtml)
21482157
expect($initial('p').text()).toBe('Post: a')
21492158

@@ -2158,7 +2167,10 @@ describe('Prerender', () => {
21582167
await renderViaHTTP(next.url, route)
21592168

21602169
await check(async () => {
2161-
newHtml = await renderViaHTTP(next.url, route)
2170+
const newRes = await fetchViaHTTP(next.url, route)
2171+
expect(newRes.headers.get('Content-Length')).toBeDefined()
2172+
expect(newRes.headers.get('ETag')).toBeDefined()
2173+
newHtml = await newRes.text()
21622174
return newHtml !== initialHtml ? 'success' : newHtml
21632175
}, 'success')
21642176

0 commit comments

Comments
 (0)