Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: added rewrite headers after user-supplied rewrites #74776

Draft
wants to merge 1 commit into
base: canary
Choose a base branch
from

Conversation

wyattjoh
Copy link
Member

@wyattjoh wyattjoh commented Jan 10, 2025

Next.js's client router needs to know the pathname and query that the request was rewritten to in order to facilitate reuse of static RSC payloads generated from fallbacks. This takes the form of additional headers being sent back on the response that includes the correct rewritten pathname that later the client can take into account when generating the client route key.

Copy link
Member Author

This stack of pull requests is managed by Graphite. Learn more about stacking.

@ijjk
Copy link
Member

ijjk commented Jan 10, 2025

Stats from current PR

Default Build
General Overall increase ⚠️
vercel/next.js canary vercel/next.js feat/rewrite-headers Change
buildDuration 24.8s 22.2s N/A
buildDurationCached 21.2s 18.3s N/A
nodeModulesSize 417 MB 417 MB ⚠️ +27.1 kB
nextStartRea..uration (ms) 576ms 575ms N/A
Client Bundles (main, webpack)
vercel/next.js canary vercel/next.js feat/rewrite-headers Change
5306-HASH.js gzip 53.3 kB 53.4 kB N/A
8276.HASH.js gzip 169 B 168 B N/A
8377-HASH.js gzip 5.44 kB 5.44 kB N/A
bccd1874-HASH.js gzip 53 kB 53 kB
framework-HASH.js gzip 57.5 kB 57.5 kB N/A
main-app-HASH.js gzip 240 B 242 B N/A
main-HASH.js gzip 34.2 kB 34.2 kB N/A
webpack-HASH.js gzip 1.71 kB 1.71 kB N/A
Overall change 53 kB 53 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js feat/rewrite-headers Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Overall change 39.4 kB 39.4 kB
Client Pages
vercel/next.js canary vercel/next.js feat/rewrite-headers Change
_app-HASH.js gzip 193 B 193 B
_error-HASH.js gzip 193 B 193 B
amp-HASH.js gzip 512 B 510 B N/A
css-HASH.js gzip 343 B 342 B N/A
dynamic-HASH.js gzip 1.84 kB 1.84 kB
edge-ssr-HASH.js gzip 265 B 265 B
head-HASH.js gzip 363 B 362 B N/A
hooks-HASH.js gzip 393 B 392 B N/A
image-HASH.js gzip 4.57 kB 4.57 kB N/A
index-HASH.js gzip 268 B 268 B
link-HASH.js gzip 2.35 kB 2.34 kB N/A
routerDirect..HASH.js gzip 328 B 328 B
script-HASH.js gzip 397 B 397 B
withRouter-HASH.js gzip 323 B 326 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 3.59 kB 3.59 kB
Client Build Manifests
vercel/next.js canary vercel/next.js feat/rewrite-headers Change
_buildManifest.js gzip 749 B 747 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary vercel/next.js feat/rewrite-headers Change
index.html gzip 523 B 524 B N/A
link.html gzip 537 B 538 B N/A
withRouter.html gzip 518 B 520 B N/A
Overall change 0 B 0 B
Edge SSR bundle Size
vercel/next.js canary vercel/next.js feat/rewrite-headers Change
edge-ssr.js gzip 129 kB 129 kB N/A
page.js gzip 207 kB 207 kB N/A
Overall change 0 B 0 B
Middleware size
vercel/next.js canary vercel/next.js feat/rewrite-headers Change
middleware-b..fest.js gzip 670 B 670 B
middleware-r..fest.js gzip 155 B 156 B N/A
middleware.js gzip 31.2 kB 31.2 kB N/A
edge-runtime..pack.js gzip 844 B 844 B
Overall change 1.51 kB 1.51 kB
Next Runtimes
vercel/next.js canary vercel/next.js feat/rewrite-headers Change
274-experime...dev.js gzip 322 B 322 B
274.runtime.dev.js gzip 314 B 314 B
app-page-exp...dev.js gzip 369 kB 369 kB N/A
app-page-exp..prod.js gzip 130 kB 130 kB
app-page-tur..prod.js gzip 142 kB 142 kB
app-page-tur..prod.js gzip 138 kB 138 kB
app-page.run...dev.js gzip 357 kB 357 kB
app-page.run..prod.js gzip 126 kB 126 kB
app-route-ex...dev.js gzip 37.6 kB 37.6 kB
app-route-ex..prod.js gzip 25.6 kB 25.6 kB
app-route-tu..prod.js gzip 25.6 kB 25.6 kB
app-route-tu..prod.js gzip 25.4 kB 25.4 kB
app-route.ru...dev.js gzip 39.2 kB 39.2 kB
app-route.ru..prod.js gzip 25.4 kB 25.4 kB
pages-api-tu..prod.js gzip 9.69 kB 9.69 kB
pages-api.ru...dev.js gzip 11.6 kB 11.6 kB
pages-api.ru..prod.js gzip 9.68 kB 9.68 kB
pages-turbo...prod.js gzip 21.7 kB 21.7 kB
pages.runtim...dev.js gzip 27.5 kB 27.5 kB
pages.runtim..prod.js gzip 21.7 kB 21.7 kB
server.runti..prod.js gzip 916 kB 916 kB N/A
Overall change 1.17 MB 1.17 MB
build cache
vercel/next.js canary vercel/next.js feat/rewrite-headers Change
0.pack gzip 2.09 MB 2.09 MB N/A
index.pack gzip 75.5 kB 74.6 kB N/A
Overall change 0 B 0 B
Diff details
Diff for middleware.js

Diff too large to display

Diff for edge-ssr.js

Diff too large to display

Diff for 5306-HASH.js

