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

fix: handle optional catchall parameters properly when deployed #74562

Conversation

wyattjoh
Copy link
Member

@wyattjoh wyattjoh commented Jan 6, 2025

Previously, we had code responsible for parsing and handling the x-now-route-matches header (sent by Vercel) that included the route matches used for parameter parsing that only read from the named parameters if they were all present. This doesn't apply to routes with optional parameters (such as [[...rest]]), so it wasn't utilizing that matching mechanism. It previously fell back onto the second stage of parsing that utilized numeric based group matching, but this was recently changed on Vercel, so the fallback no longer applies for Next.js applications that are running on 15+.

Closes https://linear.app/vercel/issue/NEXT-3948

Copy link
Member Author

wyattjoh commented Jan 6, 2025

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

@ijjk
Copy link
Member

ijjk commented Jan 6, 2025

Tests Passed

@ijjk
Copy link
Member

ijjk commented Jan 6, 2025

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary vercel/next.js 01-06-fix_handle_optional_catchall_parameters_properly_on_vercel Change
buildDuration 31.8s 27.5s N/A
buildDurationCached 32.8s 25.1s N/A
nodeModulesSize 417 MB 417 MB N/A
nextStartRea..uration (ms) 738ms 848ms ⚠️ +110ms
Client Bundles (main, webpack)
vercel/next.js canary vercel/next.js 01-06-fix_handle_optional_catchall_parameters_properly_on_vercel Change
1187-HASH.js gzip 52.6 kB 52.6 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 N/A
framework-HASH.js gzip 57.5 kB 57.5 kB N/A
main-app-HASH.js gzip 232 B 235 B N/A
main-HASH.js gzip 34.1 kB 34.1 kB N/A
webpack-HASH.js gzip 1.71 kB 1.71 kB N/A
Overall change 0 B 0 B
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js 01-06-fix_handle_optional_catchall_parameters_properly_on_vercel 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 01-06-fix_handle_optional_catchall_parameters_properly_on_vercel 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 01-06-fix_handle_optional_catchall_parameters_properly_on_vercel 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 01-06-fix_handle_optional_catchall_parameters_properly_on_vercel Change
index.html gzip 523 B 523 B
link.html gzip 539 B 537 B N/A
withRouter.html gzip 519 B 520 B N/A
Overall change 523 B 523 B
Edge SSR bundle Size
vercel/next.js canary vercel/next.js 01-06-fix_handle_optional_catchall_parameters_properly_on_vercel Change
edge-ssr.js gzip 128 kB 128 kB N/A
page.js gzip 206 kB 206 kB N/A
Overall change 0 B 0 B
Middleware size
vercel/next.js canary vercel/next.js 01-06-fix_handle_optional_catchall_parameters_properly_on_vercel Change
middleware-b..fest.js gzip 668 B 669 B N/A
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 844 B 844 B
Next Runtimes
vercel/next.js canary vercel/next.js 01-06-fix_handle_optional_catchall_parameters_properly_on_vercel 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 364 kB 364 kB
app-page-exp..prod.js gzip 129 kB 129 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 352 kB 352 kB
app-page.run..prod.js gzip 125 kB 125 kB
app-route-ex...dev.js gzip 37.5 kB 37.5 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.53 MB 1.53 MB
build cache Overall increase ⚠️
vercel/next.js canary vercel/next.js 01-06-fix_handle_optional_catchall_parameters_properly_on_vercel Change
0.pack gzip 2.08 MB 2.08 MB N/A
index.pack gzip 74.1 kB 74.9 kB ⚠️ +758 B
Overall change 74.1 kB 74.9 kB ⚠️ +758 B
Diff details
Diff for middleware.js

Diff too large to display

Diff for edge-ssr.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: d2eb952

@wyattjoh wyattjoh force-pushed the 01-06-fix_handle_optional_catchall_parameters_properly_on_vercel branch 2 times, most recently from e393e49 to 620baa1 Compare January 7, 2025 19:03
@eps1lon
Copy link
Member

eps1lon commented Jan 7, 2025

types are complaining.

Can we add a normal e2e test as well? That would be tested on vercel.com via deploy test nowadays so it should fail without this change.

@wyattjoh wyattjoh force-pushed the 01-06-fix_handle_optional_catchall_parameters_properly_on_vercel branch from 620baa1 to 8481e19 Compare January 7, 2025 19:37
Copy link
Member

@eps1lon eps1lon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it have been possible for other hosting providers to massage x-now-route-matches to work around this bug?

@@ -236,7 +236,7 @@ describe('Required Server Files', () => {
{
headers: {
'x-matched-path': '/fallback/first',
'x-now-route-matches': '1=first',
'x-now-route-matches': 'nxtPslug=first',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So we already had test showing symptoms of the bug?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is specific to the way that Vercel handles the matches. We used to previously support both the index based and name based matches, but this isn't supported on Vercel anymore, which is what I suspect cause this to surface.

@wyattjoh wyattjoh force-pushed the 01-06-fix_handle_optional_catchall_parameters_properly_on_vercel branch from 8481e19 to d2eb952 Compare January 7, 2025 20:05
@wyattjoh wyattjoh marked this pull request as ready for review January 7, 2025 21:17
@wyattjoh wyattjoh merged commit 6784575 into canary Jan 7, 2025
126 of 131 checks passed
@wyattjoh wyattjoh deleted the 01-06-fix_handle_optional_catchall_parameters_properly_on_vercel branch January 7, 2025 21:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants