Skip to content

Commit

Permalink
Merge branch 'canary' into bump-react
Browse files Browse the repository at this point in the history
  • Loading branch information
huozhi committed Jun 14, 2022
2 parents 3f6d231 + c501842 commit 2d9078c
Show file tree
Hide file tree
Showing 8 changed files with 91 additions and 8 deletions.
9 changes: 7 additions & 2 deletions packages/next/server/base-server.ts
Expand Up @@ -1216,6 +1216,8 @@ export default abstract class Server<ServerOptions extends Options = Options> {
const isDataReq =
!!query.__nextDataReq && (isSSG || hasServerProps || isServerComponent)

delete query.__nextDataReq

// normalize req.url for SSG paths as it is not exposed
// to getStaticProps and the asPath should not expose /_next/data
if (
Expand All @@ -1227,7 +1229,11 @@ export default abstract class Server<ServerOptions extends Options = Options> {
req.url = this.stripNextDataPath(req.url)
}

if (!!query.__nextDataReq) {
if (
!isServerComponent &&
!!req.headers['x-nextjs-data'] &&
(!res.statusCode || res.statusCode === 200)
) {
res.setHeader(
'x-nextjs-matched-path',
`${query.__nextLocale ? `/${query.__nextLocale}` : ''}${pathname}`
Expand All @@ -1243,7 +1249,6 @@ export default abstract class Server<ServerOptions extends Options = Options> {
return null
}
}
delete query.__nextDataReq

// Don't delete query.__flight__ yet, it still needs to be used in renderToHTML later
const isFlightRequest = Boolean(
Expand Down
2 changes: 1 addition & 1 deletion test/e2e/middleware-general/app/next.config.js
Expand Up @@ -7,7 +7,7 @@ module.exports = {
return [
{
source: '/redirect-1',
destination: '/somewhere-else',
destination: '/somewhere/else',
permanent: false,
},
]
Expand Down
10 changes: 7 additions & 3 deletions test/e2e/middleware-general/test/index.test.ts
Expand Up @@ -129,14 +129,14 @@ describe('Middleware Runtime', () => {
)
expect(res.status).toBe(307)
expect(new URL(res.headers.get('location'), 'http://n').pathname).toBe(
'/somewhere-else'
'/somewhere/else'
)

const browser = await webdriver(next.url, `${locale}/`)
await browser.eval(`next.router.push('/redirect-1')`)
await check(async () => {
const pathname = await browser.eval('location.pathname')
return pathname === '/somewhere-else' ? 'success' : pathname
return pathname === '/somewhere/else' ? 'success' : pathname
}, 'success')
})

Expand All @@ -146,11 +146,13 @@ describe('Middleware Runtime', () => {
expect(await res.text()).toContain('Hello World')

const browser = await webdriver(next.url, `${locale}/`)
await browser.eval('window.beforeNav = 1')
await browser.eval(`next.router.push('/rewrite-1')`)
await check(async () => {
const content = await browser.eval('document.documentElement.innerHTML')
return content.includes('Hello World') ? 'success' : content
}, 'success')
expect(await browser.eval('window.beforeNav')).toBe(1)
})

it('should rewrite correctly for non-SSG/SSP page', async () => {
Expand Down Expand Up @@ -365,7 +367,9 @@ describe('Middleware Runtime', () => {
const res = await fetchViaHTTP(next.url, `/ssr-page`)
const dataRes = await fetchViaHTTP(
next.url,
`/_next/data/${next.buildId}/en/ssr-page.json`
`/_next/data/${next.buildId}/en/ssr-page.json`,
undefined,
{ headers: { 'x-nextjs-data': '1' } }
)
const json = await dataRes.json()
expect(json.pageProps.message).toEqual('Bye Cruel World')
Expand Down
3 changes: 1 addition & 2 deletions test/e2e/middleware-redirects/test/index.test.ts
Expand Up @@ -146,8 +146,7 @@ describe('Middleware Redirect', () => {
const browser = await webdriver(next.url, `${locale}`)
await browser.elementByCss('#link-to-api-with-locale').click()
await browser.waitForCondition('window.location.pathname === "/api/ok"')
const body = await browser.elementByCss('body').text()
expect(body).toBe('ok')
await check(() => browser.elementByCss('body').text(), 'ok')
})
}
})
10 changes: 10 additions & 0 deletions test/e2e/middleware-rewrites/app/middleware.js
Expand Up @@ -22,6 +22,16 @@ export async function middleware(request) {
)
}

if (url.pathname === '/rewrite-to-beforefiles-rewrite') {
url.pathname = '/beforefiles-rewrite'
return NextResponse.rewrite(url)
}

if (url.pathname === '/rewrite-to-afterfiles-rewrite') {
url.pathname = '/afterfiles-rewrite'
return NextResponse.rewrite(url)
}

if (url.pathname.startsWith('/to-blog')) {
const slug = url.pathname.split('/').pop()
url.pathname = `/fallback-true-blog/${slug}`
Expand Down
17 changes: 17 additions & 0 deletions test/e2e/middleware-rewrites/app/next.config.js
Expand Up @@ -3,4 +3,21 @@ module.exports = {
locales: ['ja', 'en', 'fr', 'es'],
defaultLocale: 'en',
},
rewrites() {
return {
beforeFiles: [
{
source: '/beforefiles-rewrite',
destination: '/ab-test/a',
},
],
afterFiles: [
{
source: '/afterfiles-rewrite',
destination: '/ab-test/b',
},
],
fallback: [],
}
},
}
12 changes: 12 additions & 0 deletions test/e2e/middleware-rewrites/app/pages/index.js
Expand Up @@ -15,6 +15,18 @@ export default function Home() {
<a id="rewrite-me-to-about">Rewrite me to about</a>
</Link>
<div />
<Link href="/rewrite-to-beforefiles-rewrite">
<a id="rewrite-to-beforefiles-rewrite">
Rewrite me to beforeFiles Rewrite
</a>
</Link>
<div />
<Link href="/rewrite-to-afterfiles-rewrite">
<a id="rewrite-to-afterfiles-rewrite">
Rewrite me to afterFiles Rewrite
</a>
</Link>
<div />
<Link href="/rewrite-me-to-vercel">
<a>Rewrite me to Vercel</a>
</Link>
Expand Down
36 changes: 36 additions & 0 deletions test/e2e/middleware-rewrites/test/index.test.ts
Expand Up @@ -24,6 +24,7 @@ describe('Middleware Rewrite', () => {
tests()
testsWithLocale()
testsWithLocale('/fr')

function tests() {
// TODO: middleware effect headers aren't available here
it.skip('includes the locale in rewrites by default', async () => {
Expand Down Expand Up @@ -271,6 +272,41 @@ describe('Middleware Rewrite', () => {
await browser.elementByCss('#link-en2').click()
await browser.waitForElementByCss('.en')
})

it('should allow to rewrite to a `beforeFiles` rewrite config', async () => {
const res = await fetchViaHTTP(
next.url,
`/rewrite-to-beforefiles-rewrite`
)
expect(res.status).toBe(200)
expect(await res.text()).toContain('Welcome Page A')

const browser = await webdriver(next.url, '/')
await browser.elementByCss('#rewrite-to-beforefiles-rewrite').click()
await check(
() => browser.eval('document.documentElement.innerHTML'),
/Welcome Page A/
)
expect(await browser.eval('window.location.pathname')).toBe(
`/rewrite-to-beforefiles-rewrite`
)
})

it('should allow to rewrite to a `afterFiles` rewrite config', async () => {
const res = await fetchViaHTTP(next.url, `/rewrite-to-afterfiles-rewrite`)
expect(res.status).toBe(200)
expect(await res.text()).toContain('Welcome Page B')

const browser = await webdriver(next.url, '/')
await browser.elementByCss('#rewrite-to-afterfiles-rewrite').click()
await check(
() => browser.eval('document.documentElement.innerHTML'),
/Welcome Page B/
)
expect(await browser.eval('window.location.pathname')).toBe(
`/rewrite-to-afterfiles-rewrite`
)
})
}

function testsWithLocale(locale = '') {
Expand Down

0 comments on commit 2d9078c

Please sign in to comment.