From 11b13074f1a1ecea50224492c99d834d6447d718 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Thu, 23 Jun 2022 09:13:40 -0500 Subject: [PATCH] Ensure special chars in middleware matcher is handled (#37933) --- packages/next/build/entries.ts | 8 ++++++-- .../build/webpack/loaders/next-middleware-loader.ts | 11 +++++++++-- test/e2e/middleware-matcher/app/middleware.js | 7 ++++++- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/packages/next/build/entries.ts b/packages/next/build/entries.ts index 8a715fa459462..e597495b6a1ea 100644 --- a/packages/next/build/entries.ts +++ b/packages/next/build/entries.ts @@ -164,8 +164,12 @@ export function getEdgeServerEntry(opts: { const loaderParams: MiddlewareLoaderOptions = { absolutePagePath: opts.absolutePagePath, page: opts.page, - matcherRegexp: - opts.middleware?.pathMatcher && opts.middleware.pathMatcher.source, + // pathMatcher can have special characters that break the loader params + // parsing so we base64 encode/decode the string + matcherRegexp: Buffer.from( + (opts.middleware?.pathMatcher && opts.middleware.pathMatcher.source) || + '' + ).toString('base64'), } return `next-middleware-loader?${stringify(loaderParams)}!` diff --git a/packages/next/build/webpack/loaders/next-middleware-loader.ts b/packages/next/build/webpack/loaders/next-middleware-loader.ts index 62f28910b80e1..5acb878bcf768 100644 --- a/packages/next/build/webpack/loaders/next-middleware-loader.ts +++ b/packages/next/build/webpack/loaders/next-middleware-loader.ts @@ -9,8 +9,15 @@ export type MiddlewareLoaderOptions = { } export default function middlewareLoader(this: any) { - const { absolutePagePath, page, matcherRegexp }: MiddlewareLoaderOptions = - this.getOptions() + const { + absolutePagePath, + page, + matcherRegexp: base64MatcherRegex, + }: MiddlewareLoaderOptions = this.getOptions() + const matcherRegexp = Buffer.from( + base64MatcherRegex || '', + 'base64' + ).toString() const stringifiedPagePath = stringifyRequest(this, absolutePagePath) const buildInfo = getModuleBuildInfo(this._module) buildInfo.nextEdgeMiddleware = { diff --git a/test/e2e/middleware-matcher/app/middleware.js b/test/e2e/middleware-matcher/app/middleware.js index 2420806266451..09d45a951fc61 100644 --- a/test/e2e/middleware-matcher/app/middleware.js +++ b/test/e2e/middleware-matcher/app/middleware.js @@ -1,7 +1,12 @@ import { NextResponse } from 'next/server' export const config = { - matcher: ['/with-middleware/:path*', '/another-middleware/:path*'], + matcher: [ + '/with-middleware/:path*', + '/another-middleware/:path*', + // the below is testing special characters don't break the build + '/_sites/:path((?![^/]*\\.json$)[^/]+$)', + ], } export default (req) => {