Diff too large to display

Diff for main-HASH.js

Diff too large to display

Diff for server.runtime.prod.js

Diff too large to display

Commit: b7edf06

@ijjk
Copy link
Member

ijjk commented Jan 10, 2025

Failing test suites

Commit: b7edf06

pnpm test test/integration/dynamic-routing/test/index.test.js

  • Dynamic Routing > production mode > should output a routes-manifest correctly
Expand output

● Dynamic Routing › production mode › should output a routes-manifest correctly

expect(received).toEqual(expected) // deep equality

- Expected  - 0
+ Received  + 4

@@ -196,10 +196,14 @@
      },
    ],
    "headers": Array [],
    "pages404": true,
    "redirects": ArrayContaining [],
+   "rewriteHeaders": Object {
+     "pathHeader": "x-nextjs-rewritten-path",
+     "queryHeader": "x-nextjs-rewritten-query",
+   },
    "rewrites": Array [],
    "rsc": Object {
      "contentTypeHeader": "text/x-component",
      "didPostponeHeader": "x-nextjs-postponed",
      "header": "RSC",

  1251 |       }
  1252 |
> 1253 |       expect(manifest).toEqual({
       |                        ^
  1254 |         version: 3,
  1255 |         pages404: true,
  1256 |         caseSensitive: false,

  at Object.toEqual (integration/dynamic-routing/test/index.test.js:1253:24)

Read more about building and testing Next.js in contributing.md.

pnpm test test/integration/dynamic-routing/test/middleware.test.js (turbopack)

  • Dynamic Routing > production mode > should output a routes-manifest correctly
Expand output

● Dynamic Routing › production mode › should output a routes-manifest correctly

expect(received).toEqual(expected) // deep equality

- Expected  - 0
+ Received  + 4

@@ -196,10 +196,14 @@
      },
    ],
    "headers": Array [],
    "pages404": true,
    "redirects": ArrayContaining [],
+   "rewriteHeaders": Object {
+     "pathHeader": "x-nextjs-rewritten-path",
+     "queryHeader": "x-nextjs-rewritten-query",
+   },
    "rewrites": Array [],
    "rsc": Object {
      "contentTypeHeader": "text/x-component",
      "didPostponeHeader": "x-nextjs-postponed",
      "header": "RSC",

  1251 |       }
  1252 |
> 1253 |       expect(manifest).toEqual({
       |                        ^
  1254 |         version: 3,
  1255 |         pages404: true,
  1256 |         caseSensitive: false,

  at Object.toEqual (integration/dynamic-routing/test/index.test.js:1253:24)

Read more about building and testing Next.js in contributing.md.

pnpm test test/integration/custom-routes/test/index.test.js

  • Custom routes > production mode > should output routes-manifest successfully
Expand output

● Custom routes › production mode › should output routes-manifest successfully

expect(received).toEqual(expected) // deep equality

- Expected  - 0
+ Received  + 4

@@ -608,10 +608,14 @@
        "regex": "^(?!\\/_next)\\/has-redirect-7(?:\\/)?$",
        "source": "/has-redirect-7",
        "statusCode": 307,
      },
    ],
+   "rewriteHeaders": Object {
+     "pathHeader": "x-nextjs-rewritten-path",
+     "queryHeader": "x-nextjs-rewritten-query",
+   },
    "rewrites": Object {
      "afterFiles": Array [
        Object {
          "destination": "http://localhost:45361/_next/webpack-hmr?page=/about",
          "regex": "^\\/to-websocket(?:\\/)?$",

  1496 |       }
  1497 |
> 1498 |       expect(manifest).toEqual({
       |                        ^
  1499 |         version: 3,
  1500 |         pages404: true,
  1501 |         caseSensitive: true,

  at Object.toEqual (integration/custom-routes/test/index.test.js:1498:24)

Read more about building and testing Next.js in contributing.md.

__NEXT_EXPERIMENTAL_PPR=true pnpm test-dev test/e2e/app-dir/actions/app-action.test.ts (PPR)

  • app-dir action handling > should forward action request to a worker that contains the action handler (node)
Expand output

● app-dir action handling › should forward action request to a worker that contains the action handler (node)

page.waitForSelector: Timeout 60000ms exceeded.
Call log:
  - waiting for locator('#other-page')

  423 |     return this.chain(() => {
  424 |       return page
> 425 |         .waitForSelector(selector, { timeout, state: 'attached' })
      |          ^
  426 |         .then(async (el) => {
  427 |           // it seems selenium waits longer and tests rely on this behavior
  428 |           // so we wait for the load event fire before returning

  at waitForSelector (lib/browsers/playwright.ts:425:10)
  at e2e/app-dir/actions/app-action.test.ts:862:7
  at Proxy.chain (lib/browsers/base.ts:17:23)
  at Proxy.chain (lib/browsers/playwright.ts:423:17)
  at waitForElementByCss (e2e/app-dir/actions/app-action.test.ts:865:10)

Read more about building and testing Next.js in contributing.md.

pnpm test-start test/e2e/persistent-caching/persistent-caching.test.ts

  • persistent-caching > should allow to change files while stopped
Expand output

● persistent-caching › should allow to change files while stopped

thrown: "Exceeded timeout of 120000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  60 |   })
  61 |
> 62 |   it('should allow to change files while stopped', async () => {
     |   ^
  63 |     {
  64 |       const browser = await next.browser('/')
  65 |       expect(await browser.elementByCss('p').text()).toBe('hello world')

  at it (e2e/persistent-caching/persistent-caching.test.ts:62:3)
  at Object.describe (e2e/persistent-caching/persistent-caching.test.ts:4:1)

Read more about building and testing Next.js in contributing.md.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants