From 2a24a008e5f0b40640824aa1102e92da857518b4 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Wed, 30 Jul 2025 15:38:14 +0900 Subject: [PATCH] fix(dev): denied request stalled when requested concurrently --- .../src/node/server/middlewares/transform.ts | 36 +++++++++---------- .../vite/src/node/server/transformRequest.ts | 1 + 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/packages/vite/src/node/server/middlewares/transform.ts b/packages/vite/src/node/server/middlewares/transform.ts index 7bb346b0a65b8a..351c3a6d068b31 100644 --- a/packages/vite/src/node/server/middlewares/transform.ts +++ b/packages/vite/src/node/server/middlewares/transform.ts @@ -1,6 +1,5 @@ import path from 'node:path' import fsp from 'node:fs/promises' -import type { ServerResponse } from 'node:http' import type { Connect } from 'dep-types/connect' import colors from 'picocolors' import type { ExistingRawSourceMap } from 'rollup' @@ -34,6 +33,7 @@ import { ERR_OUTDATED_OPTIMIZED_DEP, NULL_BYTE_PLACEHOLDER, } from '../../../shared/constants' +import type { ResolvedConfig } from '../../config' import { checkLoadingAccess, respondWithAccessDenied } from './static' const debugCache = createDebugger('vite:cache') @@ -46,23 +46,9 @@ const rawRE = /[?&]raw\b/ const inlineRE = /[?&]inline\b/ const svgRE = /\.svg\b/ -function deniedServingAccessForTransform( - id: string, - server: ViteDevServer, - res: ServerResponse, - next: Connect.NextFunction, -) { +function isServerAccessDeniedForTransform(config: ResolvedConfig, id: string) { if (rawRE.test(id) || urlRE.test(id) || inlineRE.test(id) || svgRE.test(id)) { - const servingAccessResult = checkLoadingAccess(server.config, id) - if (servingAccessResult === 'denied') { - respondWithAccessDenied(id, server, res) - return true - } - if (servingAccessResult === 'fallback') { - next() - return true - } - servingAccessResult satisfies 'allowed' + return checkLoadingAccess(config, id) !== 'allowed' } return false } @@ -243,7 +229,7 @@ export function transformMiddleware( allowId(id) { return ( id.startsWith('\0') || - !deniedServingAccessForTransform(id, server, res, next) + !isServerAccessDeniedForTransform(server.config, id) ) }, }) @@ -317,8 +303,18 @@ export function transformMiddleware( return next() } if (e?.code === ERR_DENIED_ID) { - // next() is called in ensureServingAccess - return + const id: string = e.id + const servingAccessResult = checkLoadingAccess(server.config, id) + if (servingAccessResult === 'denied') { + respondWithAccessDenied(id, server, res) + return true + } + if (servingAccessResult === 'fallback') { + next() + return true + } + servingAccessResult satisfies 'allowed' + throw new Error(`Unexpected access result for id ${id}`) } return next(e) } diff --git a/packages/vite/src/node/server/transformRequest.ts b/packages/vite/src/node/server/transformRequest.ts index b2016d5f4ea250..e6a15e583cd672 100644 --- a/packages/vite/src/node/server/transformRequest.ts +++ b/packages/vite/src/node/server/transformRequest.ts @@ -248,6 +248,7 @@ async function loadAndTransform( if (options.allowId && !options.allowId(id)) { const err: any = new Error(`Denied ID ${id}`) err.code = ERR_DENIED_ID + err.id = id throw err }