Source code
Revision control
Copy as Markdown
Other Tools
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
import { EXIT_CODE } from "resource://gre/modules/BackgroundTasksManager.sys.mjs";
/*
* IMPORTANT! Keep the deserialized JSON format compatible with
* toolkit/crashreporter/client/app/src/net/http.rs
*/
async function createRequestInit(requestBuilder) {
switch (requestBuilder.type) {
case "MimePost": {
const formData = new FormData();
for (const part of requestBuilder.parts) {
let content = part.content;
const options = { type: part.mime_type ?? "" };
switch (content.type) {
case "File":
content = await File.createFromFileName(content.value, options);
break;
case "String":
content = new Blob([content.value], options);
break;
}
formData.append(part.name, content, part.filename);
}
return {
method: "POST",
body: formData,
};
}
case "Post": {
const body = requestBuilder.body;
const headers = requestBuilder.headers;
return {
method: "POST",
headers: Object.fromEntries(headers),
body: new Uint8Array(body),
};
}
}
throw new Error("invalid request builder format");
}
export async function runBackgroundTask(commandLine) {
const requestUrl = commandLine.getArgument(0);
const requestUserAgent = commandLine.getArgument(1);
const requestBuilderFilePath = commandLine.getArgument(2);
const requestBuilderFile = await File.createFromFileName(
requestBuilderFilePath
);
const requestBuilder = JSON.parse(await requestBuilderFile.text());
const requestInit = await createRequestInit(requestBuilder);
(requestInit.headers ??= {})["User-Agent"] = requestUserAgent;
const request = new Request(requestUrl, requestInit);
const response = await fetch(request);
if (!response.ok) {
console.error(
`Request failed: ${response.status} ${response.statusText}\n${await response.text()}`
);
return 1;
}
await IOUtils.write(requestBuilderFilePath, await response.bytes());
return EXIT_CODE.SUCCESS;
}