@@ -26,7 +26,7 @@ export const buildResponse = async ({
26
26
request,
27
27
result,
28
28
nextConfig,
29
- } : BuildResponseOptions ) => {
29
+ } : BuildResponseOptions ) : Promise < Response | void > => {
30
30
logger
31
31
. withFields ( { is_nextresponse_next : result . response . headers . has ( 'x-middleware-next' ) } )
32
32
. debug ( 'Building Next.js response' )
@@ -118,27 +118,50 @@ export const buildResponse = async ({
118
118
119
119
const rewriteUrl = new URL ( rewrite , request . url )
120
120
const baseUrl = new URL ( request . url )
121
+ if ( rewriteUrl . toString ( ) === baseUrl . toString ( ) ) {
122
+ logger . withFields ( { rewrite_url : rewrite } ) . debug ( 'Rewrite url is same as original url' )
123
+ return
124
+ }
125
+
121
126
const relativeUrl = relativizeURL ( rewrite , request . url )
122
127
const originalPath = new URL ( request . url , `http://n` ) . pathname
123
128
124
- // Data requests might be rewritten to an external URL
125
- // This header tells the client router the redirect target, and if it's external then it will do a full navigation
126
- if ( isDataReq ) {
129
+ if ( rewriteUrl . origin !== baseUrl . origin ) {
130
+ // Netlify Edge Functions don't support proxying to external domains, but Next middleware does
131
+ logger . withFields ( { rewrite_url : rewrite } ) . debug ( 'Rewriting to external url' )
132
+ let proxyRequest : Request
133
+
134
+ // Remove Netlify internal headers
135
+ const headers = new Headers (
136
+ [ ...request . headers . entries ( ) ] . filter ( ( [ key ] ) => ! key . startsWith ( 'x-nf-' ) ) ,
137
+ )
138
+ if ( request . body && ! request . bodyUsed ) {
139
+ // This is not ideal, but streaming to an external URL doesn't work
140
+ const body = await request . arrayBuffer ( )
141
+ proxyRequest = new Request ( rewriteUrl , {
142
+ headers,
143
+ method : request . method ,
144
+ body,
145
+ } )
146
+ } else {
147
+ proxyRequest = new Request ( rewriteUrl , {
148
+ headers,
149
+ method : request . method ,
150
+ } )
151
+ }
152
+ return addMiddlewareHeaders ( fetch ( proxyRequest ) , res )
153
+ } else if ( isDataReq ) {
154
+ // Data requests might be rewritten to an external URL
155
+ // This header tells the client router the redirect target, and if it's external then it will do a full navigation
127
156
res . headers . set ( 'x-nextjs-rewrite' , relativeUrl )
128
157
rewriteUrl . pathname = rewriteDataPath ( {
129
158
dataUrl : originalPath ,
130
159
newRoute : relativeUrl ,
131
160
basePath : nextConfig ?. basePath ,
132
161
} )
133
162
}
134
- if ( rewriteUrl . origin !== baseUrl . origin ) {
135
- // Netlify Edge Functions don't support proxying to external domains, but Next middleware does
136
- const proxied = fetch ( new Request ( rewriteUrl , request ) )
137
- return addMiddlewareHeaders ( proxied , res )
138
- }
139
163
res . headers . set ( 'x-middleware-rewrite' , relativeUrl )
140
164
request . headers . set ( 'x-middleware-rewrite' , rewrite )
141
-
142
165
return addMiddlewareHeaders ( fetch ( new Request ( rewriteUrl , request ) ) , res )
143
166
}
144
167
0 commit comments