我尝试使用Firefox本机消息创建URL检查器。问题是,当本机应用程序发送判决时,onBeforeRequest监听器已经释放了请求,因此重定向不会发生。 你可以帮忙让我的分机等待最多2秒的回复并重新定位请求,如果答案是" 0"?
var port = browser.runtime.connectNative("ping_pong");
function inspectURL(requestDetails) {
console.log("Loading: <" + requestDetails.url + ">");
port.postMessage(requestDetails.url);
console.log("Posting complete <" + requestDetails.url + ">");
}
port.onMessage.addListener((response) = > {
console.log("Received: <" + response + ">");
if (response == "1")
{
console.log("Good url!!!");
}
else
{
console.log("BAD url - redirecting!!!");
return {
redirectUrl: "https://38.media.tumblr.com/tumblr_ldbj01lZiP1qe0eclo1_500.gif"
};
}
});
browser.webRequest.onBeforeRequest.addListener(
inspectURL,
{ urls: ["<all_urls>"] },
["blocking"]
);
答案 0 :(得分:1)
完全没有办法。从Firefox 52开始,可以看到this answer。 Chrome仍然无法实现。
Native Messaging是一种异步API。发布消息后,在您返回事件循环(例如,当前代码终止)之前,您将不会收到回复。
但是,阻止WebRequest API需要同步回复。这是一个核心限制,因为异步回复可能永远不会在不确定的延迟之后出现,并且网络堆栈不会等待这种情况发生。我的意思是,它可以,但API的设计故意禁止它。
基本上:即使回复已准备好,您的代码也会在inspectURL
终止之前收到,此时WebRequest已经继续执行请求。 There is no way in JavaScript使其同步。
答案 1 :(得分:1)
Firefox支持从Firefox 52开始的异步webRequest
阻止/修改侦听器。为此(MDN:webRequest
: Modifying requests(以及其他多个页面)):
从Firefox 52开始,侦听器可以返回Promise而不是返回
BlockingResponse
,而SO thread将使用BlockingResponse
进行解析。这使侦听器能够异步处理请求。
因此,在您的wrbRequest.onBeforeRequest
听众中,您会返回一个使用BlockingResponse
解决的承诺。
您需要存储已向port
请求提供信息的请求列表。 response
中的port
需要唯一标识其响应的请求。请记住,这都是异步的,因此您可以同时在飞行中拥有多个请求。您必须适当地跟踪这些并且仅resolve
适当的Promise。假设您port
的回复没有快速更改,您应该存储已经检查过的URL列表(包括好的和坏的),这样您就可以立即回复已经检查过的URL。
Chrome无法满足您的需求。您需要以其他方式解决问题。