繁体   English   中英

使用Firefox本机消息进行异步webRequest.onBeforeRequest URL检查

[英]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要求提供信息的要求。 来自portresponse需要唯一地标识它正在响应的请求。 请记住,这都是异步的,因此您可以同时运行多个请求。 您必须适当地跟踪这些,并且只能resolve适当的承诺。 假设来自port的响应没有快速变化,则应存储已检查的URL列表(好和坏),以便可以立即响应已检查的URL。

Chrome无法满足您的需求。 您将需要以其他方式解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM