diff --git a/packages/next/build/webpack/loaders/next-middleware-loader.ts b/packages/next/build/webpack/loaders/next-middleware-loader.ts index cccfbd4cc0b2b..c93346f5b381e 100644 --- a/packages/next/build/webpack/loaders/next-middleware-loader.ts +++ b/packages/next/build/webpack/loaders/next-middleware-loader.ts @@ -15,7 +15,7 @@ export default function middlewareLoader(this: any) { } return ` - import { adapter } from 'next/dist/server/web/adapter' + import { adapter, blockUnallowedResponse } from 'next/dist/server/web/adapter' // The condition is true when the "process" module is provided if (process !== global.process) { @@ -32,11 +32,11 @@ export default function middlewareLoader(this: any) { } export default function (opts) { - return adapter({ + return blockUnallowedResponse(adapter({ ...opts, page: ${JSON.stringify(page)}, handler, - }) + })) } ` } diff --git a/packages/next/server/web/adapter.ts b/packages/next/server/web/adapter.ts index a6eb6da2f4f08..053f3f7fe00c9 100644 --- a/packages/next/server/web/adapter.ts +++ b/packages/next/server/web/adapter.ts @@ -9,12 +9,7 @@ import { DeprecationError } from './error' import { fromNodeHeaders } from './utils' import { NextFetchEvent } from './spec-extension/fetch-event' import { NextRequest } from './spec-extension/request' -import { - NextResponse, - RedirectHeader, - RewriteHeader, - NextMiddlewareHeader, -} from './spec-extension/response' +import { NextResponse, RedirectHeader } from './spec-extension/response' import { waitUntilSymbol } from './spec-compliant/fetch-event' export async function adapter(params: { @@ -39,25 +34,32 @@ export async function adapter(params: { const event = new NextFetchEvent({ request, page: params.page }) const response = await params.handler(request, event) - const error = isAllowed(response) - ? null - : new Response( - JSON.stringify({ - message: `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-_middleware`, - }), - { - status: 500, - statusText: 'Internal Server Error', - headers: { 'content-type': 'application/json' }, - } - ) - return { - response: error || response || NextResponse.next(), + response: response || NextResponse.next(), waitUntil: Promise.all(event[waitUntilSymbol]), } } +export function blockUnallowedResponse( + promise: Promise +): Promise { + return promise.then((result) => ({ + ...result, + response: isAllowed(result.response) + ? result.response + : new Response( + JSON.stringify({ + message: `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-_middleware`, + }), + { + status: 500, + statusText: 'Internal Server Error', + headers: { 'content-type': 'application/json' }, + } + ), + })) +} + function isAllowed(response: NextMiddlewareResult): boolean { return ( !response?.body || !response.body || response.headers.has(RedirectHeader) diff --git a/packages/next/server/web/error.ts b/packages/next/server/web/error.ts index ebe14d9f27d78..c659a570d9b50 100644 --- a/packages/next/server/web/error.ts +++ b/packages/next/server/web/error.ts @@ -3,7 +3,7 @@ export class DeprecationError extends Error { super(`The middleware "${page}" accepts an async API directly with the form: export function middleware(request, event) { - return new Response("Hello " + request.url) + return new NextResponse(null, { status: 403 }) } Read more: https://nextjs.org/docs/messages/middleware-new-signature