@@ -95,10 +95,10 @@ import { parseNextUrl } from '../shared/lib/router/utils/parse-next-url'
9595import isError from '../lib/is-error'
9696import { getMiddlewareInfo } from './require'
9797import { MIDDLEWARE_ROUTE } from '../lib/constants'
98+ import { NextResponse } from './web/spec-extension/response'
9899import { run } from './web/sandbox'
99100import { addRequestMeta , getRequestMeta } from './request-meta'
100101import { toNodeHeaders } from './web/utils'
101- import { relativizeURL } from '../shared/lib/router/utils/relativize-url'
102102
103103const getCustomRouteMatcher = pathMatch ( true )
104104
@@ -384,13 +384,7 @@ export default class Server {
384384 parsedUrl . query = parseQs ( parsedUrl . query )
385385 }
386386
387- // When there are hostname and port we build an absolute URL
388- const initUrl =
389- this . hostname && this . port
390- ? `http://${ this . hostname } :${ this . port } ${ req . url } `
391- : req . url
392-
393- addRequestMeta ( req , '__NEXT_INIT_URL' , initUrl )
387+ addRequestMeta ( req , '__NEXT_INIT_URL' , req . url )
394388 addRequestMeta ( req , '__NEXT_INIT_QUERY' , { ...parsedUrl . query } )
395389
396390 const url = parseNextUrl ( {
@@ -673,14 +667,6 @@ export default class Server {
673667 } ) : Promise < FetchEventResult | null > {
674668 this . middlewareBetaWarning ( )
675669
676- // For middleware to "fetch" we must always provide an absolute URL
677- const url = getRequestMeta ( params . request , '__NEXT_INIT_URL' ) !
678- if ( ! url . startsWith ( 'http' ) ) {
679- throw new Error (
680- 'To use middleware you must provide a `hostname` and `port` to the Next.js Server'
681- )
682- }
683-
684670 const page : { name ?: string ; params ?: { [ key : string ] : string } } = { }
685671 if ( await this . hasPage ( params . parsedUrl . pathname ) ) {
686672 page . name = params . parsedUrl . pathname
@@ -695,6 +681,8 @@ export default class Server {
695681 }
696682 }
697683
684+ const subreq = params . request . headers [ `x-middleware-subrequest` ]
685+ const subrequests = typeof subreq === 'string' ? subreq . split ( ':' ) : [ ]
698686 const allHeaders = new Headers ( )
699687 let result : FetchEventResult | null = null
700688
@@ -714,6 +702,14 @@ export default class Server {
714702 serverless : this . _isLikeServerless ,
715703 } )
716704
705+ if ( subrequests . includes ( middlewareInfo . name ) ) {
706+ result = {
707+ response : NextResponse . next ( ) ,
708+ waitUntil : Promise . resolve ( ) ,
709+ }
710+ continue
711+ }
712+
717713 result = await run ( {
718714 name : middlewareInfo . name ,
719715 paths : middlewareInfo . paths ,
@@ -725,7 +721,7 @@ export default class Server {
725721 i18n : this . nextConfig . i18n ,
726722 trailingSlash : this . nextConfig . trailingSlash ,
727723 } ,
728- url : url ,
724+ url : getRequestMeta ( params . request , '__NEXT_INIT_URL' ) ! ,
729725 page : page ,
730726 } ,
731727 useCache : ! this . nextConfig . experimental . concurrentFeatures ,
@@ -1185,13 +1181,9 @@ export default class Server {
11851181 type : 'route' ,
11861182 name : 'middleware catchall' ,
11871183 fn : async ( req , res , _params , parsed ) => {
1188- if ( ! this . middleware ?. length ) {
1189- return { finished : false }
1190- }
1191-
1192- const initUrl = getRequestMeta ( req , '__NEXT_INIT_URL' ) !
1184+ const fullUrl = getRequestMeta ( req , '__NEXT_INIT_URL' )
11931185 const parsedUrl = parseNextUrl ( {
1194- url : initUrl ,
1186+ url : fullUrl ,
11951187 headers : req . headers ,
11961188 nextConfig : {
11971189 basePath : this . nextConfig . basePath ,
@@ -1230,18 +1222,6 @@ export default class Server {
12301222 return { finished : true }
12311223 }
12321224
1233- if ( result . response . headers . has ( 'x-middleware-rewrite' ) ) {
1234- const value = result . response . headers . get ( 'x-middleware-rewrite' ) !
1235- const rel = relativizeURL ( value , initUrl )
1236- result . response . headers . set ( 'x-middleware-rewrite' , rel )
1237- }
1238-
1239- if ( result . response . headers . has ( 'Location' ) ) {
1240- const value = result . response . headers . get ( 'Location' ) !
1241- const rel = relativizeURL ( value , initUrl )
1242- result . response . headers . set ( 'Location' , rel )
1243- }
1244-
12451225 if (
12461226 ! result . response . headers . has ( 'x-middleware-rewrite' ) &&
12471227 ! result . response . headers . has ( 'x-middleware-next' ) &&
0 commit comments