我正在开发一个 FireFox 插件。我想每次发送带有 debug_source: "played_threshold_reached" 的 JSON 请求正文的 PUT Web 请求时,扩展都会使用相同的标头发送它,并且所有内容都完全相同 5 倍。
我为background.js尝试了以下代码:
console.log("Background script loaded");
function arrayBufferToString(buffer) {
const arr = new Uint8Array(buffer);
return String.fromCharCode.apply(null, arr);
}
browser.webRequest.onBeforeRequest.addListener(
async (details) => {
if (details.method === "PUT") {
try {
const requestBody = JSON.parse(arrayBufferToString(details.requestBody.raw[0].bytes));
if (requestBody.debug_source === "played_threshold_reached") {
console.log("Intercepted matching request!");
const repeatRequest = async () => {
const headers = {};
details.requestHeaders.forEach(header => {
headers[header.name] = header.value;
});
const response = await fetch(details.url, {
method: "PUT",
headers,
body: JSON.stringify(requestBody),
mode: "cors",
credentials: "same-origin"
});
if (!response.ok) {
console.error("Failed to resend request:", response.statusText);
}
};
for (let i = 0; i < 5; i++) {
console.log(`Sending request ${i + 1}`);
await repeatRequest();
}
}
} catch (error) {
console.error("Error processing request:", error);
}
}
},
{ urls: ["<all_urls>"] },
["requestBody", "blocking", "extraHeaders", "requestHeaders"]
);
问题是,我什至没有在开头看到“后台脚本已加载”日志!
这是manifest.json文件:
{
"manifest_version": 2,
"name": "Request Repeater",
"version": "1.0",
"permissions": [
"webRequest",
"webRequestBlocking",
"<all_urls>",
"storage"
],
"background": {
"scripts": ["background.js"],
"persistent": true
}
}
我确保我添加了 扩展名正确。
标题“如何通过 Firefox 扩展重新发送 Web 请求?”有点误导。它应该更像是“网络请求处理程序扩展未加载”,因为这是实际的问题。
我知道你问这个问题已经有一段时间了,所以也许你已经知道答案,但你说:
问题是,我什至没有在开头看到“后台脚本已加载”日志!
我没有调试您的代码,但是当我将其作为临时附加组件加载时,我确实将“后台脚本已加载”记录到控制台。确保您正在查看正确的控制台。在
about:debugging
> This Firefox
上,“检查”您的分机。这是后台记录控制台消息的控制台。
我要指出的另一件事是:
extraInfoSpec
的 addListener
参数没有有效的“extraHeaders”和“requestHeaders”值。如果您尝试使用这些值加载代码,则会出现未捕获的错误。该错误也显示在控制台中。
["requestBody", "blocking", "extraHeaders", "requestHeaders"]
应该只是
["requestBody", "blocking"]