From 2af7f48870afacdd5fc91a127994ed5b2fe6517c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=81=E5=91=A8=E9=83=A8=E8=90=BD?= Date: Wed, 6 Mar 2024 08:35:08 +0800 Subject: [PATCH 01/55] feat: proxy media fallback and url preview fallback --- .../backend/src/server/proxy/proxy-media.ts | 20 ++++++++++++++++++- .../client/src/components/MkUrlPreview.vue | 13 ++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/packages/backend/src/server/proxy/proxy-media.ts b/packages/backend/src/server/proxy/proxy-media.ts index a505d74a0f..995703e021 100644 --- a/packages/backend/src/server/proxy/proxy-media.ts +++ b/packages/backend/src/server/proxy/proxy-media.ts @@ -15,6 +15,23 @@ import { isMimeImage } from "@/misc/is-mime-image.js"; import { inspect } from "node:util"; export async function proxyMedia(ctx: Koa.Context) { + try { + proxyMediaInternal(ctx); + } catch (e) { + if (ctx.query.fallback) { + ctx.redirect("/static-assets/badges/error.webp"); + return; + } + throw e; + } + if (ctx.status !== 200 && ctx.query.fallback) { + ctx.redirect("/static-assets/badges/error.webp"); + return; + } + return; +} + +async function proxyMediaInternal(ctx: Koa.Context) { let url = "url" in ctx.query ? ctx.query.url : `https://${ctx.params.url}`; if (typeof url !== "string") { @@ -24,9 +41,10 @@ export async function proxyMedia(ctx: Koa.Context) { url = url.replace("//", "/"); - const { hostname } = new URL(url); + let hostname; let resolvedIps; try { + hostname = new URL(url); resolvedIps = await promises.resolve(hostname); } catch (error) { ctx.status = 400; diff --git a/packages/client/src/components/MkUrlPreview.vue b/packages/client/src/components/MkUrlPreview.vue index 8632ce7170..892e2b4a2a 100644 --- a/packages/client/src/components/MkUrlPreview.vue +++ b/packages/client/src/components/MkUrlPreview.vue @@ -17,7 +17,11 @@ }" >
- +