[英]Asynchronous webRequest.onBeforeRequest URL inspection using Firefox native messages
我正在尝试使用Firefox本机消息创建URL检查器。 问题是,当本机应用程序发送判决时,onBeforeRequest侦听器已经释放了请求,因此不会发生重定向。 如果答案为“ 0”,您能否帮助我的分机等待最多2秒钟的答复并重定向请求?
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"]
);
根本没有办法。 从Firefox 52开始,请参阅此答案 。 在Chrome上仍然无法实现。
本机消息传递是异步API。 发布消息后,直到返回事件循环(例如,当前代码终止),您才会收到答复。
但是,阻止WebRequest API需要同步回复。 这是一个核心限制,因为异步应答可能永远不会来临或在不确定的延迟后出现,并且网络堆栈不会等待这种情况发生。 我的意思是,可以,但是API的设计故意禁止这样做。
基本上:即使回复准备就绪,您的代码也不会收到,直到inspectURL
终止为止,此时WebRequest已经继续执行请求。 JavaScript中没有办法使其同步。
从Firefox 52开始,Firefox支持异步webRequest
阻止/修改侦听器。 为此(MDN: webRequest
:修改请求 (和其他多个页面)):
从Firefox 52开始,侦听器可以返回Promise ,而不是返回
BlockingResponse
,而Promise可以使用BlockingResponse
解决。 这使侦听器能够异步处理请求。
因此,在wrbRequest.onBeforeRequest
侦听器中,您将返回一个Promise,并使用BlockingResponse
解决。
您将需要存储一份清单,这些清单是您从port
要求提供信息的要求。 来自port
的response
需要唯一地标识它正在响应的请求。 请记住,这都是异步的,因此您可以同时运行多个请求。 您必须适当地跟踪这些,并且只能resolve
适当的承诺。 假设来自port
的响应没有快速变化,则应存储已检查的URL列表(好和坏),以便可以立即响应已检查的URL。
Chrome无法满足您的需求。 您将需要以其他方式解决问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.