@@ -95,10 +95,10 @@ import { parseNextUrl } from '../shared/lib/router/utils/parse-next-url'
95
95
import isError from '../lib/is-error'
96
96
import { getMiddlewareInfo } from './require'
97
97
import { MIDDLEWARE_ROUTE } from '../lib/constants'
98
+ import { NextResponse } from './web/spec-extension/response'
98
99
import { run } from './web/sandbox'
99
100
import { addRequestMeta , getRequestMeta } from './request-meta'
100
101
import { toNodeHeaders } from './web/utils'
101
- import { relativizeURL } from '../shared/lib/router/utils/relativize-url'
102
102
103
103
const getCustomRouteMatcher = pathMatch ( true )
104
104
@@ -384,13 +384,7 @@ export default class Server {
384
384
parsedUrl . query = parseQs ( parsedUrl . query )
385
385
}
386
386
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 )
394
388
addRequestMeta ( req , '__NEXT_INIT_QUERY' , { ...parsedUrl . query } )
395
389
396
390
const url = parseNextUrl ( {
@@ -673,14 +667,6 @@ export default class Server {
673
667
} ) : Promise < FetchEventResult | null > {
674
668
this . middlewareBetaWarning ( )
675
669
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
-
684
670
const page : { name ?: string ; params ?: { [ key : string ] : string } } = { }
685
671
if ( await this . hasPage ( params . parsedUrl . pathname ) ) {
686
672
page . name = params . parsedUrl . pathname
@@ -695,6 +681,8 @@ export default class Server {
695
681
}
696
682
}
697
683
684
+ const subreq = params . request . headers [ `x-middleware-subrequest` ]
685
+ const subrequests = typeof subreq === 'string' ? subreq . split ( ':' ) : [ ]
698
686
const allHeaders = new Headers ( )
699
687
let result : FetchEventResult | null = null
700
688
@@ -714,6 +702,14 @@ export default class Server {
714
702
serverless : this . _isLikeServerless ,
715
703
} )
716
704
705
+ if ( subrequests . includes ( middlewareInfo . name ) ) {
706
+ result = {
707
+ response : NextResponse . next ( ) ,
708
+ waitUntil : Promise . resolve ( ) ,
709
+ }
710
+ continue
711
+ }
712
+
717
713
result = await run ( {
718
714
name : middlewareInfo . name ,
719
715
paths : middlewareInfo . paths ,
@@ -725,7 +721,7 @@ export default class Server {
725
721
i18n : this . nextConfig . i18n ,
726
722
trailingSlash : this . nextConfig . trailingSlash ,
727
723
} ,
728
- url : url ,
724
+ url : getRequestMeta ( params . request , '__NEXT_INIT_URL' ) ! ,
729
725
page : page ,
730
726
} ,
731
727
useCache : ! this . nextConfig . experimental . concurrentFeatures ,
@@ -1185,13 +1181,9 @@ export default class Server {
1185
1181
type : 'route' ,
1186
1182
name : 'middleware catchall' ,
1187
1183
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' )
1193
1185
const parsedUrl = parseNextUrl ( {
1194
- url : initUrl ,
1186
+ url : fullUrl ,
1195
1187
headers : req . headers ,
1196
1188
nextConfig : {
1197
1189
basePath : this . nextConfig . basePath ,
@@ -1230,18 +1222,6 @@ export default class Server {
1230
1222
return { finished : true }
1231
1223
}
1232
1224
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
-
1245
1225
if (
1246
1226
! result . response . headers . has ( 'x-middleware-rewrite' ) &&
1247
1227
! result . response . headers . has ( 'x-middleware-next' ) &&
0 commit comments