2026-03-17 12:38:30 +01:00
|
|
|
// Override window.requestUrl to proxy external requests through our server, bypassing CORS.
|
|
|
|
|
// Obsidian sets window.requestUrl in app.js, so we override it after app.js loads.
|
2026-03-11 23:03:14 +01:00
|
|
|
|
2026-06-03 01:15:27 +02:00
|
|
|
import { isSameOrigin } from "./util/url.js";
|
2026-06-05 23:56:59 +02:00
|
|
|
import { proxyFetch } from "./util/proxy.js";
|
2026-03-11 23:03:14 +01:00
|
|
|
|
|
|
|
|
async function proxyRequestUrl(request) {
|
|
|
|
|
if (typeof request === "string") {
|
|
|
|
|
request = { url: request };
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-02 17:09:54 +02:00
|
|
|
// Same-origin requests don't need the proxy.
|
|
|
|
|
if (isSameOrigin(request.url)) {
|
2026-03-11 23:03:14 +01:00
|
|
|
const res = await fetch(request.url, {
|
|
|
|
|
method: request.method || "GET",
|
|
|
|
|
headers: request.headers || {},
|
|
|
|
|
body: request.body,
|
|
|
|
|
});
|
2026-03-17 12:38:30 +01:00
|
|
|
|
2026-03-11 23:03:14 +01:00
|
|
|
const arrayBuf = await res.arrayBuffer();
|
2026-03-17 12:38:30 +01:00
|
|
|
|
2026-03-11 23:03:14 +01:00
|
|
|
return makeResponse(
|
|
|
|
|
request,
|
|
|
|
|
res.status,
|
|
|
|
|
Object.fromEntries(res.headers),
|
|
|
|
|
arrayBuf,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Cross-origin: route through server proxy
|
2026-06-05 23:56:59 +02:00
|
|
|
const result = await proxyFetch({
|
|
|
|
|
url: request.url,
|
|
|
|
|
method: request.method,
|
|
|
|
|
headers: request.headers,
|
|
|
|
|
body: request.body,
|
2026-03-11 23:03:14 +01:00
|
|
|
});
|
|
|
|
|
|
2026-06-05 23:56:59 +02:00
|
|
|
return makeResponse(request, result.status, result.headers, result.body);
|
2026-03-11 23:03:14 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function makeResponse(request, status, headers, arrayBuf) {
|
|
|
|
|
const text = new TextDecoder().decode(arrayBuf);
|
|
|
|
|
let json;
|
2026-03-17 12:38:30 +01:00
|
|
|
|
2026-03-11 23:03:14 +01:00
|
|
|
try {
|
|
|
|
|
json = JSON.parse(text);
|
|
|
|
|
} catch {
|
|
|
|
|
json = null;
|
|
|
|
|
}
|
2026-03-17 12:38:30 +01:00
|
|
|
|
2026-03-11 23:03:14 +01:00
|
|
|
return { status, headers, arrayBuffer: arrayBuf, text, json };
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function installRequestUrlShim() {
|
|
|
|
|
// Obsidian sets window.requestUrl in app.js. We override it once the page loads.
|
|
|
|
|
// Use a getter so it intercepts even if app.js sets it later.
|
|
|
|
|
let _original = null;
|
|
|
|
|
|
|
|
|
|
Object.defineProperty(window, "requestUrl", {
|
|
|
|
|
get() {
|
|
|
|
|
return proxyRequestUrl;
|
|
|
|
|
},
|
|
|
|
|
set(val) {
|
|
|
|
|
_original = val;
|
|
|
|
|
},
|
|
|
|
|
configurable: true,
|
|
|
|
|
});
|
|
|
|
|
}
|