@@ -7,7 +7,8 @@ import { runWithOpenNextRequestContext } from "utils/promise";
77
88import { debug , error , warn } from "../adapters/logger" ;
99import { patchAsyncStorage } from "./patchAsyncStorage" ;
10- import { convertRes , createServerResponse , proxyRequest } from "./routing/util" ;
10+ import { resolveProxyRequest } from "./resolve" ;
11+ import { convertRes , createServerResponse } from "./routing/util" ;
1112import type { MiddlewareOutputEvent } from "./routingHandler" ;
1213import routingHandler , {
1314 MIDDLEWARE_HEADER_PREFIX ,
@@ -65,6 +66,35 @@ export async function openNextHandler(
6566 delete headers [ rawKey ] ;
6667 }
6768
69+ if (
70+ "isExternalRewrite" in preprocessResult &&
71+ preprocessResult . isExternalRewrite === true
72+ ) {
73+ try {
74+ preprocessResult = await globalThis . proxyExternalRequest . proxy (
75+ preprocessResult . internalEvent ,
76+ ) ;
77+ } catch ( e ) {
78+ error ( "External request failed." , e ) ;
79+ preprocessResult = {
80+ internalEvent : {
81+ type : "core" ,
82+ rawPath : "/500" ,
83+ method : "GET" ,
84+ headers : { } ,
85+ url : "/500" ,
86+ query : { } ,
87+ cookies : { } ,
88+ remoteAddress : "" ,
89+ } ,
90+ // On error we need to rewrite to the 500 page which is an internal rewrite
91+ isExternalRewrite : false ,
92+ isISR : false ,
93+ origin : false ,
94+ } ;
95+ }
96+ }
97+
6898 if ( "type" in preprocessResult ) {
6999 // response is used only in the streaming case
70100 if ( responseStreaming ) {
@@ -110,20 +140,14 @@ export async function openNextHandler(
110140 store . mergeHeadersPriority = mergeHeadersPriority ;
111141 }
112142
113- const preprocessedResult = preprocessResult as MiddlewareOutputEvent ;
114143 const req = new IncomingMessage ( reqProps ) ;
115144 const res = createServerResponse (
116145 preprocessedEvent ,
117146 overwrittenResponseHeaders ,
118147 responseStreaming ,
119148 ) ;
120149
121- await processRequest (
122- req ,
123- res ,
124- preprocessedEvent ,
125- preprocessedResult . isExternalRewrite ,
126- ) ;
150+ await processRequest ( req , res , preprocessedEvent ) ;
127151
128152 const {
129153 statusCode,
@@ -155,21 +179,13 @@ async function processRequest(
155179 req : IncomingMessage ,
156180 res : OpenNextNodeResponse ,
157181 internalEvent : InternalEvent ,
158- isExternalRewrite ?: boolean ,
159182) {
160183 // @ts -ignore
161184 // Next.js doesn't parse body if the property exists
162185 // https://github.com/dougmoscrop/serverless-http/issues/227
163186 delete req . body ;
164187
165188 try {
166- // `serverHandler` is replaced at build time depending on user's
167- // nextjs version to patch Nextjs 13.4.x and future breaking changes.
168-
169- if ( isExternalRewrite ) {
170- return proxyRequest ( internalEvent , res ) ;
171- }
172-
173189 //#override applyNextjsPrebundledReact
174190 setNextjsPrebundledReact ( internalEvent . rawPath ) ;
175191 //#endOverride
0 commit comments