@@ -7,13 +7,15 @@ import { ServerlessResponse } from "../http/response.js";
7
7
import {
8
8
convertRes ,
9
9
getMiddlewareMatch ,
10
+ isExternal ,
10
11
loadMiddlewareManifest ,
11
12
} from "./util.js" ;
12
13
13
14
const middlewareManifest = loadMiddlewareManifest ( NEXT_DIR ) ;
14
15
16
+ //NOTE: we should try to avoid importing stuff from next as much as possible
17
+ // every release of next could break this
15
18
const { run } = require ( "next/dist/server/web/sandbox" ) ;
16
- const { pipeReadable } = require ( "next/dist/server/pipe-readable" ) ;
17
19
const { getCloneableBody } = require ( "next/dist/server/body-streams" ) ;
18
20
const {
19
21
signalFromNodeResponse,
@@ -23,13 +25,18 @@ const middleMatch = getMiddlewareMatch(middlewareManifest);
23
25
24
26
type MiddlewareOutputEvent = InternalEvent & {
25
27
responseHeaders ?: Record < string , string | string [ ] > ;
28
+ externalRewrite ?: boolean ;
26
29
} ;
27
30
28
31
// NOTE: As of Nextjs 13.4.13+, the middleware is handled outside the next-server.
29
32
// OpenNext will run the middleware in a sandbox and set the appropriate req headers
30
33
// and res.body prior to processing the next-server.
31
34
// @returns undefined | res.end()
32
35
36
+ interface MiddlewareResult {
37
+ response : Response ;
38
+ }
39
+
33
40
// if res.end() is return, the parent needs to return and not process next server
34
41
export async function handleMiddleware (
35
42
internalEvent : InternalEvent ,
@@ -65,7 +72,7 @@ export async function handleMiddleware(
65
72
initialUrl . search = new URLSearchParams ( urlQuery ) . toString ( ) ;
66
73
const url = initialUrl . toString ( ) ;
67
74
68
- const result = await run ( {
75
+ const result : MiddlewareResult = await run ( {
69
76
distDir : NEXT_DIR ,
70
77
name : middlewareInfo . name || "/" ,
71
78
paths : middlewareInfo . paths || [ ] ,
@@ -129,7 +136,7 @@ export async function handleMiddleware(
129
136
statusCode : res . statusCode ,
130
137
headers : {
131
138
...resHeaders ,
132
- Location : location ,
139
+ Location : location ?? "" ,
133
140
} ,
134
141
isBase64Encoded : false ,
135
142
} ;
@@ -139,22 +146,34 @@ export async function handleMiddleware(
139
146
// NOTE: the header was added to `req` from above
140
147
const rewriteUrl = responseHeaders . get ( "x-middleware-rewrite" ) ;
141
148
let rewritten = false ;
149
+ let externalRewrite = false ;
142
150
let middlewareQueryString = internalEvent . query ;
143
151
if ( rewriteUrl ) {
144
- const rewriteUrlObject = new URL ( rewriteUrl ) ;
145
- req . url = rewriteUrlObject . pathname ;
146
- //reset qs
147
- middlewareQueryString = { } ;
148
- rewriteUrlObject . searchParams . forEach ( ( v : string , k : string ) => {
149
- middlewareQueryString [ k ] = v ;
150
- } ) ;
151
- rewritten = true ;
152
+ if ( isExternal ( rewriteUrl , req . headers . host ) ) {
153
+ req . url = rewriteUrl ;
154
+ rewritten = true ;
155
+ externalRewrite = true ;
156
+ } else {
157
+ const rewriteUrlObject = new URL ( rewriteUrl ) ;
158
+ req . url = rewriteUrlObject . pathname ;
159
+ //reset qs
160
+ middlewareQueryString = { } ;
161
+ rewriteUrlObject . searchParams . forEach ( ( v : string , k : string ) => {
162
+ middlewareQueryString [ k ] = v ;
163
+ } ) ;
164
+ rewritten = true ;
165
+ }
152
166
}
153
167
154
168
// If the middleware returned a `NextResponse`, pipe the body to res. This will return
155
169
// the body immediately to the client.
156
170
if ( result . response . body ) {
157
- await pipeReadable ( result . response . body , res ) ;
171
+ // transfer response body to res
172
+ const arrayBuffer = await result . response . arrayBuffer ( ) ;
173
+ const buffer = Buffer . from ( arrayBuffer ) ;
174
+ res . end ( buffer ) ;
175
+
176
+ // await pipeReadable(result.response.body, res);
158
177
return {
159
178
type : internalEvent . type ,
160
179
...convertRes ( res ) ,
@@ -174,5 +193,6 @@ export async function handleMiddleware(
174
193
query : middlewareQueryString ,
175
194
cookies : internalEvent . cookies ,
176
195
remoteAddress : internalEvent . remoteAddress ,
196
+ externalRewrite,
177
197
} ;
178
198
}
0 commit comments