Je développe une petite extension Chrome pour un usage personnel sur un cas très spécifique (automatisation du site Web) mais j'ai un problème. Comment puis-je saisir une erreur réseau sur un script en arrière-plan et appeler une certaine fonction.
J'ai mis en œuvre cette méthode:
chrome.webRequest.onErrorOccurred.addListener( handleNetworkError, {urls: ["http://*/*", "https://*/*"] });
Il détecte certaines erreurs de réseau, de ce que je vois manly ::net
errors, DNS failing, networks changed etc.
Cependant, aujourd'hui, j'ai remarqué que les erreurs HTTP comme:
GET https://example.com 522 (Origin Connection Time-out)
N'a pas déclenché l'auditeur, comment puis-je fonctionner sur ceux-là aussi?
Avec l'aide de l'utilisateur @Xan, j'ai réussi à proposer ceci:
function extractStatus(line) { var match = line.match(/[^ ]* (\d{3}) (.*)/); if (match) return {code: match[1], message: match[2]}; else return undefined; } chrome.tabs.query({active: true, lastFocusedWindow: true }, function(tabsArray) { tab = tabsArray[0]; scope = {urls: ["https://example.com/*"], tabId: tab.id}; console.log("Listening for errors..."); // ::net errors chrome.webRequest.onErrorOccurred.addListener(handleNetworkError, scope); // HTTP errors chrome.webRequest.onHeadersReceived.addListener(function(details) { var status = extractStatus(details.statusLine); if (!status) return; if (status.code.charAt(0) == '5' || status.code.charAt(0) == '4') handleNetworkError(); }, scope); });
Je suppose que, du point de vue de la pile de réseau webRequest
/ Chrome, cette demande est effectivement terminée. Vous devez donc vous connecter à un autre événement, par exemple
function extractStatus(line) { var match = line.match(/[^ ]* (\d{3}) (.*)/); if(match) { return {code: match[1], message: match[2]}; } else { return undefined; } } chrome.webRequest.onHeadersReceived.addListener( function(details) { var status = extractStatus(details.statusLine); if(status) { // Do something based on status.code } }, {urls: ["<all_urls>"]} );
Notez que cet événement est en option bloquant: vous pouvez rediriger la demande si nécessaire.
Évidemment, cela créera beaucoup de travail pour votre extension; Dans l'extrait ci-dessus, l'auditeur ne bloque pas, mais si vous le faites bloquer, cela ralentira considérablement votre Chrome – utilisez-le uniquement lorsqu'il est absolument nécessaire et filtrez par URL s'il y a lieu.