Mattermost: avoid raw fetch in monitor media download

This commit is contained in:
Shakker
2026-02-26 16:03:20 +00:00
parent 8a51891ed5
commit b044c149c1
2 changed files with 17 additions and 9 deletions

View File

@@ -63,7 +63,6 @@ export type MonitorMattermostOpts = {
webSocketFactory?: MattermostWebSocketFactory;
};
type FetchLike = (input: URL | RequestInfo, init?: RequestInit) => Promise<Response>;
type MediaKind = "image" | "audio" | "video" | "document" | "unknown";
type MattermostReaction = {
@@ -224,12 +223,6 @@ export async function monitorMattermostProvider(opts: MonitorMattermostOpts = {}
log: (message) => logVerboseMessage(message),
});
const fetchWithAuth: FetchLike = (input, init) => {
const headers = new Headers(init?.headers);
headers.set("Authorization", `Bearer ${client.token}`);
return fetch(input, { ...init, headers });
};
const resolveMattermostMedia = async (
fileIds?: string[] | null,
): Promise<MattermostMediaInfo[]> => {
@@ -242,7 +235,11 @@ export async function monitorMattermostProvider(opts: MonitorMattermostOpts = {}
try {
const fetched = await core.channel.media.fetchRemoteMedia({
url: `${client.apiBaseUrl}/files/${fileId}`,
fetchImpl: fetchWithAuth,
requestInit: {
headers: {
Authorization: `Bearer ${client.token}`,
},
},
filePathHint: fileId,
maxBytes: mediaMaxBytes,
});

View File

@@ -27,6 +27,7 @@ export type FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promis
type FetchMediaOptions = {
url: string;
fetchImpl?: FetchLike;
requestInit?: RequestInit;
filePathHint?: string;
maxBytes?: number;
maxRedirects?: number;
@@ -79,7 +80,16 @@ async function readErrorBodySnippet(res: Response, maxChars = 200): Promise<stri
}
export async function fetchRemoteMedia(options: FetchMediaOptions): Promise<FetchMediaResult> {
const { url, fetchImpl, filePathHint, maxBytes, maxRedirects, ssrfPolicy, lookupFn } = options;
const {
url,
fetchImpl,
requestInit,
filePathHint,
maxBytes,
maxRedirects,
ssrfPolicy,
lookupFn,
} = options;
let res: Response;
let finalUrl = url;
@@ -88,6 +98,7 @@ export async function fetchRemoteMedia(options: FetchMediaOptions): Promise<Fetc
const result = await fetchWithSsrFGuard({
url,
fetchImpl,
init: requestInit,
maxRedirects,
policy: ssrfPolicy,
lookupFn,