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

时间:2017-09-19 22:04:44

标签: javascript firefox-webextensions chrome-native-messaging

我尝试使用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"]
);

2 个答案:

答案 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无法满足您的需求。您需要以其他方式解决问题。