1
Fork 0
tildes-reextended/source/utilities/http.ts

52 lines
1.6 KiB
TypeScript
Raw Normal View History

import {log} from "./logging.js";
/**
* Make an HTTP request to the Tildes API that is normally used by Intercooler.
* This should only be used when using HTML elements from Tildes itself isn't
* feasible.
* @param url The API URL to call.
* @param request Any extra request details, note that some of these values will
* be overridden by the ones required to make a proper Intercooler request.
*/
export async function makeIntercoolerRequest(
url: string,
request: RequestInit,
): Promise<Response> {
if (!url.startsWith("https://tildes.net")) {
throw new Error(`Can't make Intercooler request to non-Tildes URL: ${url}`);
}
const csrfToken = document.querySelector<HTMLMetaElement>(
'meta[name="csrftoken"]',
)!.content;
const ic: RequestInit = {
headers: {
// Change the user agent and add an extra header so it's clear this isn't
// a request actually sent by Intercooler but by Tildes ReExtended.
"User-Agent": `Tildes ReExtended (${$browser}, version ${$version})`,
"X-CSRF-Token": csrfToken,
"X-IC-Request": "true",
"X-TRX-Request": "true",
},
referrer: "https://tildes.net",
};
request.headers =
request.headers === undefined
? ic.headers
: {
...request.headers,
// Apply the Intercooler headers last so they can't be overridden.
...ic.headers,
};
request.referrer = request.referrer ?? ic.referrer;
// Explicitly log the request because content script HTTP calls don't show up
// in the Network DevTools.
log("Making Intercooler request:");
log(request);
return window.fetch(url, request);
}