Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 34 additions & 44 deletions worker/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,53 +7,43 @@ const redirectsEvaluator = generateRedirectsEvaluator(redirectsFileContents);
export default class extends WorkerEntrypoint<Env> {
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;
}
}
}