From de83031b30c9a58cc9fb71f281c02b1eb2266680 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Sun, 25 Jun 2023 18:42:31 +0800 Subject: [PATCH] Add middleware to handle CORS --- fresh.gen.ts | 58 +++++++++++++++++++------------------ routes/api/_middleware.ts | 28 ++++++++++++++++++ server/get_file_response.ts | 10 +++---- 3 files changed, 63 insertions(+), 33 deletions(-) create mode 100644 routes/api/_middleware.ts diff --git a/fresh.gen.ts b/fresh.gen.ts index 44c93ef..d7105d4 100644 --- a/fresh.gen.ts +++ b/fresh.gen.ts @@ -3,20 +3,21 @@ // This file is automatically updated during development when running `dev.ts`. import * as $0 from "./routes/_middleware.ts"; -import * as $1 from "./routes/api/config.ts"; -import * as $2 from "./routes/api/deploy_id.ts"; -import * as $3 from "./routes/api/exit.ts"; -import * as $4 from "./routes/api/export/gallery/zip/[gid].ts"; -import * as $5 from "./routes/api/file/[id].ts"; -import * as $6 from "./routes/api/file/random.ts"; -import * as $7 from "./routes/api/filemeta.ts"; -import * as $8 from "./routes/api/filemeta/[token].ts"; -import * as $9 from "./routes/api/files/[token].ts"; -import * as $10 from "./routes/api/gallery/[gid].ts"; -import * as $11 from "./routes/api/status.ts"; -import * as $12 from "./routes/api/task.ts"; -import * as $13 from "./routes/api/thumbnail/[id].ts"; -import * as $14 from "./routes/index.tsx"; +import * as $1 from "./routes/api/_middleware.ts"; +import * as $2 from "./routes/api/config.ts"; +import * as $3 from "./routes/api/deploy_id.ts"; +import * as $4 from "./routes/api/exit.ts"; +import * as $5 from "./routes/api/export/gallery/zip/[gid].ts"; +import * as $6 from "./routes/api/file/[id].ts"; +import * as $7 from "./routes/api/file/random.ts"; +import * as $8 from "./routes/api/filemeta.ts"; +import * as $9 from "./routes/api/filemeta/[token].ts"; +import * as $10 from "./routes/api/files/[token].ts"; +import * as $11 from "./routes/api/gallery/[gid].ts"; +import * as $12 from "./routes/api/status.ts"; +import * as $13 from "./routes/api/task.ts"; +import * as $14 from "./routes/api/thumbnail/[id].ts"; +import * as $15 from "./routes/index.tsx"; import * as $$0 from "./islands/Container.tsx"; import * as $$1 from "./islands/Settings.tsx"; import * as $$2 from "./islands/TaskManager.tsx"; @@ -24,20 +25,21 @@ import * as $$2 from "./islands/TaskManager.tsx"; const manifest = { routes: { "./routes/_middleware.ts": $0, - "./routes/api/config.ts": $1, - "./routes/api/deploy_id.ts": $2, - "./routes/api/exit.ts": $3, - "./routes/api/export/gallery/zip/[gid].ts": $4, - "./routes/api/file/[id].ts": $5, - "./routes/api/file/random.ts": $6, - "./routes/api/filemeta.ts": $7, - "./routes/api/filemeta/[token].ts": $8, - "./routes/api/files/[token].ts": $9, - "./routes/api/gallery/[gid].ts": $10, - "./routes/api/status.ts": $11, - "./routes/api/task.ts": $12, - "./routes/api/thumbnail/[id].ts": $13, - "./routes/index.tsx": $14, + "./routes/api/_middleware.ts": $1, + "./routes/api/config.ts": $2, + "./routes/api/deploy_id.ts": $3, + "./routes/api/exit.ts": $4, + "./routes/api/export/gallery/zip/[gid].ts": $5, + "./routes/api/file/[id].ts": $6, + "./routes/api/file/random.ts": $7, + "./routes/api/filemeta.ts": $8, + "./routes/api/filemeta/[token].ts": $9, + "./routes/api/files/[token].ts": $10, + "./routes/api/gallery/[gid].ts": $11, + "./routes/api/status.ts": $12, + "./routes/api/task.ts": $13, + "./routes/api/thumbnail/[id].ts": $14, + "./routes/index.tsx": $15, }, islands: { "./islands/Container.tsx": $$0, diff --git a/routes/api/_middleware.ts b/routes/api/_middleware.ts new file mode 100644 index 0000000..46c062a --- /dev/null +++ b/routes/api/_middleware.ts @@ -0,0 +1,28 @@ +import { MiddlewareHandlerContext } from "$fresh/server.ts"; + +export async function handler(req: Request, ctx: MiddlewareHandlerContext) { + const res = await ctx.next(); + if (req.method === "OPTIONS" && res.status === 405) { + const headers = new Headers(); + const allow = res.headers.get("Accept"); + if (allow) headers.set("Allow", allow); + const origin = req.headers.get("origin"); + if (origin) { + headers.set("Access-Control-Allow-Origin", "*"); + if (allow) headers.set("Access-Control-Allow-Methods", allow); + headers.set("Access-Control-Allow-Headers", "Content-Type, Range"); + } + return new Response(null, { status: 204, headers }); + } else { + const headers = new Headers(res.headers); + const origin = req.headers.get("origin"); + if (origin) { + headers.set("Access-Control-Allow-Origin", "*"); + } + return new Response(res.body, { + status: res.status, + headers: headers, + statusText: res.statusText, + }); + } +} diff --git a/server/get_file_response.ts b/server/get_file_response.ts index 7414e13..b509068 100644 --- a/server/get_file_response.ts +++ b/server/get_file_response.ts @@ -3,15 +3,15 @@ import mime from "mime"; import { parse_range } from "./range_parser.ts"; export type GetFileResponseOptions = { - boundary?: string; + boundary?: string | null; /**@default {4096} */ chunk?: number; /**@default {false} */ combineRange?: boolean; - if_modified_since?: string; - if_unmodified_since?: string; - mimetype?: string; - range?: string; + if_modified_since?: string | null; + if_unmodified_since?: string | null; + mimetype?: string | null; + range?: string | null; }; export async function get_file_response(