diff --git a/worker/index.ts b/worker/index.ts index 3d822daffd9f443..f2887e12976bbd7 100644 --- a/worker/index.ts +++ b/worker/index.ts @@ -7,53 +7,43 @@ const redirectsEvaluator = generateRedirectsEvaluator(redirectsFileContents); export default class extends WorkerEntrypoint { override async fetch(request: Request) { try { - try { - // Remove once the whacky double-slash rules get removed - const url = new URL(request.url); - request = new Request( - new URL( - url.pathname.replaceAll("//", "/") + url.search, - "https://developers.cloudflare.com/", - ), - request, - ); - } catch (error) { - console.error("Could not normalize request URL", error); - } - - try { - // @ts-expect-error Ignore Fetcher type mismatch - const redirect = await redirectsEvaluator(request, this.env.ASSETS); - if (redirect) { - return redirect; - } - } catch (error) { - console.error("Could not evaluate redirects", error); - } - - try { - const forceTrailingSlashURL = new URL( - request.url.replace(/([^/])$/, "$1/"), - request.url, - ); - const redirect = await redirectsEvaluator( - new Request(forceTrailingSlashURL, request), - // @ts-expect-error Ignore Fetcher type mismatch - this.env.ASSETS, - ); - if (redirect) { - return redirect; - } - } catch (error) { - console.error( - "Could not evaluate redirects with a forced trailing slash", - error, - ); - } + const url = new URL(request.url); + const normalizedURL = new URL( + url.pathname.replaceAll("//", "/") + url.search, + "https://developers.cloudflare.com/", + ); + + const normalizedRequest = new Request(normalizedURL, request); + + // Evaluate redirects on normalized request + const redirect = await this.evaluateRedirects(normalizedRequest); + if (redirect) return redirect; + + // Attempt evaluation with forced trailing slash + const forcedTrailingSlashURL = new URL( + normalizedRequest.url.replace(/([^/])$/, "$1/"), + normalizedRequest.url, + ); + const forcedTrailingSlashRequest = new Request(forcedTrailingSlashURL, request); + + const redirectWithSlash = await this.evaluateRedirects(forcedTrailingSlashRequest); + if (redirectWithSlash) return redirectWithSlash; + } catch (error) { - console.error("Unknown error", error); + console.error("Error processing request:", error); } + // Fallback: Fetch from ASSETS return this.env.ASSETS.fetch(request); } + + private async evaluateRedirects(request: Request) { + try { + // @ts-expect-error Ignore Fetcher type mismatch + return await redirectsEvaluator(request, this.env.ASSETS); + } catch (error) { + console.error("Unknown error", error); + return null; + } + } }