You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.7 KiB
60 lines
1.7 KiB
import { parseCookieHeader, serializeCookie } from "../src/compose/cookieUtils";
|
|
import app from "./app";
|
|
|
|
export function bootstrapServer() {
|
|
async function fetchFirstSuccess(urls) {
|
|
for (const url of urls) {
|
|
try {
|
|
const res = await fetch(url, {
|
|
method: "get",
|
|
mode: "cors",
|
|
redirect: "follow",
|
|
});
|
|
if (!res.ok) continue;
|
|
const contentType = res.headers.get("content-type") || "";
|
|
let data, type;
|
|
if (contentType.includes("application/json")) {
|
|
data = await res.json();
|
|
type = "json";
|
|
} else if (contentType.includes("text/")) {
|
|
data = await res.text();
|
|
type = "text";
|
|
} else {
|
|
data = await res.blob();
|
|
type = "blob";
|
|
}
|
|
return { type, data };
|
|
} catch (e) {
|
|
// ignore and try next url
|
|
}
|
|
}
|
|
throw new Error("All requests failed");
|
|
}
|
|
|
|
app.use(async (ctx, next) => {
|
|
const cookies = parseCookieHeader(ctx.request.headers.cookie as string);
|
|
|
|
// 读取
|
|
const token = cookies["demo_2token"];
|
|
|
|
// 写入(HttpOnly 更安全)
|
|
if (!token) {
|
|
const setItem = serializeCookie("demo_2token", "from-mw", {
|
|
httpOnly: true,
|
|
path: "/",
|
|
sameSite: "lax",
|
|
});
|
|
ctx.set("Set-Cookie", [setItem]);
|
|
}
|
|
if (ctx.originalUrl !== "/api/pics/random") return await next();
|
|
const { type, data } = await fetchFirstSuccess([
|
|
"https://api.miaomc.cn/image/get",
|
|
]);
|
|
if (type === "blob") {
|
|
ctx.set("Content-Type", "image/jpeg");
|
|
// 下载
|
|
// ctx.set("Content-Disposition", "attachment; filename=random.jpg")
|
|
ctx.body = data;
|
|
}
|
|
});
|
|
}
|
|
|