From bd1fc2d91e4a06a97da2283db8545a6b4e619177 Mon Sep 17 00:00:00 2001 From: Sven Date: Tue, 21 Apr 2026 23:33:39 +0200 Subject: [PATCH] fix: match /media/ path not hostname in cover-proxy URL rewrite MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FUNKWHALE_INSTANCE uses internal IP (10.100.0.40) but media URLs have public hostname (audio.giersig.eu) — hostname comparison never matched. Switch to path-prefix check on /media/ instead. Co-Authored-By: Claude Sonnet 4.6 --- scripts/patch-listening-endpoint-runtime-guards.mjs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/scripts/patch-listening-endpoint-runtime-guards.mjs b/scripts/patch-listening-endpoint-runtime-guards.mjs index bafb7ec6..36889de9 100644 --- a/scripts/patch-listening-endpoint-runtime-guards.mjs +++ b/scripts/patch-listening-endpoint-runtime-guards.mjs @@ -786,16 +786,13 @@ const patchSpecs = [ const upstream = await fetch(rawUrl, {`, newSnippet: ` try { urlObj = new URL(rawUrl); } catch { return response.status(400).send("Invalid url"); } - // Rewrite media URLs to internal endpoint when node jail can't reach public hostname + // Rewrite media URLs to internal endpoint when node jail can't reach public hostname. + // FUNKWHALE_INSTANCE may use an internal IP while media URLs use the public hostname, + // so we match by path prefix (/media/) rather than by hostname. let fetchUrl = rawUrl; const { funkwhaleConfig } = request.app.locals.application; - if (funkwhaleConfig?.mediaInternalUrl && funkwhaleConfig?.instanceUrl) { - try { - const instanceHost = new URL(funkwhaleConfig.instanceUrl).hostname; - if (urlObj.hostname === instanceHost) { - fetchUrl = funkwhaleConfig.mediaInternalUrl.replace(/\\/+$/, "") + urlObj.pathname + urlObj.search; - } - } catch {} + if (funkwhaleConfig?.mediaInternalUrl && urlObj.pathname.startsWith("/media/")) { + fetchUrl = funkwhaleConfig.mediaInternalUrl.replace(/\\/+$/, "") + urlObj.pathname + (urlObj.search || ""); } try {