Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 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
10 changes: 0 additions & 10 deletions app/http.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
import { ensureSecure } from "~/modules/http-utils/ensure-secure";
import { handleRedirects } from "~/modules/redirects/.server";
import { removeTrailingSlashes } from "~/modules/http-utils/remove-slashes";

export const CACHE_CONTROL = {
// what we use for docs so they are up-to-date within minutes of what's on
// github
Expand All @@ -10,9 +6,3 @@ export const CACHE_CONTROL = {
// don't cache at all
none: "no-store, no-cache, must-revalidate, max-age=0",
};

export async function middlewares(request: Request): Promise<void> {
await ensureSecure(request);
await removeTrailingSlashes(request);
await handleRedirects(request);
}
8 changes: 5 additions & 3 deletions app/modules/http-utils/ensure-secure.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { redirect } from "react-router";
import { redirect, type unstable_MiddlewareFunction } from "react-router";

export async function ensureSecure(request: Request) {
export const ensureSecure: unstable_MiddlewareFunction<
void | Response
> = async ({ request }) => {
let proto = request.headers.get("x-forwarded-proto");
// this indirectly allows `http://localhost` because there is no
// "x-forwarded-proto" in the local server headers
Expand All @@ -9,4 +11,4 @@ export async function ensureSecure(request: Request) {
secureUrl.protocol = "https:";
throw redirect(secureUrl.toString());
}
}
};
8 changes: 5 additions & 3 deletions app/modules/http-utils/remove-slashes.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { redirect } from "react-router";
import { redirect, type unstable_MiddlewareFunction } from "react-router";

export async function removeTrailingSlashes(request: Request) {
export const removeTrailingSlashes: unstable_MiddlewareFunction<
void | Response
> = async ({ request }) => {
let url = new URL(request.url);
if (url.pathname.endsWith("/") && url.pathname !== "/") {
url.pathname = url.pathname.slice(0, -1);
throw redirect(url.toString());
}
}
};
7 changes: 5 additions & 2 deletions app/modules/redirects/.server/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { type unstable_MiddlewareFunction } from "react-router";
import { checkUrl } from "./check-url";
import { getRedirects } from "./get-redirects";

Expand All @@ -14,9 +15,11 @@ import { getRedirects } from "./get-redirects";
*
* @param request Web Fetch Request to possibly redirect
*/
export async function handleRedirects(request: Request): Promise<void> {
export const handleRedirects: unstable_MiddlewareFunction<
void | Response
> = async ({ request }) => {
let redirects = await getRedirects();
let url = new URL(request.url);
let response = await checkUrl(url.pathname, redirects);
if (response) throw response;
}
};
14 changes: 11 additions & 3 deletions app/root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
Scripts,
ScrollRestoration,
} from "react-router";
import { CACHE_CONTROL, middlewares } from "./http";
import { CACHE_CONTROL } from "./http";

import { parseColorScheme } from "./modules/color-scheme/server";
import {
Expand All @@ -23,9 +23,17 @@ import "@docsearch/css/dist/style.css";
import "~/styles/docsearch.css";
import type { Route } from "./+types/root";

export async function loader({ request }: LoaderFunctionArgs) {
await middlewares(request);
import { ensureSecure } from "~/modules/http-utils/ensure-secure";
import { handleRedirects } from "~/modules/redirects/.server";
import { removeTrailingSlashes } from "~/modules/http-utils/remove-slashes";

export const unstable_middleware: Route.unstable_MiddlewareFunction[] = [
ensureSecure,
removeTrailingSlashes,
handleRedirects,
];

export async function loader({ request }: LoaderFunctionArgs) {
let colorScheme = await parseColorScheme(request);
let isProductionHost = isHost("reactrouter.com", request);

Expand Down
Loading