From 69114adb9196bb6a4f15c6bd4bd83bdb931408f9 Mon Sep 17 00:00:00 2001 From: taty2010 Date: Thu, 16 Feb 2023 14:26:43 -0600 Subject: [PATCH 1/8] fix: updated redirect data urls --- .../src/templates/edge-shared/utils.ts | 21 +++++++++++++++++-- .../middleware-redirects/test/index.test.ts | 2 +- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/packages/runtime/src/templates/edge-shared/utils.ts b/packages/runtime/src/templates/edge-shared/utils.ts index fb09b18aba..60a27f1835 100644 --- a/packages/runtime/src/templates/edge-shared/utils.ts +++ b/packages/runtime/src/templates/edge-shared/utils.ts @@ -6,7 +6,24 @@ export interface FetchEventResult { waitUntil: Promise } -type NextDataTransform = (data: T) => T +function normalizeDataUrl(redirect, url) { + const normalizedUrl = new URL(redirect, url) + + if ( + normalizedUrl.pathname.startsWith('/_next/data/') && + normalizedUrl.pathname.endsWith('.json') + ) { + const paths = normalizedUrl.pathname + .replace(/^\/_next\/data\//, '') + .replace(/\.json$/, '') + .split('/') + + const buildId = paths[0] + normalizedUrl.pathname = paths[1] !== 'index' ? `/${paths.slice(1).join('/')}` : '/' + } + + return normalizedUrl.pathname + normalizedUrl.search; +} /** * This is how Next handles rewritten URLs. @@ -247,7 +264,7 @@ export const buildResponse = async ({ // Data requests shouldn;t automatically redirect in the browser (they might be HTML pages): they're handled by the router if (redirect && isDataReq) { res.headers.delete('location') - res.headers.set('x-nextjs-redirect', relativizeURL(redirect, request.url)) + res.headers.set('x-nextjs-redirect', normalizeDataUrl(redirect, request.url)) } if (res.headers.get('x-middleware-next') === '1') { diff --git a/test/e2e/modified-tests/middleware-redirects/test/index.test.ts b/test/e2e/modified-tests/middleware-redirects/test/index.test.ts index f697ca4973..08760ae7b7 100644 --- a/test/e2e/modified-tests/middleware-redirects/test/index.test.ts +++ b/test/e2e/modified-tests/middleware-redirects/test/index.test.ts @@ -37,7 +37,7 @@ describe('Middleware Redirect', () => { expect(res.headers.get('location')?.endsWith('/default/about')).toEqual(false) }) - usuallySkip(`should redirect to data urls with data requests and internal redirects`, async () => { + it(`should redirect to data urls with data requests and internal redirects`, async () => { const res = await fetchViaHTTP( next.url, `/_next/data/${next.buildId}/es/old-home.json`, From 4320d645b5454b6ecab3470dfa2de56c45328ae8 Mon Sep 17 00:00:00 2001 From: taty2010 Date: Thu, 16 Feb 2023 15:38:25 -0600 Subject: [PATCH 2/8] fix: typescript errors and accidental deletion --- packages/runtime/src/templates/edge-shared/utils.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/runtime/src/templates/edge-shared/utils.ts b/packages/runtime/src/templates/edge-shared/utils.ts index 60a27f1835..bb315c9554 100644 --- a/packages/runtime/src/templates/edge-shared/utils.ts +++ b/packages/runtime/src/templates/edge-shared/utils.ts @@ -6,13 +6,12 @@ export interface FetchEventResult { waitUntil: Promise } -function normalizeDataUrl(redirect, url) { +type NextDataTransform = (data: T) => T + +function normalizeDataUrl(redirect: string, url: string | URL) { const normalizedUrl = new URL(redirect, url) - if ( - normalizedUrl.pathname.startsWith('/_next/data/') && - normalizedUrl.pathname.endsWith('.json') - ) { + if (normalizedUrl.pathname.startsWith('/_next/data/') && normalizedUrl.pathname.endsWith('.json')) { const paths = normalizedUrl.pathname .replace(/^\/_next\/data\//, '') .replace(/\.json$/, '') @@ -22,7 +21,7 @@ function normalizeDataUrl(redirect, url) { normalizedUrl.pathname = paths[1] !== 'index' ? `/${paths.slice(1).join('/')}` : '/' } - return normalizedUrl.pathname + normalizedUrl.search; + return normalizedUrl.pathname + normalizedUrl.search } /** From 83c1ad5946b3832aef6b67f06e950fd8b34e9c19 Mon Sep 17 00:00:00 2001 From: taty2010 Date: Thu, 16 Feb 2023 16:33:17 -0600 Subject: [PATCH 3/8] fix: console logging test --- test/e2e/modified-tests/middleware-redirects/test/index.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/modified-tests/middleware-redirects/test/index.test.ts b/test/e2e/modified-tests/middleware-redirects/test/index.test.ts index 08760ae7b7..ade93e3bcc 100644 --- a/test/e2e/modified-tests/middleware-redirects/test/index.test.ts +++ b/test/e2e/modified-tests/middleware-redirects/test/index.test.ts @@ -44,7 +44,7 @@ describe('Middleware Redirect', () => { { override: 'internal' }, { redirect: 'manual', headers: { 'x-nextjs-data': '1' } }, ) - + console.log('x-nextjs-redirect', res.headers.get('x-nextjs-redirect')) expect(res.headers.get('x-nextjs-redirect')?.endsWith(`/es/new-home?override=internal`)).toEqual(true) expect(res.headers.get('location')).toEqual(null) }) From a6d69b27f3d829a9c55686b2f37ccddac50658ab Mon Sep 17 00:00:00 2001 From: taty2010 Date: Fri, 17 Feb 2023 12:04:44 -0600 Subject: [PATCH 4/8] fix: getting the redirect header and normalizing url outisde of orig if statement --- .../src/templates/edge-shared/utils.ts | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/packages/runtime/src/templates/edge-shared/utils.ts b/packages/runtime/src/templates/edge-shared/utils.ts index bb315c9554..d352290550 100644 --- a/packages/runtime/src/templates/edge-shared/utils.ts +++ b/packages/runtime/src/templates/edge-shared/utils.ts @@ -8,20 +8,18 @@ export interface FetchEventResult { type NextDataTransform = (data: T) => T -function normalizeDataUrl(redirect: string, url: string | URL) { - const normalizedUrl = new URL(redirect, url) - - if (normalizedUrl.pathname.startsWith('/_next/data/') && normalizedUrl.pathname.endsWith('.json')) { - const paths = normalizedUrl.pathname +function normalizeDataUrl(redirect: string) { + if (redirect.startsWith('/_next/data/') && redirect.includes('.json')) { + const paths = redirect .replace(/^\/_next\/data\//, '') - .replace(/\.json$/, '') + .replace(/\.json/, '') .split('/') const buildId = paths[0] - normalizedUrl.pathname = paths[1] !== 'index' ? `/${paths.slice(1).join('/')}` : '/' + redirect = paths[1] !== 'index' ? `/${paths.slice(1).join('/')}` : '/' } - return normalizedUrl.pathname + normalizedUrl.search + return redirect } /** @@ -263,7 +261,13 @@ export const buildResponse = async ({ // Data requests shouldn;t automatically redirect in the browser (they might be HTML pages): they're handled by the router if (redirect && isDataReq) { res.headers.delete('location') - res.headers.set('x-nextjs-redirect', normalizeDataUrl(redirect, request.url)) + res.headers.set('x-nextjs-redirect', relativizeURL(redirect, request.url)) + } + + const nextRedirect = res.headers.get('x-nextjs-redirect') + + if ( nextRedirect ){ + res.headers.set('x-nextjs-redirect', normalizeDataUrl(nextRedirect)) } if (res.headers.get('x-middleware-next') === '1') { From f09cf7df89e31980f15de99734a93d51d1a55ea6 Mon Sep 17 00:00:00 2001 From: taty2010 Date: Fri, 17 Feb 2023 12:08:10 -0600 Subject: [PATCH 5/8] fix: added ref link --- packages/runtime/src/templates/edge-shared/utils.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/runtime/src/templates/edge-shared/utils.ts b/packages/runtime/src/templates/edge-shared/utils.ts index d352290550..58befc46b6 100644 --- a/packages/runtime/src/templates/edge-shared/utils.ts +++ b/packages/runtime/src/templates/edge-shared/utils.ts @@ -9,6 +9,8 @@ export interface FetchEventResult { type NextDataTransform = (data: T) => T function normalizeDataUrl(redirect: string) { + // If the redirect is a data URL, we need to normalize it. + // next.js code reference: https://github.com/vercel/next.js/blob/canary/packages/next/src/shared/lib/router/utils/get-next-pathname-info.ts#L46 if (redirect.startsWith('/_next/data/') && redirect.includes('.json')) { const paths = redirect .replace(/^\/_next\/data\//, '') @@ -266,7 +268,7 @@ export const buildResponse = async ({ const nextRedirect = res.headers.get('x-nextjs-redirect') - if ( nextRedirect ){ + if (nextRedirect) { res.headers.set('x-nextjs-redirect', normalizeDataUrl(nextRedirect)) } From 5efd7da4759a2e66aace14922932e8a8eea1c30e Mon Sep 17 00:00:00 2001 From: taty2010 Date: Fri, 17 Feb 2023 13:19:05 -0600 Subject: [PATCH 6/8] fix: removing console.log --- test/e2e/modified-tests/middleware-redirects/test/index.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/test/e2e/modified-tests/middleware-redirects/test/index.test.ts b/test/e2e/modified-tests/middleware-redirects/test/index.test.ts index ade93e3bcc..63a96b4d6e 100644 --- a/test/e2e/modified-tests/middleware-redirects/test/index.test.ts +++ b/test/e2e/modified-tests/middleware-redirects/test/index.test.ts @@ -44,7 +44,6 @@ describe('Middleware Redirect', () => { { override: 'internal' }, { redirect: 'manual', headers: { 'x-nextjs-data': '1' } }, ) - console.log('x-nextjs-redirect', res.headers.get('x-nextjs-redirect')) expect(res.headers.get('x-nextjs-redirect')?.endsWith(`/es/new-home?override=internal`)).toEqual(true) expect(res.headers.get('location')).toEqual(null) }) From bb3cb7c292dc1e1071ee2edcef1e891815fed5a2 Mon Sep 17 00:00:00 2001 From: taty2010 Date: Tue, 21 Feb 2023 11:49:07 -0600 Subject: [PATCH 7/8] fix: commenting/reverting changes for testing --- packages/runtime/src/templates/edge-shared/utils.ts | 8 ++++---- .../middleware-redirects/test/index.test.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/runtime/src/templates/edge-shared/utils.ts b/packages/runtime/src/templates/edge-shared/utils.ts index 58befc46b6..186012ac19 100644 --- a/packages/runtime/src/templates/edge-shared/utils.ts +++ b/packages/runtime/src/templates/edge-shared/utils.ts @@ -266,11 +266,11 @@ export const buildResponse = async ({ res.headers.set('x-nextjs-redirect', relativizeURL(redirect, request.url)) } - const nextRedirect = res.headers.get('x-nextjs-redirect') + // const nextRedirect = res.headers.get('x-nextjs-redirect') - if (nextRedirect) { - res.headers.set('x-nextjs-redirect', normalizeDataUrl(nextRedirect)) - } + // if (nextRedirect) { + // res.headers.set('x-nextjs-redirect', normalizeDataUrl(nextRedirect)) + // } if (res.headers.get('x-middleware-next') === '1') { return addMiddlewareHeaders(context.next(), res) diff --git a/test/e2e/modified-tests/middleware-redirects/test/index.test.ts b/test/e2e/modified-tests/middleware-redirects/test/index.test.ts index 63a96b4d6e..57a707e3f0 100644 --- a/test/e2e/modified-tests/middleware-redirects/test/index.test.ts +++ b/test/e2e/modified-tests/middleware-redirects/test/index.test.ts @@ -37,7 +37,7 @@ describe('Middleware Redirect', () => { expect(res.headers.get('location')?.endsWith('/default/about')).toEqual(false) }) - it(`should redirect to data urls with data requests and internal redirects`, async () => { + usuallySkip(`should redirect to data urls with data requests and internal redirects`, async () => { const res = await fetchViaHTTP( next.url, `/_next/data/${next.buildId}/es/old-home.json`, From 9917ec93caf10d5ef3e01f68253178254fb2083d Mon Sep 17 00:00:00 2001 From: taty2010 Date: Tue, 21 Feb 2023 12:31:36 -0600 Subject: [PATCH 8/8] fix: undo "commenting/reverting changes.." --- packages/runtime/src/templates/edge-shared/utils.ts | 8 ++++---- .../middleware-redirects/test/index.test.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/runtime/src/templates/edge-shared/utils.ts b/packages/runtime/src/templates/edge-shared/utils.ts index 186012ac19..bb21ecf596 100644 --- a/packages/runtime/src/templates/edge-shared/utils.ts +++ b/packages/runtime/src/templates/edge-shared/utils.ts @@ -266,11 +266,11 @@ export const buildResponse = async ({ res.headers.set('x-nextjs-redirect', relativizeURL(redirect, request.url)) } - // const nextRedirect = res.headers.get('x-nextjs-redirect') + const nextRedirect = res.headers.get('x-nextjs-redirect') - // if (nextRedirect) { - // res.headers.set('x-nextjs-redirect', normalizeDataUrl(nextRedirect)) - // } + if (nextRedirect && isDataReq) { + res.headers.set('x-nextjs-redirect', normalizeDataUrl(nextRedirect)) + } if (res.headers.get('x-middleware-next') === '1') { return addMiddlewareHeaders(context.next(), res) diff --git a/test/e2e/modified-tests/middleware-redirects/test/index.test.ts b/test/e2e/modified-tests/middleware-redirects/test/index.test.ts index 57a707e3f0..63a96b4d6e 100644 --- a/test/e2e/modified-tests/middleware-redirects/test/index.test.ts +++ b/test/e2e/modified-tests/middleware-redirects/test/index.test.ts @@ -37,7 +37,7 @@ describe('Middleware Redirect', () => { expect(res.headers.get('location')?.endsWith('/default/about')).toEqual(false) }) - usuallySkip(`should redirect to data urls with data requests and internal redirects`, async () => { + it(`should redirect to data urls with data requests and internal redirects`, async () => { const res = await fetchViaHTTP( next.url, `/_next/data/${next.buildId}/es/old-home.json`,