Skip to content

[16.3] testmode: Fix infinite recursion in testmode passthrough fetch - #97691

Merged
mischnic merged 2 commits into
next-16-3from
mischnic/passport-testmode
Aug 28, 2026
Merged

mischnic merged 2 commits into
next-16-3from
mischnic/passport-testmode

Conversation

@mischnic

Copy link
Copy Markdown
Member

Backport #96525

With `experimental.testProxy` on, `@mswjs/interceptors` (switched to
socket-level interception in #96059) also catches the passthrough
`fetch` that `handleFetch` makes for non-test requests. That request has
no `next-test-internal` marker, so the interceptor calls `handleFetch`
again, takes the passthrough branch again, and loops until it errors. So
any server-side request made outside a test context never resolves
during a test run.

This adds the `next-test-internal` marker to the passthrough request,
and to the `continue` case that has the same problem. It is the guard
#96059 already added for the proxy-protocol request, so the request
reaches the real server instead of being intercepted again.
@github-actions

github-actions Bot commented Aug 21, 2026 •

Copy link
Copy Markdown
Contributor

Tests Passed

Commit: 96297b8

@github-actions

github-actions Bot commented Aug 21, 2026 •

Copy link
Copy Markdown
Contributor

Stats from current PR

🔴 1 regression, 1 improvement

Metric Canary PR Change Trend
Webpack Build Time 24.524s 25.723s 🔴 +1.199s (+5%) ▁▂▁▂▁
node_modules Size 557 MB 557 MB 🟢 240 kB (0%) ▁████
📊 All Metrics
📖 Metrics Glossary

Dev Server Metrics:

  • Listen = TCP port starts accepting connections
  • First Request = HTTP server returns successful response
  • Cold = Fresh build (no cache)
  • Warm = With cached build artifacts

Build Metrics:

  • Fresh = Clean build (no .next directory)
  • Cached = With existing .next directory

Change Thresholds:

  • Time: Changes < 50ms AND < 10%, OR < 2% are insignificant
  • Size: Changes < 1KB AND < 1% are insignificant
  • All other changes are flagged to catch regressions

⚡ Dev Server

Metric Canary PR Change Trend
Cold (Listen) 812ms 813ms ✓ █████
Cold (Ready in log) 809ms 786ms ✓ █▆▇▃▆
Cold (First Request) 1.300s 1.292s ✓ █▅▆▁▄
Warm (Listen) 813ms 812ms ✓ █████
Warm (Ready in log) 800ms 779ms ✓ █▆▅▄▅
Warm (First Request) 1.272s 1.285s ✓ █▄▂▁▃
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 813ms 813ms ✓ ▁▁▁▁▁
Cold (Ready in log) 813ms 795ms ✓ ▁▁▁▁▁
Cold (First Request) 3.398s 3.446s ✓ ▁▂▁▂▂
Warm (Listen) 863ms 813ms ✓ ▁▁▁▂▁
Warm (Ready in log) 827ms 792ms ✓ ▁▁▁▂▁
Warm (First Request) 3.505s 3.466s ✓ ▁▁▁▂▁

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 5.920s 5.735s ✓ ▆▂▅▁▃
Cached Build 2.950s 2.901s ✓ ▇▂▄▁▂
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 24.524s 25.723s 🔴 +1.199s (+5%) ▁▂▁▂▁
Cached Build 25.272s 25.485s ✓ ▁▂▁▂▁
node_modules Size 557 MB 557 MB 🟢 240 kB (0%) ▁████
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles
Canary PR Change
017_4moyv5m34.js gzip 117 B N/A -
05jocc85-b73_.js gzip 341 B N/A -
0cz1d0mv5g_q7.js gzip 39.4 kB 39.4 kB ✓
0e5lgz-xcf6ln.js gzip 273 B N/A -
0enhddgqs2dl-.js gzip 265 B N/A -
0h34mejwa_7pd.js gzip 354 B N/A -
0w853zxni3ro0.js gzip 1.36 kB N/A -
13lq2aw3_0bgw.js gzip 3.52 kB N/A -
19ll0d77yn0fq.js gzip 71.5 kB N/A -
1drifx6-oqf3q.js gzip 5.7 kB N/A -
1elt1qium-r2m.css gzip 115 B 115 B ✓
1m5vdnlf0deiv.js gzip 411 B N/A -
1nigpy_mr0xvj.js gzip 339 B N/A -
1p0l8mn2wz5f2.js gzip 1.97 kB N/A -
1ph_nbsm967ot.js gzip 152 B N/A -
1sqoyy39jpgkq.js gzip 121 B N/A -
1tf1phijqlx9j.js gzip 220 B 220 B ✓
2-54v5vj7orwp.js gzip 46.8 kB N/A -
2b05_424u1zq-.js gzip 120 B N/A -
2ca40xittx95r.js gzip 8.75 kB N/A -
2kci0vnt-49o-.js gzip 113 B N/A -
2rtriq9lc6zj-.js gzip 116 B N/A -
2sxgl_rcrrn_p.js gzip 399 B N/A -
2vt62i17bhbdu.js gzip 2.35 kB N/A -
33ykhou7tl-4h.js gzip 7.53 kB N/A -
342di-crrg9kq.js gzip 119 B N/A -
36hfc2_979aw2.js gzip 119 B N/A -
38wfp6jjrrdfm.js gzip 131 B N/A -
3dl1ilk37-30g.js gzip 117 B N/A -
3h0us7yy7bd_o.js gzip 13.1 kB N/A -
3kvxagoobts7h.js gzip 117 B N/A -
3p99hd9vwe6ae.js gzip 13 kB N/A -
3r0475panhk6m.js gzip 123 B N/A -
3s0i-weykgzrt.js gzip 125 B N/A -
3vjosdbddykpw.js gzip 5.88 kB N/A -
3wijk2ywqgsv9.js gzip 2.52 kB N/A -
3xuguv9lsoqw7.js gzip 65.5 kB N/A -
41u5s3oe2-erp.js gzip 2.29 kB N/A -
turbopack-0d..9ejy.js gzip 3.74 kB N/A -
044klqrr8nvj9.js gzip N/A 156 B -
06_gnmnftdzue.js gzip N/A 159 B -
070i4ykf3d62z.js gzip N/A 8.7 kB -
0agv3-x0j9qy3.js gzip N/A 10.3 kB -
0fp4xgd37m5-d.js gzip N/A 3.65 kB -
0jwho9fkrb_t3.js gzip N/A 2.29 kB -
0wg1cc2wbyjd6.js gzip N/A 8.77 kB -
10pjb_bgptept.js gzip N/A 169 B -
14j95hw2e7a3z.js gzip N/A 8.74 kB -
17oe55cu76cd7.js gzip N/A 450 B -
17p403lgr5ln1.js gzip N/A 154 B -
19g-n88txet3y.js gzip N/A 158 B -
1cpvv20u8o1r_.js gzip N/A 65.6 kB -
1frm88k70_rxf.js gzip N/A 8.78 kB -
1npowqp33onnw.js gzip N/A 5.76 kB -
1u3798yd-l1sa.js gzip N/A 155 B -
1ynlcmklb8_j3.js gzip N/A 9.45 kB -
21rbomn5ucvi9.js gzip N/A 7.45 kB -
26zlqq1y1nriu.js gzip N/A 155 B -
278ks6lhdrct8.js gzip N/A 155 B -
2a_p4b_g75xdo.js gzip N/A 8.8 kB -
2heyngbo5q5qr.js gzip N/A 157 B -
2jllau6q9xium.js gzip N/A 13.7 kB -
2kolt5lwxt8o0.js gzip N/A 10 kB -
2lpk5_hknut8q.js gzip N/A 13.1 kB -
2p0a0fr4ydefu.js gzip N/A 8.7 kB -
2p9-5diwx5gt6.js gzip N/A 10.6 kB -
2ri2op7pxiwax.js gzip N/A 161 B -
2ugc69z0t0ypz.js gzip N/A 1.46 kB -
3-vm_41zkez35.js gzip N/A 157 B -
31c114eqt46uo.js gzip N/A 153 B -
3crtg4i2per05.js gzip N/A 8.74 kB -
3ghtbhrse9p63.js gzip N/A 8.78 kB -
3naumt_z816bn.js gzip N/A 46.7 kB -
3q0h3yzsw1g9v.js gzip N/A 13.2 kB -
3v92dfhzrgovy.js gzip N/A 155 B -
3vt70rl0x3c-y.js gzip N/A 71.4 kB -
turbopack-04..snm3.js gzip N/A 3.88 kB -
turbopack-04..yuws.js gzip N/A 3.86 kB -
turbopack-0a..4yl2.js gzip N/A 3.86 kB -
turbopack-0y..ahid.js gzip N/A 3.86 kB -
turbopack-11..b08s.js gzip N/A 3.86 kB -
turbopack-26.._52u.js gzip N/A 3.86 kB -
turbopack-26..u83j.js gzip N/A 3.86 kB -
turbopack-2m..rcs-.js gzip N/A 3.86 kB -
turbopack-2y..eyhn.js gzip N/A 3.86 kB -
turbopack-2z..e0ao.js gzip N/A 3.86 kB -
turbopack-32..1y5g.js gzip N/A 3.84 kB -
turbopack-3i..ocw9.js gzip N/A 3.86 kB -
turbopack-3l..sqre.js gzip N/A 3.86 kB -
turbopack-40..xv0f.js gzip N/A 3.86 kB -
Total 299 kB 451 kB ⚠️ +152 kB

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 1.02 kB 778 B 🟢 246 B (-24%)
Total 1.02 kB 778 B ✅ -246 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 846 B 434 B 🟢 412 B (-49%)
Total 846 B 434 B ✅ -412 B
Build Cache
Canary PR Change
00000001.sst gzip 10.1 MB 14.4 MB 🔴 +4.33 MB (+43%)
00000002.sst gzip 12.8 MB 13 MB 🔴 +211 kB (+2%)
00000003.sst gzip 14.7 MB 14.9 MB 🔴 +204 kB (+1%)
00000004.sst gzip 12.8 MB 13.2 MB 🔴 +368 kB (+3%)
00000005.sst gzip 14.6 MB 10.3 MB 🟢 4.25 MB (-29%)
00000006.sst gzip 2.75 MB 2.84 MB 🔴 +83.7 kB (+3%)
00000007.sst gzip 59 B 59 B ✓
00000008.meta gzip 89 B 89 B ✓
00000009.meta gzip 297 kB 298 kB ✓
00000010.meta gzip 297 kB 299 kB ✓
00000011.meta gzip 297 kB 298 kB ✓
00000012.sst gzip 52.8 kB 52.5 kB ✓
00000013.sst gzip 1.76 MB 1.85 MB 🔴 +87.7 kB (+5%)
00000014.sst gzip 59 B 59 B ✓
00000015.meta gzip 116 B 116 B ✓
00000016.meta gzip 326 kB 324 kB ✓
00000017.meta gzip 404 kB 405 kB ✓
00000018.sst gzip 53.7 kB 53.1 kB 🟢 551 B (-1%)
00000019.sst gzip 1.35 MB 1.39 MB 🔴 +31.5 kB (+2%)
00000020.sst gzip 59 B 59 B ✓
00000021.meta gzip 116 B 116 B ✓
00000022.meta gzip 326 kB 324 kB ✓
00000023.meta gzip 372 kB 370 kB ✓
00000024.sst gzip 53.8 kB 53.1 kB 🟢 645 B (-1%)
00000025.sst gzip 1.35 MB 1.39 MB 🔴 +31.3 kB (+2%)
00000026.sst gzip 59 B 59 B ✓
00000027.meta gzip 116 B 116 B ✓
00000028.meta gzip 326 kB 324 kB ✓
00000029.meta gzip 372 kB 370 kB ✓
00000030.sst gzip 53 kB 52.5 kB ✓
00000031.sst gzip 1.35 MB 1.39 MB 🔴 +31.8 kB (+2%)
00000032.sst gzip 59 B 59 B ✓
00000033.meta gzip 116 B 116 B ✓
00000034.meta gzip 326 kB 324 kB ✓
00000035.meta gzip 372 kB 370 kB ✓
00000036.sst gzip 53.7 kB 52.9 kB 🟢 715 B (-1%)
00000037.sst gzip 1.35 MB 1.39 MB 🔴 +31.4 kB (+2%)
00000038.sst gzip 59 B 59 B ✓
00000039.meta gzip 116 B 116 B ✓
00000040.meta gzip 326 kB 324 kB ✓
00000041.meta gzip 372 kB 370 kB ✓
CURRENT gzip 94 B 94 B ✓
LOG gzip 662 B 665 B ✓
Total 79.6 MB 80.7 MB ⚠️ +1.14 MB

📦 Webpack

Client

Main Bundles
Canary PR Change
3322-HASH.js gzip 65.7 kB N/A -
4191.HASH.js gzip 169 B N/A -
9784-HASH.js gzip 5.6 kB N/A -
b1ad9f4c-HASH.js gzip 63.5 kB N/A -
framework-HASH.js gzip 59.7 kB 59.7 kB ✓
main-app-HASH.js gzip 252 B 253 B ✓
main-HASH.js gzip 39.8 kB 40 kB ✓
webpack-HASH.js gzip 1.68 kB 1.68 kB ✓
3577.HASH.js gzip N/A 168 B -
578-HASH.js gzip N/A 66.2 kB -
8590-HASH.js gzip N/A 5.64 kB -
9750-HASH.js gzip N/A 4.72 kB -
a8984546-HASH.js gzip N/A 63.2 kB -
Total 236 kB 242 kB ⚠️ +5.14 kB
Polyfills
Canary PR Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB ✓
Total 39.4 kB 39.4 kB ✓
Pages
Canary PR Change
_app-HASH.js gzip 194 B 193 B ✓
_error-HASH.js gzip 181 B 182 B ✓
css-HASH.js gzip 334 B 331 B ✓
dynamic-HASH.js gzip 1.81 kB 1.81 kB ✓
edge-ssr-HASH.js gzip 255 B 253 B ✓
head-HASH.js gzip 349 B 351 B ✓
hooks-HASH.js gzip 382 B 384 B ✓
image-HASH.js gzip 5.05 kB 582 B 🟢 4.47 kB (-88%)
index-HASH.js gzip 260 B 259 B ✓
link-HASH.js gzip 2.48 kB 2.48 kB ✓
routerDirect..HASH.js gzip 317 B 318 B ✓
script-HASH.js gzip 384 B 386 B ✓
withRouter-HASH.js gzip 316 B 315 B ✓
1afbb74e6ecf..834.css gzip 106 B 106 B ✓
Total 12.4 kB 7.95 kB ✅ -4.48 kB

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 128 kB 128 kB ✓
page.js gzip 293 kB 295 kB ✓
Total 421 kB 423 kB ⚠️ +1.99 kB
Middleware
Canary PR Change
middleware-b..fest.js gzip 599 B 618 B 🔴 +19 B (+3%)
middleware-r..fest.js gzip 156 B 156 B ✓
middleware.js gzip 45.7 kB 45.6 kB ✓
edge-runtime..pack.js gzip 842 B 842 B ✓
Total 47.3 kB 47.3 kB ✓
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 699 B 718 B 🔴 +19 B (+3%)
Total 699 B 718 B ⚠️ +19 B
Build Cache
Canary PR Change
0.pack gzip 4.8 MB 4.92 MB 🔴 +125 kB (+3%)
index.pack gzip 124 kB 123 kB ✓
index.pack.old gzip 123 kB 122 kB ✓
Total 5.04 MB 5.17 MB ⚠️ +123 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 375 kB 374 kB ✓
app-page-exp..prod.js gzip 206 kB 206 kB ✓
app-page-tur...dev.js gzip 374 kB 373 kB ✓
app-page-tur..prod.js gzip 206 kB 206 kB ✓
app-page-tur...dev.js gzip 370 kB 370 kB ✓
app-page-tur..prod.js gzip 204 kB 204 kB ✓
app-page.run...dev.js gzip 371 kB 370 kB ✓
app-page.run..prod.js gzip 204 kB 204 kB ✓
app-route-ex...dev.js gzip 82.6 kB 83.5 kB 🔴 +902 B (+1%)
app-route-ex..prod.js gzip 55.7 kB 56.5 kB 🔴 +834 B (+1%)
app-route-tu...dev.js gzip 82.6 kB 83.5 kB 🔴 +898 B (+1%)
app-route-tu..prod.js gzip 55.7 kB 56.5 kB 🔴 +830 B (+1%)
app-route-tu...dev.js gzip 82.2 kB 83.1 kB 🔴 +896 B (+1%)
app-route-tu..prod.js gzip 55.4 kB 56.3 kB 🔴 +842 B (+2%)
app-route.ru...dev.js gzip 82.2 kB 83.1 kB 🔴 +895 B (+1%)
app-route.ru..prod.js gzip 55.4 kB 56.3 kB 🔴 +847 B (+2%)
dev-validati...dev.js gzip 134 kB 133 kB ✓
dev-validati...dev.js gzip 134 kB 133 kB ✓
dev-validati...dev.js gzip 132 kB 131 kB ✓
dev-validati...dev.js gzip 132 kB 131 kB ✓
dist_client_...dev.js gzip 324 B 324 B ✓
dist_client_...dev.js gzip 326 B 326 B ✓
dist_client_...dev.js gzip 318 B 318 B ✓
dist_client_...dev.js gzip 317 B 317 B ✓
pages-api-tu...dev.js gzip 46.3 kB 46.4 kB ✓
pages-api-tu..prod.js gzip 34.3 kB 34.6 kB ✓
pages-api.ru...dev.js gzip 46.2 kB 46.4 kB ✓
pages-api.ru..prod.js gzip 34.3 kB 34.6 kB ✓
pages-turbo....dev.js gzip 54.7 kB 55.2 kB ✓
pages-turbo...prod.js gzip 39.7 kB 40.2 kB 🔴 +531 B (+1%)
pages.runtim...dev.js gzip 54.7 kB 55.2 kB ✓
pages.runtim..prod.js gzip 39.6 kB 40.2 kB 🔴 +534 B (+1%)
server.runti..prod.js gzip 65.9 kB 67.3 kB 🔴 +1.4 kB (+2%)
use-cache-pr...dev.js gzip 73.3 kB 72.4 kB 🟢 892 B (-1%)
use-cache-pr...dev.js gzip 73.3 kB 72.4 kB 🟢 893 B (-1%)
use-cache-pr...dev.js gzip 71.5 kB 70.7 kB 🟢 789 B (-1%)
use-cache-pr...dev.js gzip 71.5 kB 70.7 kB 🟢 786 B (-1%)
Total 4.1 MB 4.1 MB ⚠️ +3.97 kB
📝 Changed Files (33 files)

Files with changes:

  • app-page-exp..ntime.dev.js
  • app-page-exp..time.prod.js
  • app-page-tur..ntime.dev.js
  • app-page-tur..time.prod.js
  • app-page-tur..ntime.dev.js
  • app-page-tur..time.prod.js
  • app-page.runtime.dev.js
  • app-page.runtime.prod.js
  • app-route-ex..ntime.dev.js
  • app-route-ex..time.prod.js
  • app-route-tu..ntime.dev.js
  • app-route-tu..time.prod.js
  • app-route-tu..ntime.dev.js
  • app-route-tu..time.prod.js
  • app-route.runtime.dev.js
  • app-route.ru..time.prod.js
  • dev-validati..ntime.dev.js
  • dev-validati..ntime.dev.js
  • dev-validati..ntime.dev.js
  • dev-validati..ntime.dev.js
  • ... and 13 more
View diffs
app-page-exp..ntime.dev.js
failed to diff
app-page-exp..time.prod.js
failed to diff
app-page-tur..ntime.dev.js
failed to diff
app-page-tur..time.prod.js
failed to diff
app-page-tur..ntime.dev.js
failed to diff
app-page-tur..time.prod.js
failed to diff
app-page.runtime.dev.js
failed to diff
app-page.runtime.prod.js
failed to diff
app-route-ex..ntime.dev.js

Diff too large to display

app-route-ex..time.prod.js

Diff too large to display

app-route-tu..ntime.dev.js

Diff too large to display

app-route-tu..time.prod.js

Diff too large to display

app-route-tu..ntime.dev.js

Diff too large to display

app-route-tu..time.prod.js

Diff too large to display

app-route.runtime.dev.js

Diff too large to display

app-route.ru..time.prod.js

Diff too large to display

dev-validati..ntime.dev.js
failed to diff
dev-validati..ntime.dev.js
failed to diff
dev-validati..ntime.dev.js
failed to diff
dev-validati..ntime.dev.js
failed to diff
pages-api-tu..ntime.dev.js

Diff too large to display

pages-api-tu..time.prod.js

Diff too large to display

pages-api.runtime.dev.js

Diff too large to display

pages-api.ru..time.prod.js

Diff too large to display

pages-turbo...ntime.dev.js

Diff too large to display

pages-turbo...time.prod.js

Diff too large to display

pages.runtime.dev.js

Diff too large to display

pages.runtime.prod.js

Diff too large to display

server.runtime.prod.js

Diff too large to display

use-cache-pr..ntime.dev.js

Diff too large to display

use-cache-pr..ntime.dev.js

Diff too large to display

use-cache-pr..ntime.dev.js

Diff too large to display

use-cache-pr..ntime.dev.js

Diff too large to display

📎 Tarball URL
https://vercel-packages.vercel.app/next/commits/96297b8d3c58926b961bf03b4ce6f66a7c66bdce/next

Commit: 96297b8

@dianatofficial dianatofficial left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Nice improvement. Clean separation of concerns.

@mischnic mischnic changed the title [16.3.] testmode: Fix infinite recursion in testmode passthrough fetch [16.3] testmode: Fix infinite recursion in testmode passthrough fetch Aug 26, 2026
@mischnic
mischnic merged commit 656aebf into next-16-3 Aug 28, 2026
200 of 202 checks passed
@mischnic
mischnic deleted the mischnic/passport-testmode branch August 28, 2026 08:16
@github-actions github-actions Bot locked as resolved and limited conversation to collaborators Sep 11, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants