@@ -105,7 +105,6 @@ export const authenticateAndDecorateRequest = (options: ClerkMiddlewareOptions =
105105
106106 // Extract proxy configuration
107107 const frontendApiProxy = options . frontendApiProxy ;
108- const proxyEnabled = frontendApiProxy ?. enabled === true ;
109108 const proxyPath = stripTrailingSlashes ( frontendApiProxy ?. path ?? DEFAULT_PROXY_PATH ) ;
110109
111110 // eslint-disable-next-line @typescript-eslint/no-misused-promises
@@ -119,9 +118,14 @@ export const authenticateAndDecorateRequest = (options: ClerkMiddlewareOptions =
119118 const secretKey = options . secretKey || env . secretKey ;
120119
121120 // Handle Frontend API proxy requests early, before authentication
122- if ( proxyEnabled ) {
123- const requestPath = new URL ( request . originalUrl || request . url , `http://${ request . headers . host } ` ) . pathname ;
124- if ( requestPath === proxyPath || requestPath . startsWith ( proxyPath + '/' ) ) {
121+ if ( frontendApiProxy ) {
122+ const requestUrl = new URL ( request . originalUrl || request . url , `http://${ request . headers . host } ` ) ;
123+ const isEnabled =
124+ typeof frontendApiProxy . enabled === 'function'
125+ ? frontendApiProxy . enabled ( requestUrl )
126+ : frontendApiProxy . enabled ;
127+
128+ if ( isEnabled && ( requestUrl . pathname === proxyPath || requestUrl . pathname . startsWith ( proxyPath + '/' ) ) ) {
125129 // Convert Express request to Fetch API Request
126130 const proxyRequest = requestToProxyRequest ( request ) ;
127131
@@ -164,18 +168,25 @@ export const authenticateAndDecorateRequest = (options: ClerkMiddlewareOptions =
164168
165169 // Auto-derive proxyUrl from frontendApiProxy config if not explicitly set
166170 let resolvedOptions = options ;
167- if ( proxyEnabled && ! options . proxyUrl ) {
168- const forwardedProto = request . headers [ 'x-forwarded-proto' ] ;
169- const protoHeader = Array . isArray ( forwardedProto ) ? forwardedProto [ 0 ] : forwardedProto ;
170- const proto = ( protoHeader || '' ) . split ( ',' ) [ 0 ] . trim ( ) ;
171- const protocol = request . secure || proto === 'https' ? 'https' : 'http' ;
172-
173- const forwardedHost = request . headers [ 'x-forwarded-host' ] ;
174- const hostHeader = Array . isArray ( forwardedHost ) ? forwardedHost [ 0 ] : forwardedHost ;
175- const host = ( hostHeader || '' ) . split ( ',' ) [ 0 ] . trim ( ) || request . headers . host || 'localhost' ;
176-
177- const derivedProxyUrl = `${ protocol } ://${ host } ${ proxyPath } ` ;
178- resolvedOptions = { ...options , proxyUrl : derivedProxyUrl } ;
171+ if ( frontendApiProxy && ! options . proxyUrl ) {
172+ const requestUrl = new URL ( request . originalUrl || request . url , `http://${ request . headers . host } ` ) ;
173+ const isProxyEnabled =
174+ typeof frontendApiProxy . enabled === 'function'
175+ ? frontendApiProxy . enabled ( requestUrl )
176+ : frontendApiProxy . enabled ;
177+ if ( isProxyEnabled ) {
178+ const forwardedProto = request . headers [ 'x-forwarded-proto' ] ;
179+ const protoHeader = Array . isArray ( forwardedProto ) ? forwardedProto [ 0 ] : forwardedProto ;
180+ const proto = ( protoHeader || '' ) . split ( ',' ) [ 0 ] . trim ( ) ;
181+ const protocol = request . secure || proto === 'https' ? 'https' : 'http' ;
182+
183+ const forwardedHost = request . headers [ 'x-forwarded-host' ] ;
184+ const hostHeader = Array . isArray ( forwardedHost ) ? forwardedHost [ 0 ] : forwardedHost ;
185+ const host = ( hostHeader || '' ) . split ( ',' ) [ 0 ] . trim ( ) || request . headers . host || 'localhost' ;
186+
187+ const derivedProxyUrl = `${ protocol } ://${ host } ${ proxyPath } ` ;
188+ resolvedOptions = { ...options , proxyUrl : derivedProxyUrl } ;
189+ }
179190 }
180191
181192 try {
0 commit comments