0

J'essaie de créer un inspecteur d'URL en utilisant des messages natifs de Firefox. Le problème est que lorsque l'application native envoie un verdict, onBeforeRequest listener a déjà libéré la requête, donc la redirection ne se produit pas. Pouvez-vous s'il vous plaît aider à faire attendre mon extension pour répondre jusqu'à 2 secondes et rediriger la demande si la réponse est "0"?Inspection d'URL utilisant des messages natifs de Firefox

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"] 
); 

Répondre

0

Il n'y a aucun moyen. La messagerie native est une API asynchrone. Après la publication d'un message, vous ne recevrez pas de réponse tant que vous ne retournerez pas à la boucle d'événements (par exemple, le code actuel se termine). Toutefois, le blocage de l'API WebRequest nécessite une réponse synchrone. Ceci est une limitation de base, car une réponse asynchrone peut ne jamais venir ou venir après un délai incertain, et la pile réseau n'attendra pas que cela se produise. Je veux dire, ça pourrait, mais le design de l'API l'interdit délibérément.

Fondamentalement: même si la réponse est prête, votre code ne la recevra pas tant que inspectURL ne se terminera pas, point auquel WebRequest poursuit déjà la demande. There is no way in JavaScript pour le rendre synchrone.

0

Firefox

Firefox supporte asynchrones webRequest blocage/écouteurs de modification de Firefox 52 en avant. Pour ce faire (MDN: webRequest: Modifying requests (et plusieurs autres pages)):

depuis Firefox 52 partir, au lieu de retourner BlockingResponse, l'auditeur peut retourner un Promise qui est résolu avec un BlockingResponse. Cela permet à l'écouteur de traiter la requête de manière asynchrone.

Ainsi, dans votre écouteur wrbRequest.onBeforeRequest, vous revenez d'une promesse que vous résoudre le BlockingResponse.

Vous aurez besoin de stocker une liste de demandes pour lesquelles vous avez demandé des informations à votre port. Le response de votre port doit identifier de manière unique la requête à laquelle il répond. Gardez à l'esprit que tout cela est asynchrone, de sorte que vous pouvez avoir plusieurs demandes en vol en même temps. Vous devez suivre correctement ces et seulement resolve la promesse appropriée. En supposant que vos réponses de votre port ne changent pas rapidement, vous devriez stocker une liste d'URL qui ont été vérifiées (bonnes et mauvaises), de sorte que vous pouvez répondre immédiatement aux URL qui ont déjà été vérifiées.

Chrome

Ce que vous désirez n'est pas possible dans Chrome. Vous devrez résoudre votre problème d'une autre manière.